gpt4 book ai didi

java - 使用 RSA 加密字符串并将 Java 中的 key 封装到文件中

转载 作者:行者123 更新时间:2023-12-01 19:56:55 25 4
gpt4 key购买 nike

我正在尝试加密两个不同文件中的一些信息,第一个文件使用 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_MODEDECRYPT_MODE 中。

只需为 Cipher 对象的每次不同使用调用 Cipher.getInstance() 即可。除非您确实在做一些非常奇怪(并且可能是错误的)的事情,否则该调用的开销在您的程序中将是微不足道的。

关于java - 使用 RSA 加密字符串并将 Java 中的 key 封装到文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49324227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com