如何在Python中加密并在Java中解密?
我正在尝试加密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
得到Exception in thread "main" java.security.InvalidKeyException: Illegal key size or default parameters
。 显然,我做错了什么。 但是什么?
您遇到问题的原因是因为安全策略将密钥大小限制为128位,并且您尝试使用256位密钥(需要Java密码术扩展(JCE)无限强度管辖权策略文件)。
看看这个讨论,你可能会注意到你有类似的问题。 我的机器上确实遇到了同样的问题。 更新安全策略后,我能够运行您的代码。 另外,我认为你应该进行以下更改c.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(new byte[16]));
您缺少CFB模式的初始化向量。 如果解密的值不正确,请检查初始化密钥的方式。
我强烈建议使用跨语言加密API。 我是Keyczar的忠实粉丝,它恰好有Java和Python库。 API简单如下:
public String encrypt(String data) public String decrypt(String data)
在Java和Python中 。
- 像’abc’和“abc”这样的Python 2字符串文字是ASCII。
- 像u’abc’和u“abc”这样的Python 2字符串文字是unicode。
- 像’abc’和“abc”这样的Python 3字符串文字是unicode。
- 像b’abc’和b“abc”这样的Python 3字符串文字是字节类型。
Java默认使用unicode,类似于Python 3。
对于中介语,可互操作的加密,您可以查看https://code.google.com/p/keyczar/ 。 在该页面上有一些简单的例子。
- 如何使用java解码用openssl aes-128-cbc编码的字符串?
- 基于AES-256密码的Java加密/解密
- 如何使用CBC实现Java 256位AES加密
- 在Java中使用AES-128进行加密
- 解密由.NET的RijndaelManaged使用Java加密的字节
- 想要使用带有32字节的AES 256 CBC,但它显示了java.security.InvalidAlgorithmParameterException
- AES-256 CBC在php中加密并在Java中解密,反之亦然
- 服务器(Java – Cipher)和客户端之间的AES(Javascript – CryptoJS)
- AES加密IV