如何在.Net Core实现AES/CBC/PKCS5Padding加密 求对接华为云SASS示例代码
.NET Core AES/CBC/PKCS5Padding 加密实现(适配华为云SaaS对接)
- .NET 框架内置
PaddingMode.PKCS7与要求的 PKCS5Padding 填充规则完全兼容,可直接使用,无需自定义填充逻辑 - 密钥长度需与华为云分配的一致:128位对应16字节、192位对应24字节、256位对应32字节
- IV向量固定为16字节,需严格遵循华为云对接规则生成,若要求随机IV需将加密使用的IV随密文一同传递给华为云
完整工具类实现
using System.Security.Cryptography; using System.Text; public static class AesCbcPkcs5Util { /// <summary> /// AES/CBC/PKCS5Padding 加密 /// </summary> /// <param name="plainText">待加密明文</param> /// <param name="key">加密密钥</param> /// <param name="iv">加密向量</param> /// <returns>Base64格式密文</returns> public static string Encrypt(string plainText, byte[] key, byte[] iv) { using var aesAlg = Aes.Create(); aesAlg.Mode = CipherMode.CBC; aesAlg.Padding = PaddingMode.PKCS7; // 对应要求的PKCS5Padding aesAlg.Key = key; aesAlg.IV = iv; var encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV); using var msEncrypt = new MemoryStream(); using var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write); using (var swEncrypt = new StreamWriter(csEncrypt, Encoding.UTF8)) { swEncrypt.Write(plainText); } return Convert.ToBase64String(msEncrypt.ToArray()); } /// <summary> /// AES/CBC/PKCS5Padding 解密 /// </summary> /// <param name="cipherText">Base64格式密文</param> /// <param name="key">解密密钥</param> /// <param name="iv">解密向量</param> /// <returns>解密后明文</returns> public static string Decrypt(string cipherText, byte[] key, byte[] iv) { using var aesAlg = Aes.Create(); aesAlg.Mode = CipherMode.CBC; aesAlg.Padding = PaddingMode.PKCS7; aesAlg.Key = key; aesAlg.IV = iv; var decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV); using var msDecrypt = new MemoryStream(Convert.FromBase64String(cipherText)); using var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read); using var srDecrypt = new StreamReader(csDecrypt, Encoding.UTF8); return srDecrypt.ReadToEnd(); } /// <summary> /// 密钥/IV为UTF-8字符串时调用此方法转字节数组 /// </summary> public static byte[] GetUtf8Bytes(string input) => Encoding.UTF8.GetBytes(input); /// <summary> /// 密钥/IV为十六进制字符串时调用此方法转字节数组 /// </summary> public static byte[] HexStringToBytes(string hex) { var bytes = new byte[hex.Length / 2]; for (var i = 0; i < bytes.Length; i++) { bytes[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16); } return bytes; } }
调用示例
// 示例参数,实际使用时替换为华为云分配的密钥、IV var key = AesCbcPkcs5Util.GetUtf8Bytes("你的16/24/32位长度密钥"); var iv = AesCbcPkcs5Util.GetUtf8Bytes("你的16位长度IV向量"); // 加密 var plainText = "待加密的接口请求内容"; var cipherText = AesCbcPkcs5Util.Encrypt(plainText, key, iv); Console.WriteLine($"加密后密文:{cipherText}"); // 解密 var decryptedText = AesCbcPkcs5Util.Decrypt(cipherText, key, iv); Console.WriteLine($"解密后明文:{decryptedText}");
对接华为云SaaS校验说明:
- 明文编码固定使用UTF-8,避免中文内容编码不一致导致加密结果不匹配
- 若华为云要求返回十六进制格式密文,将加密方法中
Convert.ToBase64String替换为字节数组转十六进制逻辑即可- 随机IV场景下,需确保加密时使用的IV与传递给华为云的IV完全一致
内容的提问来源于stack exchange,提问作者wangyou
相关产品推荐
相关产品推荐

