我找不到P1363格式确定性的任何参考.r
和s
在确定性模式下总是不同的.
Non-Deterministic带P1363->;WithPlain-ECDSA
确定
ISigner sign = SignerUtilities.GetSigner("SHA256WithPlain-ECDSA");
sign.Init(true, privateKey);
sign.BlockUpdate(message, 0, message.Length);
byte[] signedBytes = sign.GenerateSignature(); // Signature can divded by 2. OK
Deterministic way:(如何申请WithPlain-ECDSA
?)
var signer = new ECDsaSigner(new HMacDsaKCalculator(new Sha256Digest()));
signer.Init(true, privateKey);
var toto = signer.GenerateSignature(message);
var r = toto[0].ToByteArray(); // sometimes r are equqal s
var s = toto[1].ToByteArray(); // sometimes s larger than s byte one.
我不能退r.Concat(s).ToArray()
.在转换成P1363之前,无法将r
和s
转换为byte[]
?这在上面的确定性版本中不存在...
- 如何在P1363格式的字节[]中连接
r
和s
? - 如何确保我可以通过将数组的一半转换回
r
,另一半转换回s
. - 有时
r
等于s
,或s
大于r
,如何确保生成时两者完全相等?
我找不到P1363的任何参考资料.但我发现只有ASN1 DER format个:
using (MemoryStream ms = new MemoryStream())
using (Asn1OutputStream asn1stream = new Asn1OutputStream(ms))
{
DerSequenceGenerator seq = new DerSequenceGenerator(asn1stream);
seq.AddObject(new DerInteger(s));
seq.AddObject(new DerInteger(s));
seq.Close();
var arrr = ms.ToArray();
}
我也试过这个trick
不完全确定上述人员的技巧是否奏效,但人员try 以固定方式生成:
Array.Copy(sig1, 0, sig, 0 + (32 - sig1.Length), sig1.Length);
Array.Copy(sig2, 0, sig, 32 + (32 - sig2.Length), sig2.Length);
Short Answer:
根据@Topaco answer,其快速手动方法.非常感谢他.在调查之后,我们还可以使用两个类StandardDsaEncoding
和PlainDsaEncoding
类
-
StandardDsaEncoding
用于编码/解码ASN1.Der格式. -
PlainDsaEncoding
用于编码/解码P1363格式.
PlainDsaEncoding.Instance.Encode()
//此转换为P1363格式.
注意:ECDsaSigner
可以包装在DsaDigestSigner
中,以允许消息自动散列.或者手动计算散列(消息),然后像@Topaco other post answer一样使用ECDsaSigner
.