使用AES-CFB在python中加密并在Java中解密

我的问题是,我无法在Java中正确解密。尽管使用了正确的密钥和IV,解密后我仍然得到垃圾字符。我在Java中没有任何编译/运行时错误或异常,因此我相信我使用正确的参数进行解密。

Python加密代码-

from Crypto.Cipher import AES

import base64

key = '0123456789012345'

iv = 'RandomInitVector'

raw = 'samplePlainText'

cipher = AES.new(key,AES.MODE_CFB,iv)

encrypted = base64.b64encode(iv + cipher.encrypt(raw))

Java解密代码-

private static String KEY = "0123456789012345";

public static String decrypt(String encrypted_encoded_string) throws NoSuchAlgorithmException, NoSuchPaddingException,

InvalidKeyException, IllegalBlockSizeException, BadPaddingException {

String plain_text = "";

try{

byte[] encrypted_decoded_bytes = Base64.getDecoder().decode(encrypted_encoded_string);

String encrypted_decoded_string = new String(encrypted_decoded_bytes);

String iv_string = encrypted_decoded_string.substring(0,16); //IV is retrieved correctly.

IvParameterSpec iv = new IvParameterSpec(iv_string.getBytes());

SecretKeySpec skeySpec = new SecretKeySpec(KEY.getBytes("UTF-8"), "AES");

Cipher cipher = Cipher.getInstance("AES/CFB/NoPadding");

cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);

plain_text = new String(cipher.doFinal(encrypted_decoded_bytes));//Returns garbage characters

return plain_text;

} catch (Exception e) {

System.err.println("Caught Exception: " + e.getMessage());

}

return plain_text;

}

有什么明显的我想念的东西吗?

回答:

的操作的密码反馈(CFB)模式是模式家族。它由段大小(或寄存器大小)参数化。PyCrypto的默认段大小为8位,而Java(实际上是OpenJDK)的默认段大小与块大小相同(AES为128位)。

如果要在pycrypto中使用CFB-128,可以使用AES.new(key, AES.MODE_CFB, iv,

segment_size=128)。如果要使用Java中的CFB-8,可以使用Cipher.getInstance("AES/CFB8/NoPadding");


现在我们已经解决了这个问题,您还有其他问题:

  • 始终指定要使用的字符集,因为它可以在不同的JVM之间更改:new String(someBytes, "UTF-8")someString.getBytes("UTF-8")。当您这样做时,请保持一致。

  • 切勿使用字符串存储二进制数据(new String(encrypted_decoded_bytes);)。您可以直接复制字节:IvParameterSpec iv = new IvParameterSpec(Arrays.copyOf(encrypted_decoded_bytes, 16));cipher.doFinal(Arrays.copyOfRange(encrypted_decoded_bytes, 16, encrypted_decoded_bytes.length))

  • 在Java中,您假设IV是在密文之前编写的,然后一起编码,但是在Python中,您永远不会对IV进行任何操作。我猜您发布的代码不完整。

  • 如果密钥保持不变,则CFB模式每次使用 IV 至关重要。如果不为每种加密更改IV,您将创建一个多重时间垫,攻击者即使不知道密钥也可以推断出明文。

以上是 使用AES-CFB在python中加密并在Java中解密 的全部内容, 来源链接: utcz.com/qa/414402.html

回到顶部