Kitura

APIDoc Build Status - Master macOS Linux Apache 2 Slack Status

BlueECC

一个跨平台的 Swift 椭圆曲线数字签名算法 (ECDSA) 和椭圆曲线集成加密方案 (ECIES) 实现。这允许您使用椭圆曲线密钥进行签名、验证、加密和解密。

Swift 版本

最新版本的 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

支持以下曲线

或者,您可以使用第三方提供商生成私钥

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 扩展了 StringData,因此您可以使用 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 曲线支持跨平台加密和解密。secp384r1secp521r1 曲线不支持 Linux 加密与 Apple 平台解密以及反之亦然。

如果您想与此仓库互操作,以下描述了加密过程

这等效于:使用 Apple 安全性时的 kSecKeyAlgorithmECIESEncryptionStandardVariableIVX963SHA256AESGCM

API 文档

有关更多信息,请访问我们的 API 参考

社区

我们喜欢谈论服务器端 Swift 和 Kitura。加入我们的 Slack 与团队见面!

许可证

此库在 Apache 2.0 许可证下获得许可。完整许可证文本可在 LICENSE 中找到。