2015-04-19 2 views
0

Я хотел бы использовать RC5-шифрование в своем приложении с другими размерами слов и круглыми номерами, чем по умолчанию. Я использовал this implementation as a provider, но когда я называю его я получаю:java.security.InvalidAlgorithmParameterException в реализации RC5

java.security.InvalidAlgorithmParameterException: Illegal parameters 
    at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1037) 
    at javax.crypto.Cipher.init(Cipher.java:1367) 
    at javax.crypto.Cipher.init(Cipher.java:1301) 
    at asymetric.cipher.RC5moje.encrypt(RC5moje.java:87) 
    at asymetric.cipher.RC5DES.main(RC5DES.java:25) 

Это мой код:

import de.flexiprovider.api.keys.SecretKey; 
import java.security.NoSuchAlgorithmException; 
import java.security.NoSuchProviderException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.crypto.Cipher; 
import javax.crypto.NoSuchPaddingException; 
import de.flexiprovider.core.FlexiCoreProvider; 
import de.flexiprovider.core.rc5.RC5KeyGenerator; 
import de.flexiprovider.core.rc5.RC5ParameterSpec; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.security.InvalidAlgorithmParameterException; 
import java.security.InvalidKeyException; 
import java.security.Security; 
import javax.crypto.CipherInputStream; 
import javax.crypto.CipherOutputStream; 

public class RC5moje { 

    private int roundNumer; 
    private int wordSize; 

    private SecretKey key; 
    private RC5ParameterSpec RC5params; 
    private Cipher rc5; 

    public RC5moje(int roundNumer, int wordSize) { 
     this.roundNumer = roundNumer; 
     this.wordSize = wordSize; 

     Security.addProvider(new FlexiCoreProvider()); 
     this.RC5params = new RC5ParameterSpec(roundNumer, wordSize); 
     try { 
      this.rc5 = Cipher.getInstance("RC5", "FlexiCore"); 
     } catch (NoSuchAlgorithmException ex) { 
      Logger.getLogger(RC5moje.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (NoSuchProviderException ex) { 
      Logger.getLogger(RC5moje.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (NoSuchPaddingException ex) { 
      Logger.getLogger(RC5moje.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     RC5KeyGenerator rC5KeyGenerator = new RC5KeyGenerator(); 
     this.key = rC5KeyGenerator.generateKey(); 

    } 

    public void encrypt(String inFile, String outFile) { 
     try { 

      rc5.init(Cipher.ENCRYPT_MODE, key, RC5params); 

      FileInputStream fis = new FileInputStream(inFile); 
      FileOutputStream fos = new FileOutputStream(outFile); 
      CipherOutputStream cos = new CipherOutputStream(fos, rc5); 

      byte[] block = new byte[8]; 
      int i; 
      while ((i = fis.read(block)) != -1) { 
       cos.write(block, 0, i); 
      } 
      cos.close(); 

     } catch (InvalidKeyException ex) { 
      Logger.getLogger(RC5moje.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (InvalidAlgorithmParameterException ex) { 
      System.out.println(ex.getMessage()); 
      Logger.getLogger(RC5moje.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (IOException ex) { 
      Logger.getLogger(RC5moje.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 

    public void decrypt(String inFile, String outFile) { 

     try { 
      rc5.init(Cipher.DECRYPT_MODE, key,RC5params); 

      FileInputStream fis; 

      fis = new FileInputStream(inFile); 

      FileOutputStream fos = new FileOutputStream(outFile); 
      CipherInputStream cis = new CipherInputStream(fis, rc5); 

      byte[] block = new byte[8]; 
      int i; 

      while ((i = cis.read(block)) != -1) { 
       fos.write(block, 0, i); 
      } 
      fos.close(); 
     } catch (InvalidKeyException ex) { 
      Logger.getLogger(RC5moje.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (FileNotFoundException ex) { 
      Logger.getLogger(RC5moje.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (IOException ex) { 
      Logger.getLogger(RC5moje.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

Я инициализировать этот класс, как это: RC5moje rc5 = new RC5moje(12, 32); , так что я думаю, что это не проблема со значениями поскольку они являются дефолтными, но, возможно, я неправильно создаю RC5Params?

EDIT: В источниках de.flexiprovider.core.rc5.RC5ParameterSpec я обнаружил, что вы не можете установить их неправильные значения:

public RC5ParameterSpec(int numRounds, int wordSize) { 
    if ((numRounds < 8) || (numRounds > 127)) { 
     this.numRounds = DEFAULT_NUM_ROUNDS; 
    } else { 
     this.numRounds = numRounds; 
    } 

    if ((wordSize != 16) && (wordSize != 32) && (wordSize != 64)) { 
     this.wordSize = DEFAULT_WORD_SIZE; 
    } else { 
     this.wordSize = wordSize; 
    } 
    } 

EDIT2: Таким образом, после смешиваясь с моим кодом I решил попробовать Bouncy Castle в качестве поставщика и решить мою проблему.

ответ

0

Вы используете специальный FlexiCore RC5ParameterSpec, попробуйте использовать Java JCA one instead.

+0

Я попробовал ваше решение, но все же получил ту же ошибку. Я не знал, что мне нужно установить параметр 'version'' javax.crypto.spec.RC5ParameterSpec' и попробовать пару случайных (0,1,2,3,5) int, но безрезультатно. Я все еще получаю InvalidAlghoritmParametersException. –

+0

Надеюсь, я смогу проверить, когда вернусь домой. Это странно, я был уверен, что это было ошибкой. –

Смежные вопросы