我试图在Python程序中加密一些数据并将其保存,然后在Java程序中解密该数据。在Python中,我像这样加密它:

from Crypto.Cipher import AES
KEY = '12345678901234567890123456789012'

def encrypt(data):
    cipher = AES.new(KEY, AES.MODE_CFB)
    return cipher.encrypt(data)

在Java中,我将其解密为:
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;

public class Encryption {
    private static byte[] KEY = { '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7',
        '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2' };

    public static byte[] decrypt(byte[] data) throws NoSuchAlgorithmException, NoSuchPaddingException,
            InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
        Cipher c = Cipher.getInstance("AES/CFB/NoPadding");
        Key key = new SecretKeySpec(KEY, "AES");
        c.init(Cipher.DECRYPT_MODE, key);
        return c.doFinal(data);
    }
}

但是我得到Exception in thread "main" java.security.InvalidKeyException: Illegal key size or default parameters。显然,我做错了。但是呢

最佳答案

您遇到问题的原因是,由于安全策略将 key 大小限制为128位,并且您尝试使用256位 key (需要Java密码学扩展(JCE)无限强度管辖权策略文件)。

查看this的讨论,您可能会注意到您有类似的问题。我的机器上实际上有同样的问题。更新安全策略后,我能够运行您的代码。另外,我认为您应该进行以下更改c.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(new byte[16]));您缺少CFB模式的初始化 vector 。如果解密的值不正确,请检查初始化 key 的方式。

10-01 09:28
查看更多