UWPECDSP签名我想用这段代码制作一个ECDSA签名:AsymmetricKeyAlgorithmProviderobjAsymmAlgProv=AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricE56);CryptographicKey密钥对=objAsymmAlgProv.CreateKeyPairWithCurveName(EccCurveNames.SecP256r1);BinaryStringEncoding编码=BinaryStringEncoding.Utf8;buffMsg=CryptographicBuffer.ConvertStringToBinary("测试消息",编码);IBufferbuffSIG=CryptographicEngine.Sign(keypair,buffMsg);byte[]SignByteArray=buffSIG.ToArray();密钥对、buffMsg、buffSIG);VerifySignature始终返回true,没关系。但是我在签名时遇到了一些问题。为什么签名长度(SignByteArray)是固定的?(0x40字节)。为什么SignByteArray[0]和SignByteArray[2]值不正确?(我认为它们应该是0x30和0x02)我期待类似https://kjur.github.io/jsrsasign/sample-ecdsa.htmlECDSA规范最终确定这对(r,s)是签名。它忽略的是指示应该如何编写。Windows和.NET使用IEEE(P)1363格式,即big-endianrconcatbig-endians。r和s具有相同的大小(由密钥大小决定),因此签名总是偶数长度,r是前半部分。OpenSSL使用ASN.1/DER编码,即SEQUENCE(INTEGER(r),INTEGER(s))。DER编码可以一直下降到6个字节(300402000200,退化r=0,s=0),并且平均比IEEE格式大6个字节。它被编码为30[长度,一个或多个字节]02[长度,一个或多个字节][可选填充00][没有前导00的大端r]02[长度,一个或多个字节][可选填充00][没有前导00的大端s]。DER表格太依赖于数据而无法具体描述,所以一个例子应该有所帮助。假设我们在32位字段中使用曲线并生成(r=1016,s=2289644760)。IEEE1363://r000003F8//s887934D8DER:SEQUENCE(INTEGER(1016),INTEGER(2289644760))//编码r//1016=>0x3F8=>03F8(length02)SEQUENCE(020203F8,INTEGER(2289644760))//编码s//2289644760=>0x887934D8=>887934D8//但是因为设置了高位所以这是一个负数(-2005322536),//ands被定义为正数。所以插入一个00保证高位清零。//=>00887934D8(length05)SEQUENCE(020203F8020500887934D8)//并对序列进行编码,我们现在可以将其有效载荷长度算作11(0B)300B020203F8020500887934D8因此,Windows/.NET发出000003F8887934D8,OpenSSL发出300B020203F8020500887934D8。)=(1016,2289644760)。(旁白:您观察到DER编码中的signature[2]==0x02对于您正在使用的大小密钥是正确的,但是对于大约496位密钥,SEQUENCE长度在统计上可能需要超过一个字节;因此,对于P-521key,最有可能是从03818802,88bytes)以上就是C#学习教程的全部内容:UWPECDSP签名分享,如果对大家有用还需要详细了解C#学习教程,希望大家多多关注—本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
