说明
当查询返回一些敏感信息时,这些信息会被加密处理,这时需要进行解密处理!
### 如何判断字段需要解密
一般被加密的字段返回值是Base64
格式,字段在描述中备注需要解密
### 解密方式
数据采用AES
加解密,关键信息请查看表格:
信息 | 说明 |
---|---|
密钥(UTF-8) | infoexchange4api |
向量(UTF-8) | activevector4api |
编码 | Base64 |
位数 | 128位 |
模式 | CBC |
填充 | Pkcs7/Pkcs5 |
示例代码
C#示例
/// <summary>
/// 使用 AES 算法解密值。
/// </summary>
/// <param name="value">要解密的加密值。</param>
/// <param name="key">加密密钥</param>
/// <param name="iv">初始化向量</param>
/// <returns>解密后的值作为字符串。</returns>
public static string AesDecrypt(string value, string key, string iv)
{
// 检查输入值是否为空或 null,如果是,则原样返回
if (string.IsNullOrEmpty(value)) return value;
// 验证密钥
if (key == null) throw new Exception("未设置加密密钥。");
if (key.Length < 16) throw new Exception("指定的密钥长度不能少于16位。");
if (key.Length > 32) throw new Exception("指定的密钥长度不能多于32位。");
if (key.Length != 16 && key.Length != 24 && key.Length != 32)
throw new Exception("指定的密钥长度不明确。");
// 如果提供了 IV,则验证 IV 的长度
if (!string.IsNullOrEmpty(iv) && iv.Length < 16)
throw new Exception("指定的初始化向量长度不能少于16位。");
// 将密钥转换为字节数组
var keyBytes = Encoding.UTF8.GetBytes(key);
// 将经 Base64 编码的加密值转换为字节数组
var encryptedBytes = Convert.FromBase64String(value);
// 创建 RijndaelManaged 类的新实例
using (var aes = new RijndaelManaged())
{
// 设置 IV,使用提供的值或密钥的前 16 个字符
aes.IV = !string.IsNullOrEmpty(iv) ? Encoding.UTF8.GetBytes(iv) : keyBytes.Take(16).ToArray();
// 设置加密密钥
aes.Key = keyBytes;
// 设置 Cipher Mode 为 CBC(Cipher Block Chaining)
aes.Mode = CipherMode.CBC;
// 设置 Padding Mode 为 PKCS7
aes.Padding = PaddingMode.PKCS7;
// 创建解密器
var cryptoTransform = aes.CreateDecryptor();
// 将加密字节数组转换回原始形式
var resultArray = cryptoTransform.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length);
// 将结果字节数组转换为 UTF-8 编码的字符串
return Encoding.UTF8.GetString(resultArray);
}
}
作者:mry 创建时间:2024-10-24 09:01
更新时间:2024-10-24 11:29
更新时间:2024-10-24 11:29