一个跨平台的 Swift 椭圆曲线数字签名算法 (ECDSA) 和椭圆曲线集成加密方案 (ECIES) 实现。这允许您使用椭圆曲线密钥进行签名、验证、加密和解密。
最新版本的 BlueECC 需要 Swift 5.2 或更高版本。您可以按照此链接下载此版本的 Swift 二进制文件。不保证与其他 Swift 版本的兼容性。
将 BlueECC
包添加到应用程序的 Package.swift
文件中的依赖项中。将 "x.x.x"
替换为最新的 BlueECC
版本。
.package(url: "https://github.com/Kitura/BlueECC.git", from: "x.x.x")
将 CryptorECC
添加到您的目标依赖项
.target(name: "example", dependencies: ["CryptorECC"]),
import CryptorECC
您可以使用 BlueECC 生成 ECPrivate 密钥。
let p256PrivateKey = try ECPrivateKey.make(for: .prime256v1)
然后,您可以按如下方式查看 PEM 格式的密钥
let privateKeyPEM = p256PrivateKey.pemString
支持以下曲线
或者,您可以使用第三方提供商生成私钥
p-256
私钥作为 .p8
文件。这将生成一个应按如下格式格式化的密钥let privateKey =
"""
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQglf7ztYnsaHX2yiHJ
meHFl5dg05y4a/hD7wwuB7hSRpmhRANCAASKRzmboLbG0NZ54B5PXxYSU7fvO8U7
PyniQCWG+Agc3bdcgKU0RKApWYuBJKrZqyqLB2tTlgdtwcWSB0AEzVI8
-----END PRIVATE KEY-----
"""
以下命令为三个支持的曲线生成私钥作为 .pem
文件
// p-256
$ openssl ecparam -name prime256v1 -genkey -noout -out key.pem
// p-384
$ openssl ecparam -name secp384r1 -genkey -noout -out key.pem
// p-521
$ openssl ecparam -name secp521r1 -genkey -noout -out key.pem
这些密钥将按如下格式格式化
let privateKey =
"""
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIJX+87WJ7Gh19sohyZnhxZeXYNOcuGv4Q+8MLge4UkaZoAoGCCqGSM49
AwEHoUQDQgAEikc5m6C2xtDWeeAeT18WElO37zvFOz8p4kAlhvgIHN23XIClNESg
KVmLgSSq2asqiwdrU5YHbcHFkgdABM1SPA==
-----END EC PRIVATE KEY-----
"""
然后可以使用密钥字符串来初始化 ECPrivateKey
实例
let eccPrivateKey = try ECPrivateKey(key: privateKey)
您可以使用 OpenSSL 从上述任何椭圆曲线私钥文件生成椭圆曲线公钥 .pem
文件
$ openssl ec -in key.pem -pubout -out public.pem
这将生成一个格式如下的公钥
let publicKey =
"""
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEikc5m6C2xtDWeeAeT18WElO37zvF
Oz8p4kAlhvgIHN23XIClNESgKVmLgSSq2asqiwdrU5YHbcHFkgdABM1SPA==
-----END PUBLIC KEY-----
"""
然后可以使用这些密钥来初始化 ECPrivateKey
实例
let eccPublicKey = try ECPublicKey(key: publicKey)
或者,您可以从您的 ECPrivateKey
中提取公钥
let eccPublicKey = try eccPrivateKey.extractPublicKey()
print(eccPublicKey.pemString)
BlueECC 扩展了 String
和 Data
,因此您可以使用 EC 私钥直接在纯文本上调用签名。这将创建一个包含 r 和 s 签名值的 ECSignature
let message = "hello world"
let signature = try message.sign(with: eccPrivateKey)
使用公钥验证纯文本的签名
let verified = signature.verify(plaintext: message, using: eccPublicKey)
if verified {
print("Signature is valid for provided plaintext")
}
使用公钥将您的纯文本字符串或数据加密为加密数据或加密的 Base64 编码字符串
let encryptedData = try "Hello World".encrypt(with: eccPublicKey)
print(encryptedData.base64EncodedString())
使用私钥将加密的数据或 Base64 编码字符串解密为纯文本数据或 UTF8 字符串
let decryptedData = try encryptedData.decrypt(with: eccPrivateKey)
print(String(data: decryptedData, encoding: .utf8))
目前仅 prime256v1
曲线支持跨平台加密和解密。secp384r1
和 secp521r1
曲线不支持 Linux 加密与 Apple 平台解密以及反之亦然。
如果您想与此仓库互操作,以下描述了加密过程
这等效于:使用 Apple 安全性时的 kSecKeyAlgorithmECIESEncryptionStandardVariableIVX963SHA256AESGCM
。
有关更多信息,请访问我们的 API 参考。
我们喜欢谈论服务器端 Swift 和 Kitura。加入我们的 Slack 与团队见面!
此库在 Apache 2.0 许可证下获得许可。完整许可证文本可在 LICENSE 中找到。