在这里,我通过一些虚拟 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 对象值都相同,但它不应该发生。所以请如果有人做过这个签名问题,请告诉我,怎么办?
Best Answer-推荐答案 strong>
这些函数直接调用非托管 (C) 代码。输入值被认为与 key 大小相同:256 位或 32 字节。如果您提供的数量超过此数量,则只占用前 32 个字节。原因很简单:数据只是使用单个指针发送而没有指定长度。
所以基本上这段代码只有在你向它发送一个 32 字节的哈希值时才会起作用。我认为您只能使这项工作适用于 256 位散列或小于该值的散列。对于较大的散列,您可能必须在曲线的顺序上执行模减少。较小的散列可以left-padded零的最多32个字节以使它们工作(ECDSA是大端)。
您可能已经注意到对 CKSecp256k1 的调用中缺少哈希机制。如果你看一下代码,它肯定不会在内部执行它,即使输入被称为“消息”。这是一个专门用于比特币的低级 API,看起来。
关于ios - ECDSA secp256k1 key 对在 Swift 上签名,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/51873672/
|