如何用Python加密,用Java解密?

如何用Python加密,用Java解密?,java,python,encryption,aes,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) import java.security.*;

我试图在Python程序中加密一些数据并保存下来,然后在Java程序中解密这些数据。在Python中,我对其进行如下加密:

from Crypto.Cipher import AES
KEY = '12345678901234567890123456789012'

def encrypt(data):
    cipher = AES.new(KEY, AES.MODE_CFB)
    return cipher.encrypt(data)
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);
    }
}
在Java中,我将其解密如下:

from Crypto.Cipher import AES
KEY = '12345678901234567890123456789012'

def encrypt(data):
    cipher = AES.new(KEY, AES.MODE_CFB)
    return cipher.encrypt(data)
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);
    }
}

但是我在线程“main”java.security.InvalidKeyException中得到了
异常:非法的密钥大小或默认参数
。很明显,我做错了什么。但是什么呢?

我强烈建议使用跨语言加密API来实现这一点。我是Java的忠实粉丝,它恰好有Java和Python库。该API非常简单,如下所示:

public String encrypt(String data)
public String decrypt(String data)
在和中。

  • Python2字符串文字,如“abc”和“abc”是ASCII
  • Python2字符串文字,如u'abc'和u“abc”是unicode
  • Python3字符串文字,如“abc”和“abc”是unicode
  • Python3字符串文本,如b'abc'和b“abc”是字节类型
Java默认使用unicode,类似于Python 3


对于中介语、可互操作的加密,您可以查看。该页面上有使用它的简单示例。

出现问题的原因是安全策略将密钥大小限制为128位,并且您试图使用256位密钥(需要Java加密扩展(JCE)无限强度权限策略文件)


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

“Java默认使用unicode”会产生误导。在内部,Java将字符串存储为UTF-16,但Java假定的“默认”编码完全依赖于平台。您是否有合适的JAR来支持更高强度的加密?默认情况下,java不允许使用强键。您的错误与python端无关,而与您试图使用的密钥有关。看看Mohamed Mansourtry的答案,用一个简单的小钥匙,看看它是否仍然发生。我看不到在KeyCzar中有任何方法可以将字符串变成钥匙。您是否必须编写自己的类来完成此任务?文档似乎假设您创建了本地文件,但没有提到密钥交换,关键是KeyCzar为您管理密钥。为什么你认为有必要把一个字符串变成一个键?你想在KeyCzar中使用现有的密钥吗?我放弃了在Android应用程序中使用KeyCzar。甚至我想把字符串转换成键。我假设没有办法在小程序中使用无限制强度的权限策略文件,是吗?那么你可能必须使用BouncyCastle。这是一个非常受欢迎的选择。