Я хотел бы использовать 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 в качестве поставщика и решить мою проблему.
Я попробовал ваше решение, но все же получил ту же ошибку. Я не знал, что мне нужно установить параметр 'version'' javax.crypto.spec.RC5ParameterSpec' и попробовать пару случайных (0,1,2,3,5) int, но безрезультатно. Я все еще получаю InvalidAlghoritmParametersException. –
Надеюсь, я смогу проверить, когда вернусь домой. Это странно, я был уверен, что это было ошибкой. –