You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 20:03:09