Python和java AES/ECB/PKCS5加密

Python和java AES/ECB/PKCS5加密,java,python,encryption,Java,Python,Encryption,JAVA版本: public class EncryptUtil { public static String AESEncode(String encodeRules, String content) { try { KeyGenerator keygen = KeyGenerator.getInstance("AES"); keygen.init(128, new SecureRandom(encodeRules.get

JAVA版本:

public class EncryptUtil {
    public static String AESEncode(String encodeRules, String content) {
        try {
            KeyGenerator keygen = KeyGenerator.getInstance("AES");
            keygen.init(128, new SecureRandom(encodeRules.getBytes()));
        SecretKey original_key = keygen.generateKey();
        byte[] raw = original_key.getEncoded();
        SecretKey key = new SecretKeySpec(raw, "AES");
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] byte_encode = content.getBytes("utf-8");
        byte[] byte_AES = cipher.doFinal(byte_encode);
        return new String(Base64.getEncoder().encode(byte_AES));
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (NoSuchPaddingException e) {
        e.printStackTrace();
    } catch (InvalidKeyException e) {
        e.printStackTrace();
    } catch (IllegalBlockSizeException e) {
        e.printStackTrace();
    } catch (BadPaddingException e) {
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
       return null;
   }

}
当我运行此代码时:

System.out.println(EncryptUtil.AESEncode("1234567812345678", python&java"));
我有:

V5FFUgDi7VZaJ0qGzDISoA==
PYTHON版本:

import base64

from Crypto.Cipher import AES

BLOCK_SIZE = 16  # Bytes
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * \
            chr(BLOCK_SIZE - len(s) % BLOCK_SIZE)
unpad = lambda s: s[:-ord(s[len(s) - 1:])]


class AESUtil:
    __BLOCK_SIZE_16 = BLOCK_SIZE_16 = AES.block_size

    def __init__(self, key):
         self.key = key

    def encrypt(self, raw):
        raw = pad(raw)
        cipher = AES.new(self.key, AES.MODE_ECB)
        return base64.b64encode(cipher.encrypt(raw))

    def decrypt(self, enc):
        enc = base64.b64decode(enc)
        cipher = AES.new(self.key, AES.MODE_ECB)
        return unpad(cipher.decrypt(enc))
我知道java默认使用AES/ECB/PKCS#5,但当我运行
encrypt
方法时:

cipher_text = AESUtil("1234567812345678").encryt('python&java')
获得:
b'3mjygpK1d7ThCRK98ssZhA=='

我在谷歌上找到了pad和unpad。 如何编辑PYTHON代码,使密码文本等于JAVA加密。
有人知道如何修复它吗?

您使用不同的加密密钥

在爪哇

System.out.println(EncryptUtil.AESEncode(“1234567812345678”,“python和java”)

参见代码:

KeyGenerator keygen = KeyGenerator.getInstance("AES");
keygen.init(128, new SecureRandom(encodeRules.getBytes()));
SecretKey original_key = keygen.generateKey();
byte[] raw = original_key.getEncoded();
如果打印
raw
密钥,您将获得
fd839759956ba4a47922e8ee7c902f52
(十六进制编码),这是加密密钥

如果要直接使用提供的密钥,则应使用

byte[] raw = encodeRules.getBytes(); 
// (assuming encodeRules has 16 bytes)
如何编辑PYTHON代码使密码文本等于JAVA加密

这很棘手。。您可以看一下,但是修复Java实现以创建所需的密钥更容易


不管我是否认为实现不够安全——使用ECB和简单密钥.< /P>@ E4C5没有IV指定,似乎使用ECB。实际上,最佳实践是显式指定模式

Cipher.getInstance(“AES/ECB/Pkcs5Padding”)您确定使用的是相同的密钥吗?(您能打印Java和Python中使用的密钥的编码值吗?)(使用“encodeRules”非常奇怪,IMHO)@gusto oops,getInstance(“AES/ECB/Pkcs5Padding”);这是我打算粘贴的!是的,我确定,两个键都是'1234567812345678'@gusto2I确定它们不是(请打印
raw
变量,这就是键)。提供
1234567812345678
作为参数,Java应用程序(请阅读代码)使用静态种子创建一个新的随机数,该种子不是随机数,但绝对不是您期望的字节数。如果要按原样使用密钥,可以使用
byte[]raw=encodeRules.getBytes()
(假设字符串有16个字节)。请注意,您的实现远不是加密的安全(ECB模式,简单密钥,…)您是对的,我犯了一个错误,我认为“1234567812345678”是密钥,java是我同事的代码,非常感谢much@ZeeBmChan:在这种情况下,告诉你的同事使用SecureRandom不是密码转换成密钥的方式(实现可能会在不同版本中更改)。使用加密哈希或PBKDF更可行(安全)。