SECP256K1 Проверка с использованием SawTooth Swift - PullRequest
1 голос
/ 17 апреля 2020

Я пытаюсь использовать SawTooth SDK, чтобы подписать / проверить пару ключей Secp256k1. Кажется, все прекрасно ожидают конца, когда я пытаюсь проверить:

let context = Secp256k1Context()

//PrivateKey init
let privateKey = Secp256k1PrivateKey.init(privKey: [0x..,0x..,0x..,0x..,0x..,0x..,0x..,0x..,0x..,0x..,0x..,0xf4,0x27,0x86,0xb5,0xdd,0x7b,0x76,0xba,0xea,0x42,0xa9,0xaa,0x60,0xff,0x4c,0x31,0x23,0xfa,0xf0,0x9b,0x8a])

//PublicKey init
let publicKey = Secp256k1PublicKey.init(pubKey: [0x..,0x..,0x..,0x..,0x..,0x..,0x..,0x..,0x..,0x..,0x..,0x6c,0xd0,0x7b,0xd5,0xa3,0x85,0x6f,0x92,0xe7,0xbc,0x15,0xf3,0x40,0x8a,0xa5,0x4f,0x6c,0x3c,0x11,0x55,0x25,0x37,0x48,0xc9,0x93,0x0d,0x7a,0x18,0x4b,0x29,0x30,0xde,0xcd,0xbf,0xb3,0x94,0x4c,0x7f,0xdf,0xd2,0xda,0x51,0xcd,0x87,0xb5,0x00,0x8a,0x15,0xc5,0x16,0x1c,0x73,0xca])

let message_string = "hello"
let message_bytes: [UInt8] = Array(message_string.utf8)

let signer = Signer(context: context, privateKey: privateKey)

do {
    let signature = try signer.sign(data: message_bytes)
    let verif = try context.verify(signature: signature, data: message_bytes, publicKey: publicKey)
    print(verif)
}
catch {
    print("Verification failed..")
}

Я всегда получаю «Проверка не удалась ...» Есть идеи, что я делаю неправильно? Спасибо!

1 Ответ

1 голос
/ 17 апреля 2020

Добавление ответа на основе нашего обсуждения выше.

Да, вы совершенно правы.

secp256r1 - это кривая, определенная как:

y^2 = x^3-3x+41058363725152142129326129780047268409114441015993725554835256314039467401291

Эти константы получены от наших друзей в АНБ.

secp256k1 с другой стороны, это кривая, определяемая уравнением:

y^2 = x^3+0x+7

Может иметь место некоторое пересечение в отношении x, y координат, которые удовлетворяют обоим уравнениям кривой, однако, что касается процессов подписи, описанных выше, публичные c ключи не являются взаимозаменяемыми в отношении в контекст подписи.

Помните, что закрытые ключи в E CC являются просто 256-bit числами, однако каждая кривая имеет свою собственную определенную точку генератора G, которая должна быть скалярно умножена на закрытый ключ для получите ключ publi c (который является просто точкой на самой кривой).

Итак, вам просто нужно определить закрытый ключ как число 256-bit и умножить его на y^2 = x^3+0x+7 Точка генератора кривых, 02 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798.

Кстати, Выше приведена грубая математика, необходимая для поиска ключа publi c, в вашем sawtooth SDK вы можете просто использовать this метод для получения ключа publi c из закрытого ключа.

...