为了账号安全,请及时绑定邮箱和手机立即绑定

Python 和 Java AES/ECB/PKCS5 加密

Python 和 Java AES/ECB/PKCS5 加密

绝地无双 2021-08-19 21:39:23
爪哇版: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 base64from Crypto.Cipher import AESBLOCK_SIZE = 16  # Bytespad = 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 加密。有人可以知道如何修复它吗?
查看完整描述

1 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

您使用不同的加密密钥


在 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 和简单的密钥。


查看完整回答
反对 回复 2021-08-19
  • 1 回答
  • 0 关注
  • 334 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信