SECP256K1 使用 SawTooth 验证 Swift
SECP256K1 Verify using SawTooth Swift
我正在尝试使用 SawTooth SDK 来制作 sign/verify 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..")
}
我总是得到 "Verification failed..." 知道我做错了什么吗?谢谢!
根据我们上面的讨论添加一个答案。
是的,你完全正确。
secp256r1
是定义为的曲线:
y^2 = x^3-3x+41058363725152142129326129780047268409114441015993725554835256314039467401291
这些常数,来自我们在 NSA 的朋友。
另一方面,secp256k1
是由方程定义的曲线:
y^2 = x^3+0x+7
x
、y
坐标可能有一些交叉,满足两个曲线方程,但是,关于上面的签名过程,public 密钥在签名上下文方面不可互换。
请记住,ECC 中的私钥只是 256-bit
个数字,但是每条曲线都有其自己定义的生成点 G
,必须用标量乘以私钥才能获得 public 键(这只是曲线本身上的一个点)。
因此,您只需将私钥定义为 256-bit
数字,并将其乘以 y^2 = x^3+0x+7
曲线生成点 02 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798
.
顺便说一句,上面是找到 public 键所需的原始数学,在你的 sawtooth SDK
中,你可以只使用 this 方法来导出 public 来自私钥的密钥。
我正在尝试使用 SawTooth SDK 来制作 sign/verify 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..")
}
我总是得到 "Verification failed..." 知道我做错了什么吗?谢谢!
根据我们上面的讨论添加一个答案。
是的,你完全正确。
secp256r1
是定义为的曲线:
y^2 = x^3-3x+41058363725152142129326129780047268409114441015993725554835256314039467401291
这些常数,来自我们在 NSA 的朋友。
另一方面,secp256k1
是由方程定义的曲线:
y^2 = x^3+0x+7
x
、y
坐标可能有一些交叉,满足两个曲线方程,但是,关于上面的签名过程,public 密钥在签名上下文方面不可互换。
请记住,ECC 中的私钥只是 256-bit
个数字,但是每条曲线都有其自己定义的生成点 G
,必须用标量乘以私钥才能获得 public 键(这只是曲线本身上的一个点)。
因此,您只需将私钥定义为 256-bit
数字,并将其乘以 y^2 = x^3+0x+7
曲线生成点 02 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798
.
顺便说一句,上面是找到 public 键所需的原始数学,在你的 sawtooth SDK
中,你可以只使用 this 方法来导出 public 来自私钥的密钥。