我正在尝试加密两个不同文件中的一些信息,第一个文件使用 AES 加密的字符串,第二个文件使用 RSA 加密的 key ,但我在使其工作时遇到了一些麻烦。
这是我的方法:
public synchronized static void encrypToFile(KeyPair clauPublicaPrivada, SecretKey clauSecretaSimetrica) {
String dades = null;
byte[][] encWrappedData = new byte[2][];
byte[] dadesAEncriptarEnByte;
dades = extreureRutesDB();
dadesAEncriptarEnByte = dades.getBytes();
try {
try {
File file = new File(FITXER_DADES_TRIPULANTS_XIFRADES_AES128);
File file2 = new File(FITXER_DADES_TRIPULANTS_XIFRADES_AES128_CLAUS);
boolean fvar = file.createNewFile();
boolean fvar2 = file2.createNewFile();
if (fvar2) {
System.out.println("File2 has been created successfully");
} else {
System.out.println("File2 already present at the specified location");
}
if (fvar) {
System.out.println("File1 has been created successfully");
} else {
System.out.println("File1 already present at the specified location");
}
} catch (IOException e) {
System.out.println("Exception Occurred:");
e.printStackTrace();
}
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec iv = new IvParameterSpec(IV_PARAM);
cipher.init(Cipher.ENCRYPT_MODE, clauSecretaSimetrica, iv);
encWrappedData[0] = cipher.doFinal(dadesAEncriptarEnByte);
cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
PublicKey clauPublica = clauPublicaPrivada.getPublic();
cipher.init(Cipher.WRAP_MODE, clauPublica);
encWrappedData[1] = cipher.wrap(clauSecretaSimetrica);
CipherOutputStream cos = new CipherOutputStream(new FileOutputStream(FITXER_DADES_TRIPULANTS_XIFRADES_AES128), cipher);
cos.write(encWrappedData[0]);
cos.close();
cos = new CipherOutputStream(new FileOutputStream(FITXER_DADES_TRIPULANTS_XIFRADES_AES128_CLAUS), cipher);
cos.write(encWrappedData[1]);
cos.close();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
System.out.println("menu 21(): FINAL");
}
}
问题是,当我运行它时,我收到此错误:
java.lang.IllegalStateException:密码未初始化用于加密/解密
知道我做错了什么以及如何解决它吗?
最佳答案
为不同目的重复使用相同的Cipher
变量是糟糕的编程实践并且令人困惑,并导致您出现这些错误。在调用 doWrap()
之前,您上次将 cipher
实例保留在 WRAP_MODE
中。然后,您向 CipherOutputStream 构造函数提供相同的实例。这些要求 cipher
对象处于 ENCRYPT_MODE
或 DECRYPT_MODE
中。
只需为 Cipher 对象的每次不同使用调用 Cipher.getInstance()
即可。除非您确实在做一些非常奇怪(并且可能是错误的)的事情,否则该调用的开销在您的程序中将是微不足道的。
关于java - 使用 RSA 加密字符串并将 Java 中的 key 封装到文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49324227/