Swift上的ECDSA secp256k1密钥对签名

时间:2018-08-16 09:22:59

标签: ios swift cryptography ecdsa

在这里,我已经通过一些虚拟prvData创建了私钥,然后创建了2个虚拟数据对象并尝试对data1和data2对象进行签名

NSData *prvData = [NSData hexStringToData:@"e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b35"];

NSData *data1 = [NSData hexStringToData:@"0339a36013301597daef41fbe593a02cc513d0b55527ec2df1050e2e8ff49c85c2"];
NSData *data2 = [NSData hexStringToData:@"0339a36013301597daef41fbe593a02cc513d0b55527ec2df1050e2e8ff49c85c20339a36013301597daef41fbe593a02cc513d0b55527ec2df1050e2e8ff49c85c2"];


NSData *sig1 = [CKSecp256k1 compactSignData:data1 withPrivateKey:prvData];
NSData *sig2 = [CKSecp256k1 compactSignData:data2 withPrivateKey:prvData];

在这里,sig1和sign2对象值都相同,但是不应该发生。因此,如果有人进行过签名问题,请告诉我该怎么办?

1 个答案:

答案 0 :(得分:0)

这些函数直接调用非托管(C)代码。输入值被认为与键大小相同:256位或32字节。如果您提供的内容更多,则仅占用前32个字节。原因很简单:仅使用单个指针发送数据而无需指定长度

因此,基本上,该代码仅在您将其哈希值发送给32个字节时才有效。我认为您只能针对256位哈希或小于此的哈希进行此工作。对于较大的散列,您可能必须对曲线的阶数执行模块化缩减。较小的散列可以左填充,最多零个32个字节以使其起作用(ECDSA是大尾数)。

您可能已经注意到对CKSecp256k1的调用中缺少哈希机制。如果您看一下代码,即使输入被称为“消息”,它也肯定不会在内部执行。看来,这是专门用于BitCoin的低级API。