ECDSA secp256k1生成密钥对并在Swift上签名

时间:2018-05-18 12:03:16

标签: ios swift cryptography ecdsa hyperledger-sawtooth

我在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();

我用Google搜索“secp256k1 swift”并找到了这些库:

所有这些都是比特币核心的secp256k1库与Swift的绑定。

我可以制作let kp = KeyPair("secp256k1")let signedBytes = kp.sign(bytes)之类的内容吗?如果是,那么如何,如果没有,那么还有其他方法吗?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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类。