Подписание пары ключей ECDSA secp256k1 в Swift

Здесь я создал секретный ключ с помощью некоторого фиктивного 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 ответ

Эти функции напрямую вызывают неуправляемый (C) код. Входное значение считается того же размера, что и размер ключа: 256 бит или 32 байта. Если вы поставите больше, тогда будут взяты только первые 32 байта. Причина проста: данные просто отправляются с использованием одного указателя без указания длины.

Так что в основном этот код будет работать, только если вы отправите ему значение хеша 32 байта. Я думаю, что вы можете сделать это только для 256-битных хешей или хешей, которые меньше этого. Для больших хэшей вам может потребоваться выполнить модульное сокращение по порядку кривой. Меньшие хеши могут быть дополнены слева до нуля до 32 байтов, чтобы заставить их работать (ECDSA - это big endian).

Возможно, вы заметили, что в вызове отсутствует механизм хеширования CKSecp256k1, Если вы посмотрите на код, он, конечно, не выполнит его внутренне, даже если ввод называется "сообщением". Это низкоуровневый API, который используется специально для BitCoin, кажется.

Другие вопросы по тегам