BlueECC
椭圆曲线数字签名算法(ECDSA)和椭圆曲线集成加密方案(ECIES)的跨平台 Swift 实现。它允许您使用椭圆曲线密钥进行签名、验证、加密和解密。
Swift 版本
BlueECC 最新版本需要 Swift 4.1 或更高版本。您可以通过以下链接下载此版本的 Swift 二进制文件:[Swift download link](https://swiftlang.cn/download/)。与其他 Swift 版本的兼容性不能保证。
用法
添加依赖项
将 BlueECC
包添加到应用程序 Package.swift
文件中的依赖项中。将 "x.x.x"
替换为最新的 BlueECC
[发布版](https://github.com/IBM-Swift/BlueECC/releases)。
.package(url: "https://github.com/IBM-Swift/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
以下曲线受支持:
- prime256v1
- secp384r1
- secp521r1
或者,您也可以使用第三方服务提供商生成私钥
- 您可以从 https://developer.apple.com/account/ios/authkey 生成 Apple 服务使用的
p-256
私钥作为.p8
文件。这将生成以下格式的密钥
let privateKey =
"""
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQglf7ztYnsaHX2yiHJ
meHFl5dg05y4a/hD7wwuB7hSRpmhRANCAASKRzmboLbG0NZ54B5PXxYSU7fvO8U7
PyniQCWG+Agc3bdcgKU0RKApWYuBJKrZqyqLB2tTlgdtwcWSB0AEzVI8
-----END PRIVATE KEY-----
"""
- 您可以使用 OpenSSL 的命令行椭圆曲线操作Command Line Elliptic Curve Operations。
以下命令会针对三个支持的曲线,生成密钥为 .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
曲线。curvesecp384r1
和secp521r1
曲线不支持在苹果平台上使用Linux加密,反之亦然。
如果您想与此存储库进行互操作,以下描述了加密过程
- 生成一个临时EC密钥对
- 使用您的EC对的ECDH生成一个对称密钥
- 使用SHA256 ANSI x9.63密钥导出函数和临时公钥生成一个32字节密钥
- 使用前16字节作为AES-GCM密钥
- 使用第16个字节作为初始化向量(IV)
- 使用aes_128_gcm加密明文并生成一个16字节的GCM标签
- 发送临时公钥、加密数据和GCM标签
当使用苹果安全时,这等同于kSecKeyAlgorithmECIESEncryptionStandardVariableIVX963SHA256AESGCM
API 文档
获取更多信息,请访问我们的API参考。
社区
我们热爱讨论服务端Swift和Kitura,加入我们的Slack来认识团队吧!
许可
本库遵循Apache 2.0许可。完整的许可文本可在LICENSE中找到。