ECDSA secp256k1 密钥对生成和签名 Swift
ECDSA secp256k1 keypair generation and signing on Swift
我正在 Swift 上为 iOS 制作 Hyperledger Sawtooth 客户端原型。
在那之前,我在 Java 上为 Android 做同样的事情。
在 Java 实现中,使用 SpongyCastle 库很容易:
生成密钥的函数如下所示:
public static KeyPair getKeyPair() throws NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("ECDSA", "SC");
ECGenParameterSpec ecGenParameterSpec = new ECGenParameterSpec("secp256k1");
keyPairGenerator.initialize(ecGenParameterSpec, new SecureRandom());
return keyPairGenerator.generateKeyPair();
}
我需要在 Swift 中做同样的事情:
生成一个 secp256k1
密钥对并用它签署一个字节数组。
并用它来标记字节数组:
Signature signature = Signature.getInstance("ECDSA", "SC");
signature.initSign(keyPair.getPrivate(), new SecureRandom());
signature.update(bytes);
byte[] signedBytes = signature.sign();
我用谷歌搜索 "secp256k1 swift" 并找到了这些库:
- https://github.com/Boilertalk/secp256k1.swift
- https://github.com/noxproject/ASKSecp256k1
- https://github.com/pebble8888/secp256k1swift
- https://github.com/skywinder/ios-secp256k1
它们都是 bitcoin-core 的 secp256k1 库绑定到 Swift。
我可以做类似 let kp = KeyPair("secp256k1")
、let signedBytes = kp.sign(bytes)
的东西吗?如果是那么怎么做,如果不是那么还有其他方法吗?
我找到了解决方案。它是 BitcoinKit framework。我在安装 Carthage 时遇到了一些问题,但 Cocoapods + 安装错误消息中发现的一些缺失工具效果很好。
您始终可以使用 C 绑定,但是您必须使用 UnsafePointers 和 Bytes,我假设您正在寻找合适的包装器。因此,我找到了这个sawtooth-swift-sdk, which seems to use the secp256k1 library by boilertalk, which in turn imports the widely used bitcoin-core/libsecp256k1。它允许类似于您所问的内容(根据文档):
import SawtoothSigning
let context = Secp256k1Context()
let privateKey = context.newRandomPrivateKey()
let signer = Signer(context: context, privateKey: privateKey)
let signature = signer.sign(data: message_bytes)
我认为它将很快被列为官方认可的 SDK,如此 Sawtooth RFC 所示。那里似乎唯一缺少的是提供生成的 protobuf 类.
我正在 Swift 上为 iOS 制作 Hyperledger Sawtooth 客户端原型。
在那之前,我在 Java 上为 Android 做同样的事情。 在 Java 实现中,使用 SpongyCastle 库很容易: 生成密钥的函数如下所示:
public static KeyPair getKeyPair() throws NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("ECDSA", "SC");
ECGenParameterSpec ecGenParameterSpec = new ECGenParameterSpec("secp256k1");
keyPairGenerator.initialize(ecGenParameterSpec, new SecureRandom());
return keyPairGenerator.generateKeyPair();
}
我需要在 Swift 中做同样的事情:
生成一个 secp256k1
密钥对并用它签署一个字节数组。
并用它来标记字节数组:
Signature signature = Signature.getInstance("ECDSA", "SC");
signature.initSign(keyPair.getPrivate(), new SecureRandom());
signature.update(bytes);
byte[] signedBytes = signature.sign();
我用谷歌搜索 "secp256k1 swift" 并找到了这些库:
- https://github.com/Boilertalk/secp256k1.swift
- https://github.com/noxproject/ASKSecp256k1
- https://github.com/pebble8888/secp256k1swift
- https://github.com/skywinder/ios-secp256k1
它们都是 bitcoin-core 的 secp256k1 库绑定到 Swift。
我可以做类似 let kp = KeyPair("secp256k1")
、let signedBytes = kp.sign(bytes)
的东西吗?如果是那么怎么做,如果不是那么还有其他方法吗?
我找到了解决方案。它是 BitcoinKit framework。我在安装 Carthage 时遇到了一些问题,但 Cocoapods + 安装错误消息中发现的一些缺失工具效果很好。
您始终可以使用 C 绑定,但是您必须使用 UnsafePointers 和 Bytes,我假设您正在寻找合适的包装器。因此,我找到了这个sawtooth-swift-sdk, which seems to use the secp256k1 library by boilertalk, which in turn imports the widely used bitcoin-core/libsecp256k1。它允许类似于您所问的内容(根据文档):
import SawtoothSigning
let context = Secp256k1Context()
let privateKey = context.newRandomPrivateKey()
let signer = Signer(context: context, privateKey: privateKey)
let signature = signer.sign(data: message_bytes)
我认为它将很快被列为官方认可的 SDK,如此 Sawtooth RFC 所示。那里似乎唯一缺少的是提供生成的 protobuf 类.