3

我正在 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”并找到了这些库:

它们都是 bitcoin-core 的 secp256k1 库与 Swift 的绑定。

我可以做类似let kp = KeyPair("secp256k1")的东西let signedBytes = kp.sign(bytes)吗?如果是,那么如何,如果不是,那么还有其他方法可以做到吗?

4

2 回答 2

5

我找到了解决方案。它是BitcoinKit 框架。我在安装 Carthage 时遇到了一些问题,但是 Cocoapods + 安装错误消息中发现的一些缺失工具效果很好。

于 2018-06-06T11:03:55.950 回答
1

您始终可以使用 C 绑定,但是您必须使用 UnsafePointers 和 Bytes,我假设您正在寻找合适的包装器。因此,我找到了这个sawtooth -swift-sdk,它似乎使用了boilertalk 的 secp256k1 库,它又导入了广泛使用的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 类。

于 2019-03-09T23:02:56.787 回答