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)
本文来自博客园,作者:vx_guanchaoguo0,转载请注明原文链接:https://www.cnblogs.com/guanchaoguo/p/17611999.html