Bouncy Castle 将 ASN.1 转换为 r 和 s 字节数组
Bouncy Castle convert ASN.1 to r and s byte arrays
我有以下生成数字签名的代码:
byte[] GetSignature(byte[] message, byte[] privateKey)
{
var ecParams = NistNamedCurves.GetByName("P-256");
var domainParameters = new ECDomainParameters(ecParams.Curve, ecParams.G, ecParams.N, ecParams.H, ecParams.GetSeed());
var d = new BigInteger(1, privateKey);
var privateKeyParameters = new ECPrivateKeyParameters(d, domainParameters);
var signer = SignerUtilities.GetSigner("SHA-256withECDSA");
signer.Init(true, privateKeyParameters);
signer.BlockUpdate(message, 0, message.Length);
var signature = signer.GenerateSignature();
return signature;
}
此代码 returns 一个 ASN.1 格式的 71 字节数组,但是我的使用代码期望签名为 64 字节,由 r 和 s 值组成。我想提取 r 和 s 字节数组。我该怎么做?
在最新版本的 bc-csharp 中,您只需将“SHA-256withECDSA”更改为“SHA-256withPLAIN-ECDSA”,然后 GenerateSignature 将直接生成 64 字节签名而不是 ASN.1 值。
我有以下生成数字签名的代码:
byte[] GetSignature(byte[] message, byte[] privateKey)
{
var ecParams = NistNamedCurves.GetByName("P-256");
var domainParameters = new ECDomainParameters(ecParams.Curve, ecParams.G, ecParams.N, ecParams.H, ecParams.GetSeed());
var d = new BigInteger(1, privateKey);
var privateKeyParameters = new ECPrivateKeyParameters(d, domainParameters);
var signer = SignerUtilities.GetSigner("SHA-256withECDSA");
signer.Init(true, privateKeyParameters);
signer.BlockUpdate(message, 0, message.Length);
var signature = signer.GenerateSignature();
return signature;
}
此代码 returns 一个 ASN.1 格式的 71 字节数组,但是我的使用代码期望签名为 64 字节,由 r 和 s 值组成。我想提取 r 和 s 字节数组。我该怎么做?
在最新版本的 bc-csharp 中,您只需将“SHA-256withECDSA”更改为“SHA-256withPLAIN-ECDSA”,然后 GenerateSignature 将直接生成 64 字节签名而不是 ASN.1 值。