BlueECC 是一个跨平台的 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
文件,用于 Apple 服务。 这将生成一个应格式化为如下所示的密钥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 私钥直接在你的明文上调用 sign。 这将创建一个包含 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")
}
使用公钥将你的明文字符串或数据加密为加密数据或加密的 Base64Encoded 字符串
let encryptedData = try "Hello World".encrypt(with: eccPublicKey)
print(encryptedData.base64EncodedString())
使用私钥将加密的 Data 或 Base64Encoded 字符串解密为明文 Data 或 UTF8 字符串
let decryptedData = try encryptedData.decrypt(with: eccPrivateKey)
print(String(data: decryptedData, encoding: .utf8))
目前仅 prime256v1
曲线支持跨平台加密和解密。 secp384r1
和 secp521r1
曲线不支持 Linux 加密和 Apple 平台解密,反之亦然。
如果你想与此 repo 互操作,以下描述了加密过程
这相当于:使用 apple security 时的 kSecKeyAlgorithmECIESEncryptionStandardVariableIVX963SHA256AESGCM
。
有关更多信息,请访问我们的 API 参考。
我们喜欢讨论服务器端 Swift 和 Kitura。 加入我们的 Slack 与团队见面!
该库基于 Apache 2.0 许可。 完整的许可证文本可在 LICENSE 中获得。