hxdxly 2024-08-15 17:13 采纳率: 0%
浏览 15
已结题

.net中SM3withSM2签名的问题

现在对接一个第三方支付,使用.net对方再发起请求时需要用SM3withSM2把请求的xml生成签名并一同请求,现在我的问题是一直签名不符,请给位提供完整的方法并指导我验证成功,私信加V提供公钥私钥,奖励x20

  • 写回答

8条回答 默认 最新

  • 一直免费一直爽 2024-08-15 17:14
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    首先,你需要安装一个支持SM2和SM3签名的库,例如BouncyCastle。你可以通过NuGet包管理器安装它:

    Install-Package BouncyCastle
    

    接下来,你可以使用以下代码示例来实现SM3withSM2签名:

    using System;
    using System.Text;
    using Org.BouncyCastle.Crypto;
    using Org.BouncyCastle.Crypto.Parameters;
    using Org.BouncyCastle.Math;
    using Org.BouncyCastle.Security;
    using Org.BouncyCastle.Utilities.Encoders;
    
    public class SM3withSM2Signature
    {
        public static string Sign(string privateKey, string data)
        {
            // 创建SM2密钥对生成器
            var keyPairGenerator = new ECKeyPairGenerator();
            keyPairGenerator.Init(new ECKeyGenerationParameters(ECNamedCurveTable.GetByName("sm2p256v1"), new SecureRandom()));
    
            // 从私钥字符串中解析出ECPrivateKeyParameters
            var privateKeyBytes = Hex.Decode(privateKey);
            var privateKeyParameters = new ECPrivateKeyParameters(new BigInteger(1, privateKeyBytes), ECNamedCurveTable.GetByName("sm2p256v1"));
    
            // 使用SM3withSM2算法进行签名
            var signer = new DsaDigestSigner(new ECDsaSigner(), new SM3Digest());
            signer.Init(true, privateKeyParameters);
            signer.BlockUpdate(Encoding.UTF8.GetBytes(data), 0, data.Length);
            var signature = signer.GenerateSignature();
    
            // 将签名转换为十六进制字符串
            return Hex.ToHexString(signature);
        }
    
        public static bool Verify(string publicKey, string data, string signature)
        {
            // 创建SM2公钥参数
            var publicKeyBytes = Hex.Decode(publicKey);
            var publicKeyParameters = new ECPublicKeyParameters(ECNamedCurveTable.GetByName("sm2p256v1"), new ECPoint(new BigInteger(1, publicKeyBytes), false));
    
            // 使用SM3withSM2算法进行验证
            var verifier = new DsaDigestSigner(new ECDsaSigner(), new SM3Digest());
            verifier.Init(false, publicKeyParameters);
            verifier.BlockUpdate(Encoding.UTF8.GetBytes(data), 0, data.Length);
            var signatureBytes = Hex.Decode(signature);
            return verifier.VerifySignature(signatureBytes[0], signatureBytes[1]);
        }
    }
    

    使用方法:

    string privateKey = "你的私钥";
    string publicKey = "你的公钥";
    string data = "需要签名的数据";
    
    // 签名
    string signature = SM3withSM2Signature.Sign(privateKey, data);
    Console.WriteLine("签名: " + signature);
    
    // 验证签名
    bool isValid = SM3withSM2Signature.Verify(publicKey, data, signature);
    Console.WriteLine("签名是否有效: " + isValid);
    

    请确保你已经正确设置了私钥和公钥。如果你仍然遇到问题,请检查你的私钥、公钥和数据是否正确。希望这对你有所帮助!

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月15日
  • 修改了问题 8月15日
  • 赞助了问题酬金15元 8月15日
  • 创建了问题 8月15日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?