评论

.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);
最后一次编辑于  2020-11-04  
点赞 3
收藏
评论

3 个评论

  • 青德
    青德
    2021-01-16

    为啥我折报错了。。。。

    System.Security.Cryptography.CryptographicException:“The computed authentication tag did not match the input authentication tag.”

    var gcm = new AesGcm(Encoding.UTF8.GetBytes(key));

                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);

    2021-01-16
    赞同
    回复 4
    • 北城以北
      北城以北
      2021-10-26
      怎么解决的?
      2021-10-26
      回复
    • 北城以北
      北城以北
      2021-10-26
      密钥出错了。。。解决了
      2021-10-26
      回复
    • 李盼
      李盼
      2023-05-03回复北城以北
      用这个密钥吗?
      2023-05-03
      回复
    • 梁嘉
      梁嘉
      2023-06-09回复李盼
      请问解决了嘛
      2023-06-09
      回复
  • A0~海阔天空🐳👈
    A0~海阔天空🐳👈
    2020-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

    2020-11-27
    赞同
    回复
  • AndroidWalletSDKDemo
    AndroidWalletSDKDemo
    发表于移动端
    2020-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);
    2020-11-14
    赞同
    回复
登录 后发表内容