评论

.NET CORE接入微信支付V3接口遇到的平台证书AEAD_AES_256_GCM解密问题

.NET CORE 3.1 AEAD_AES_256_GCM解密微信平台证书

对接微信支付V3的接口,可以算是从1开始踩坑,多的不说,先记录一下这个平台证书的问题。

在拿到这个AEAD_AES_256_GCM加密后的证书内容,需要去做解密,这个时候很尴尬的,微信这边仅仅提供了php和java版本的。

而我是.NET CORE3.1版本的

找了半天资料,很容易发现有一个类可以实现AESGCM的加解密:AesGcm

Decrypt(byte[] nonce, byte[] ciphertext, byte[] tag, byte[] plaintext, byte[] associatedData = null)

可以看到需要提供这么几个参数

其中关于tag,微信文档也没用明确提出应该怎么去获取,最终找遍了全网都没发现有文章说怎么获取。

于是乎只有参考一下微信提供的php示例以及java示例

看了java示例没有发现有tag的存在,最终在php示例里边找到了tag的获取方式


tag的获取方式:

在进行base64解码后,证书密文是证书密文长度-16,tag=证书密文最后16个字节

            var gcm = new AesGcm(Encoding.UTF8.GetBytes("APIV3密钥"));
            byte[] cipherTextBytes = Convert.FromBase64String("平台证书ciphertext字段");
            byte[] nonce = Encoding.UTF8.GetBytes("平台证书nonce字段");
            byte[] ciphertext = cipherTextBytes.Take(cipherTextBytes.Length - 16).ToArray();
            byte[] plaintext = new byte[ciphertext.Length];
            byte[] tag = cipherTextBytes.Skip(ciphertext.Length).Take(16).ToArray();
            byte[] associatedData = Encoding.UTF8.GetBytes("平台证书associated_data字段");
            gcm.Decrypt(nonce, ciphertext, tag, plaintext, associatedData);
            string text = Encoding.UTF8.GetString(plaintext);
最后一次编辑于  11-04  
点赞 2
收藏
评论

2 个评论

  • A0~海阔天空🐳👈
    A0~海阔天空🐳👈
    11-27

    感谢大佬啊,终于找到解决方案了,如果是使用mac的小伙伴,还需要注意 openssl的问题。具体参考如下:


    Resolving missing link to libcrypto openssl on OSX from: http://stackoverflow.com/questions/38670295/brew-refusing-to-link-openssl

    brew update

    brew install openssl

    ln -s /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib /usr/local/lib/

    ln -s /usr/local/opt/openssl/lib/libssl.1.0.0.dylib /usr/local/lib/

    参考链接:

    https://blog.bokan.io/posts/aesccm-and-aesgcm-in-dotnet-core-on-macos-catalina/

    https://gist.github.com/aklap/e885721ef15c8668ed0a1dd64d2ea1a7

    11-27
    赞同
    回复
  • 回归自然
    回归自然
    11-14
    var gcm = new AesGcm(Encoding.UTF8.GetBytes("APIV3密钥")); byte[] cipherTextBytes = Convert.FromBase64String("平台证书ciphertext字段"); byte[] nonce = Encoding.UTF8.GetBytes("平台证书nonce字段"); byte[] ciphertext = cipherTextBytes.Take(cipherTextBytes.Length - 16).ToArray(); byte[] plaintext = new byte[ciphertext.Length]; byte[] tag = cipherTextBytes.Skip(ciphertext.Length).Take(16).ToArray(); byte[] associatedData = Encoding.UTF8.GetBytes("平台证书associated_data字段"); gcm.Decrypt(nonce, ciphertext, tag, plaintext, associatedData); string text = Encoding.UTF8.GetString(plaintext);
    11-14
    赞同
    回复
登录 后发表内容