JAVA ASE 默认随机 sha1 key加密 转为 Python

使用原始的方法

public static String EncryptEncode(String content, String encryptKey) throws Exception {
        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
        SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
        random.setSeed(encryptKey.getBytes());
        keyGenerator.init(128, random);
        SecretKey originalKey = keyGenerator.generateKey();
        byte[] rawByte = originalKey.getEncoded();
        SecretKey secretKey = new SecretKeySpec(rawByte, "AES");
        Cipher cipher = Cipher.getInstance("AES"); // AES/ECB/PKCS5Padding
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] byteEncode = content.getBytes("utf-8");
        byte[] bytesAes = cipher.doFinal(byteEncode);
        return new String((new BASE64Encoder()).encode(bytesAes));
    }

    public static String DecryptDecode(String content, String encryptKey) throws Exception {
        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
        SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
        random.setSeed(encryptKey.getBytes());
        keyGenerator.init(128, random);
        SecretKey originalKey = keyGenerator.generateKey();
        byte[] byteArray = originalKey.getEncoded();
        SecretKey secretKey = new SecretKeySpec(byteArray, "AES");
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] byteContent = (new BASE64Decoder()).decodeBuffer(content);
        byte[] byteEncode = cipher.doFinal(byteContent);
        return new String(byteEncode, StandardCharsets.UTF_8);
    }

使用 hutools

public static String invokeEncryptEncode(String content, String encryptKey) throws NoSuchAlgorithmException {
        SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
        random.setSeed(encryptKey.getBytes());
        byte[] keyBytes = new byte[16];
        random.nextBytes(keyBytes);
        AES aes = SecureUtil.aes(keyBytes);
        byte[] encryptedBytes = aes.encrypt(content.getBytes());
        return Base64Encoder.encode(encryptedBytes);
    }

    public static String invokeDecryptDecode(String encryptedContent, String encryptKey) throws NoSuchAlgorithmException {
        SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
        random.setSeed(encryptKey.getBytes());
        byte[] keyBytes = new byte[16];
        random.nextBytes(keyBytes);
        AES aes = SecureUtil.aes(keyBytes);
        byte[] encryptedBytes = Base64Decoder.decode(encryptedContent);
        byte[] decryptedBytes = aes.decrypt(encryptedBytes);
        return new String(decryptedBytes);
    }

python

  • 注意先卸载掉 原来的版本
 pip uninstall crypto  
 pip uninstall pycryptodome
  • 如在代码
def encrypt(content, encrypt_key):
    return base64.b64encode(
        AES.new(bytes.fromhex(key), AES.MODE_ECB).encrypt(pad(content.encode(), AES.block_size))).decode()
def decrypt(content, encrypt_key):
    return unpad(AES.new(bytes.fromhex(key), AES.MODE_ECB).decrypt(base64.b64decode(content)), AES.block_size).decode()

注意事项

  • python 不存在 sha1 伪随机种子 即 SHA1PRNG
  • 代替思路为先使用 Java 生成随机种子然后获取16字节的安全随机字节数组
  • 将16字节的安全随机字节数组 转为 16 进制字符串
  • 在 使用 python 将 16 进制字符串 字节数组

Java 转换方式

SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
        random.setSeed("EsbSecret@2019".getBytes());
        byte[] keyBytes = new byte[16];
        random.nextBytes(keyBytes);

        String hexString = HexUtil.encodeHexStr(keyBytes);
        System.out.println(hexString);

python 转为字节数组

bytes.fromhex(key)
posted @ 2023-08-07 17:25  vx_guanchaoguo0  阅读(94)  评论(0编辑  收藏  举报