SECP256K1 Подтвердите с помощью SawTooth Swift

Я пытаюсь использовать 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 ответ

Решение

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

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

secp256r1 кривая определяется как:

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

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

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

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

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

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

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

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

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