【发布时间】:2021-02-22 20:47:02
【问题描述】:
我正在实施以下步骤:
- Bob 使用 AES 加密消息
- Bob 将加密编码为 base64 字符串
- Bob 将字符串写入文件
- Alice 读取文件
- Alice 将字符串转换为字节
- Alice 解密消息
但是,我在最后一步失败了。
这是加密:
public void sendHelloWorld() {
String msg = "hello world!";
try {
SecretKeySpec AesKeySpec = new SecretKeySpec(aesKeyBytes, "AES");
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
c.init(Cipher.ENCRYPT_MODE, AesKeySpec);
aesEncryptedHello = c.doFinal(msg.getBytes());
} catch (BadPaddingException | InvalidKeyException | NoSuchPaddingException | IllegalBlockSizeException | NoSuchAlgorithmException e) {
e.printStackTrace();
}
String s = new String(aesEncryptedHello, StandardCharsets.UTF_8);
System.out.println("Message = " + s);
sendMessage(Base64.getEncoder().encodeToString(aesEncryptedHello));
}
这是解密:
public void decryptAESMessage(byte[] encryptedMessage) {
try {
String s = new String(encryptedMessage, StandardCharsets.UTF_8);
System.out.println("Message = " + s);
SecretKeySpec AesKeySpec = new SecretKeySpec(bobAesKey, "AES");
Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding");
c.init(Cipher.DECRYPT_MODE, AesKeySpec);
byte[] aesMessage = c.doFinal(encryptedMessage);
String message = new String(aesMessage, StandardCharsets.UTF_8);
System.out.println("Message is " + message);
} catch (BadPaddingException | InvalidKeyException | NoSuchPaddingException | IllegalBlockSizeException | NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
这是写入文件的内容:
public void sendMessage(String msg) {
try {
FileWriter myWriter = new FileWriter(<myredactedfilepath>);
myWriter.write(msg);
myWriter.close();
} catch (IOException e) {
System.out.println("An error occurred.");}
}
这里是第 5 阶段,只是为了表明没有错过解码:
alice.decryptAESMessage(Base64.getDecoder().decode(alice.readEncryptedMessage()));
我在两端打印密钥和加密消息,它们匹配。
【问题讨论】:
-
加密
AES/CBC/PKCS5Padding并且 IV 丢失。解密AES/ECB/PKCS5Padding使 ECB(请不要)或 CBC 都提供 IV 并附加到密文的开头。在解密期间解决它并使用它。这个网站上有很多这样的例子。 -
@kelalaka nooooo,不敢相信我花了这么长时间却没有注意到这一点。谢谢
-
可能还有一些其他的错误,我没有看起来那么deeoer...
-
不是这样,它现在可以正常工作了
-
在这种情况下,您可以写下您的问题的答案。
标签: java encryption cryptography base64 aes