网上找的代码几乎都是BouncyCastle框架,核心代码大同小异,我搬运之后测试的时候遇到一个问题,没搜到有类似的解答
SM2Param sM2Param = new SM2Param(); byte[] priKey = Base64.Decode(priKeyStr); BigInteger bi = new BigInteger(1, priKey); ECDomainParameters domain = new ECDomainParameters(GMNamedCurves.GetByName("SM2P256V1")); ECPrivateKeyParameters privateKeyParameters = new ECPrivateKeyParameters(bi, domain);
如上面的代码,在初始化ECPrivateKeyParameters的时候报错了:Scalar is not in the interval
求大佬们帮忙看看
我的私钥是
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
应该是私钥的问题,换成园子里 C# SM加密 这篇博文中的私钥,用你的代码可以正常运行,测试代码如下
using Org.BouncyCastle.Asn1.GM;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Utilities.Encoders;
using System.Text;
var rawPrivateKey = "3690655E33D5EA3D9A4AE1A1ADD766FDEA045CDEAA43A9206FB8C430CEFE0D94";
var base64PrivateKey = Convert.ToBase64String(Encoding.ASCII.GetBytes(rawPrivateKey));
var priKeyStr = Convert.FromBase64String(base64PrivateKey);
byte[] priKey = Hex.Decode(priKeyStr);
var bi = new Org.BouncyCastle.Math.BigInteger(1, priKey);
var domain = new ECDomainParameters(GMNamedCurves.GetByName("sm2p256v1"));
domain.ValidatePrivateScalar(bi);
var privateKeyParameters = new ECPrivateKeyParameters(bi, domain);
所使用的 nuget 包
<PackageReference Include="Portable.BouncyCastle" Version="1.9.0" />
.NET 版本是 7.0
谢谢,我后来用Pkcs12Store加载私钥文件就可以了,直接用字符串不行
@hangjy: 你好,请问可以发下处理私钥字符串的c#代码么。我也是直接使用字符串后报错这个错。
找到原因了,公钥或者私钥错误,差一个字母就会报错。比如:lL1、oO0这些三方给的公钥或者私钥,还是用pdf给的经常会copy错误。建议用adebe pdf 、wps两个识别,确保每个字母正确