得物开放平台.NET/C# 加解密方式[附源码]

443 阅读1分钟

第三方对接加解密系列

1. 得物开放平台.NET/C# 加解密方式[附源码]

2. 高德地图小程序OPENAPI 事件回调加解密工具.NET/C# 实现[附源码]

前言

在最近的得物开放平台加解密处理的过程中废了不少时间, 网上的代码也是各种各样, 最终终于测试出来了, 下面开放给有需要的同学.

加解密说明

AES加密模式:ECB
填充:PKCS5Padding, 对应C# PKCS7
数据块:128, C#默认的AES数据库就是128, 无需额外设置
注意:别的语言需要完成对key的处理 java中使用了SHA1PRNG , 这个对应的方法是SHA1哈希算法, 参考GetKey方法

其余语言参考
加密(从前往后):明文 -> 加密 -> base64处理 -> 密文
解密(从后往前):明文 <- 解密 <- base64处理 <- 密文

得物文档地址

open.dewu.com/#/doc?id=10…

测试代码

static void Main(string[] args)
{
    //明文
    string plainTxt = "{\"list\":[{\"applyItemNo\":\"JS570516000080113874\",\"applyNo\":\"AP1010015038937\",\"num\":1,\"orderNo\":\"110105115769884450\",\"skuId\":6039421775,\"sourceType\":\"PX_TYPE_NORMAL\",\"spuId\":1000108135}],\"originalMsgId\":2211713,\"type\":\"CONSIGN_RETURN_ON_SHELF\",\"appKey\":\"7e26470b56dd4d93a8063f1ecc76f986\",\"openId\":\"VGnFvRhQu6kwswmG\"}";
    // 密文
    var encryptedTxt = $"PR2ccpPboDC+cvnoMlyXOEDEgZhTNnB/HmQZHd+/ysw84BhdZ+658xLGkJbsLuC3cNj53pfp+bXBZeisxPk8lffj9XYAL0eDO7nUW5WWbimWk/ShaqyA5/0Y9ym+odylqs+HiDKCAlate/kvPuhT6E6BfAYDdCaRHqRz82f/qkq8sG3AtvdiiltaYX7T39ky3Q8jLSp7d3qOiwcfcA3jc7ICuWeEQibsZxtidq25VcsnQnOhoD3EwsSjxDUlo6GQ0QRs42aQdQf6wREjkdSt4PQPwSfetgCMLY5Hca9OsA3ru4qIU+fj4exJIuoGKmcQTd9Pps2Y/yiKrQsMBVkF+AQWo9if7w277aF7BKXoMyXwM6MhPXIyTrqkciUBNFGOB7YeHu9/ztqO9fcXpbiYu2YgwMkvdD3Y98hQwlEvXoI=";

    //密钥,64位
    string keys = "3f170f3943e8419c87ce4491a2b6492216f3c99a0fd14de18ae515e3c61e4214";

    //加密
    byte[] encryptBytes = AESEncryption.AESEncrypt(Encoding.UTF8.GetBytes(plainTxt), keys);
    Console.WriteLine($"加密测试结果: {Convert.ToBase64String(encryptBytes).Equals(encryptedTxt)}");

    //解密
    byte[] decryptBytes = AESEncryption.AESDecrypt(Convert.FromBase64String(encryptedTxt), keys);
    Console.WriteLine("解密结果:" + Encoding.UTF8.GetString(decryptBytes).Equals(plainTxt));
}

加解密算法代码

class AESEncryption
{
    /// <summary>
    /// AES加密算法
    /// </summary>
    /// <param name="plainText">明文字符串</param>
    /// <param name="strKey">密钥</param>
    /// <returns>返回加密后的密文字节数组</returns>
    public static byte[] AESEncrypt(byte[] inputByteArray, string strKey)
    {
        SymmetricAlgorithm algorithm = CreateAesAlgorithm(strKey);
        ICryptoTransform cTransform = algorithm.CreateEncryptor();
        return cTransform.TransformFinalBlock(inputByteArray, 0, inputByteArray.Length);
    }

    /// <summary>
    /// AES解密
    /// </summary>
    /// <param name="cipherText">密文字节数组</param>
    /// <param name="strKey">密钥</param>
    /// <returns>返回解密后的字符串</returns>
    public static byte[] AESDecrypt(byte[] cipherText, string strKey)
    {
        SymmetricAlgorithm algorithm = CreateAesAlgorithm(strKey);
        ICryptoTransform decryptor = algorithm.CreateDecryptor();
        return decryptor.TransformFinalBlock(cipherText, 0, cipherText.Length);
    }

    private static Aes CreateAesAlgorithm(string strKey)
    {
        var aes = Aes.Create();
        aes.Key = GetKey(strKey);
        aes.BlockSize = 128;
        aes.Mode = CipherMode.ECB;
        aes.Padding = PaddingMode.PKCS7;
        return aes;
    }

    public static byte[] GetKey(string aesKey)
    {
        using var sha1 = SHA1.Create();
        byte[] hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(aesKey));
        var rd = sha1.ComputeHash(hash);
        return rd.Take(16).ToArray();
    }
}

相关文章:

C#中流的读取方式总结

SymmetricAlgorithm加解密的方式