gpt4 book ai didi

java - RSA解密打印NULL

转载 作者:行者123 更新时间:2023-12-01 14:38:47 26 4
gpt4 key购买 nike

我相信我做得对。我如何看待使用 RSA 解密文件:

  1. 将文件的每一行作为字符串读入
  2. 设置cipher.init(Cipher.DECRYPT_MODE, privateKey)
  3. 使用 Hex.decodeHex(String.toCharArray()) 将字符串转换为 char[]
  4. 最后做cipher.doFinal(x)

这听起来正确吗?我正在这样做,但它不起作用,DecryptedFile.txt 只是 2 行“null”。

我能够使用几乎相同的过程进行加密,但显然使用 cipher.init(Cipher.ENCRYPT_MODE, publicKey)

这是我的代码

try {
BufferedReader inStream = new BufferedReader (new FileReader(cryptoFile));

int k = 0;

fileContents.add(inStream.readLine());

while(fileContents.get(k) != null) {
k++;
fileContents.add(inStream.readLine());
}

inStream.close();

try {

PrivateKey privateKey = kp.getPrivate();
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);

int j = 0;

while(fileContents.get(j) != null) {

String text = fileContents.get(j);

try {
x = Hex.decodeHex(text.toCharArray());
y = cipher.doFinal(x);
} catch (DecoderException ex) {
Logger.getLogger(Crypto.class.getName()).log(Level.SEVERE, null, ex);
}

try (PrintWriter file = new PrintWriter(
new BufferedWriter(
new FileWriter("DecryptedFile.txt", true)))) {
file.println(y);
} catch (IOException e) {
System.err.println("IOERROR: " + e.getMessage() + "\n");
}

j++;
}

} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException ex) {
Logger.getLogger(Crypto.class.getName()).log(Level.SEVERE, null, ex);
}

} catch (FileNotFoundException e) {
System.err.println("IOERROR: File NOT Found: " + cryptoFile + "\n");
} catch ( IOException e ) {
System.err.println("IOERROR: " + e.getMessage() + "\n");
} finally {
messagePane.setText(messagePane.getText() + "\n\n"
+ cryptoFile + "is done being decrypted.");
messagePane.setText(messagePane.getText() + "\n"
+ "Decrypted file saved to \'DecryptedFile.txt\'.");

cryptoFile = "";
pathTextField.setText(cryptoFile);
encryptButton.setEnabled(false);
decryptButton.setEnabled(false);

}

最佳答案

您正在从 FileContents 派生的字符串派生的字符数组上使用密码 - 这可能会搞砸其编码。相反,从文件中读取字节数组并将其用作密码的输入。

如有必要,最好填充输入 - 使用 Cipher.getInstance("RSA/ECB/PKCS1Padding")

将字符串转换为字节时,始终指定字符编码(例如 str.getBytes("UTF-8")),反之亦然 - 不同的 JVM 使用不同的默认字符编码。

关于java - RSA解密打印NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16204906/

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