如何使用CommonCrypto在Swift中生成RSA密钥?

时间:2016-01-28 22:49:01

标签: swift openssl cryptography rsa commoncrypto

我需要编写一个函数来在OS X上本地生成一个新的 RSA 私钥,并且能够打印出素数,模数等。我不想使用也不是将任何内容存储在Keychain中,只需编写一个简单的命令行工具。

过去很容易在 C / Objective-C 中使用 OpenSSL 生成一个新密钥:

RSA *keypair = RSA_generate_key(1024, 3, NULL, NULL);

但OpenSSL已弃用,所以我的问题是如何使用原生 CommonCrypto 框架在 Swift 中编写等效代码。它没有很好的记录,到目前为止,我找到了对我有用的任何东西。

任何人都可以分享一个执行此操作的代码段吗?感谢

1 个答案:

答案 0 :(得分:2)

可以在以下位置找到CommonRSACryptor标头:

http://opensource.apple.com/source/CommonCrypto/CommonCrypto-60026/Source/CommonCryptoSPI/CommonRSACryptor.h

您可以使用以下代码创建桥接标头:

typedef int32_t CCCryptorStatus;
typedef struct _CCRSACryptor *CCRSACryptorRef;
CCCryptorStatus CCRSACryptorGeneratePair(size_t keysize, uint32_t e, CCRSACryptorRef *publicKey, CCRSACryptorRef *privateKey);
CCCryptorStatus CCRSACryptorExport(CCRSACryptorRef key, void *out, size_t *outLen);
void CCRSACryptorRelease(CCRSACryptorRef key);

之后,您可以使用Swift的CCRSACryptorGeneratePair,CCRSACryptorExport,CCRSACryptorRelease函数。

var privateKey: CCRSACryptorRef = nil
var publicKey: CCRSACryptorRef = nil
var status = CCRSACryptorGeneratePair(keySize, 65537, &publicKey, &privateKey)
guard status == noErr else {
    throw error("CCRSACryptorGeneratePair failed \(status)")
}
defer { CCRSACryptorRelease(privateKey) }
defer { CCRSACryptorRelease(publicKey) }

var privKeyDataLength = 8192
let privKeyData = NSMutableData(length: privKeyDataLength)!
var pubKeyDataLength = 8192
let pubKeyData = NSMutableData(length: pubKeyDataLength)!

status = CCRSACryptorExport(privateKey, privKeyData.mutableBytes, &privKeyDataLength)
guard status == noErr else {
    throw error("CCRSACryptorExport privateKey failed \(status)")
}
status = CCRSACryptorExport(publicKey, pubKeyData.mutableBytes, &pubKeyDataLength)
guard status == noErr else {
    throw error("CCRSACryptorExport publicKey failed \(status)")
}

privKeyData.length = privKeyDataLength
pubKeyData.length = pubKeyDataLength

SwCrypt库做同样的事情。