java - 如何在 Python 中加密并在 Java 中解密?

标签 java python encryption aes

我正在尝试在 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 的方式。

关于java - 如何在 Python 中加密并在 Java 中解密?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10440777/

相关文章:

Java:在字符串数组中查找字符串的一部分并创建一个新数组

java - 如何在文本字段中包含 'some' 文本时禁用按钮,并在该文本在文本字段中消失时重新启用它们

java - J2ME 中存储数据的文件

c# - 正确存储和检索服务帐户的密码?

encryption - 从 RSA 中的 n、e、p、q 计算 d?

file - Python将文本文件读取为二进制文件?

java - 使用 RestTemplate 异常处理的 Spring 端点到端点

python - python中的唯一排序

python - 使用 Python 绘制蝴蝶曲线

python - 如何在 Python 中将列表作为函数的输入传递