Java AES/ECB/PKCS5Padding与.NET AesCryptoServiceProvider同密钥加密结果是否一致?
Java 8 AES/ECB/PKCS5Padding 与 .NET AesCryptoServiceProvider 加密结果一致性验证
我需要实现 Java 8 的 AES/ECB/PKCS5Padding 与 .NET 的 AesCryptoServiceProvider 加密兼容,在两者使用相同密钥的情况下加密同一数据。请问这两种方法是否会生成相同的加密结果?
Java 加密代码
public SecretKeySpec getSecretKeySpec() { if (secretKey != null){ return secretKey; } else { MessageDigest sha = null; try { byte[] key = masterKey.getBytes("UTF-8"); sha = MessageDigest.getInstance("SHA-256"); key = sha.digest(key); key = Arrays.copyOf(key, 16); secretKey = new SecretKeySpec(key, "AES"); return secretKey; } catch (NoSuchAlgorithmException e) { LOGGER.error("NoSuchAlgorithmException in getSecretKeySpec " , e); return null; } catch (UnsupportedEncodingException e) { LOGGER.error("UnsupportedEncodingException in getSecretKeySpec " , e); return null; } } } public String encrypt(String strToEncrypt) { try { secretKey = getSecretKeySpec(); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, secretKey); return Base64.getEncoder().encodeToString(cipher.doFinal(strToEncrypt.getBytes("UTF-8"))); } catch (Exception e) { LOGGER.error("Error while encrypting: " , e); } return null; }
.NET 加密代码
Dim key As Byte() = Encoding.UTF8.GetBytes(masterKey) Dim sha As New SHA256Managed() key = sha.ComputeHash(key) Array.Resize(key, 16) 'Using the AesCryptoServiceProvider Cryptography Class _aesCrypto = New AesCryptoServiceProvider() _aesCrypto.Mode = CipherMode.ECB _aesCrypto.BlockSize = 128 _aesCrypto.KeySize = 128 'KeySize for encryption mode ECB _aesCrypto.Key = key _aesCrypto.Padding = PaddingMode.PKCS7 Public Function EncryptAesCrypto(ByVal message As String) As String _crypto = _aesCrypto.CreateEncryptor(_aesCrypto.Key, nothing) Dim encrypted As Byte() = _crypto.TransformFinalBlock(Encoding.UTF8.GetBytes(message), 0, Encoding.UTF8.GetBytes(message).Length) _crypto.Dispose() Return System.Convert.ToBase64String(encrypted) End Function
结论:会生成相同的加密结果
两者的加密逻辑完全匹配,具体原因如下:
- 密钥生成逻辑一致:都将
masterKey按UTF-8编码转为字节数组,用SHA-256哈希后截取前16字节(128位)作为AES密钥。 - 加密参数匹配:加密模式均为ECB(无需初始化向量IV),块大小与密钥大小都是128位;Java的
PKCS5Padding与.NET的PKCS7Padding对于128位块的AES来说,填充规则完全兼容(PKCS5是PKCS7的子集)。 - 数据处理一致:明文都按UTF-8编码转字节数组,加密结果都用Base64编码输出。
只要masterKey和待加密明文完全相同,两者的加密结果就会一致。
内容的提问来源于stack exchange,提问作者cybersecguy
相关产品推荐
相关产品推荐

