猿问

Python 和 Java AES/ECB/PKCS5 加密

爪哇版:


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==

蟒蛇版本:


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))



我知道java默认使用AES/ECB/PKCS#5,但是当我运行该encrypt方法时:


cipher_text = AESUtil("1234567812345678").encryt('python&java')

得到了:b'3mjygpK1d7ThCRK98ssZhA=='


我在 Google 上找到了 pad 和 unpad。如何编辑我的 PYTHON 代码使 cipher_text 等于 JAVA 加密。有人可以知道如何修复它吗?


绝地无双
浏览 335回答 1
1回答

繁星点点滴滴

您使用不同的加密密钥在 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 代码使 cipher_text 等于 JAVA 加密这很棘手..您可能看看SecureRandom是如何工作的,但恕我直言,修复 Java 实现以创建您期望的密钥更容易不管我认为实现不够安全 - 使用 ECB 和简单的密钥。
随时随地看视频慕课网APP

相关分类

Java
我要回答