Kitura

License

BlueECC

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 私钥直接在你的明文上调用 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 曲线支持跨平台加密和解密。 secp384r1secp521r1 曲线不支持 Linux 加密和 Apple 平台解密,反之亦然。

如果你想与此 repo 互操作,以下描述了加密过程

这相当于:使用 apple security 时的 kSecKeyAlgorithmECIESEncryptionStandardVariableIVX963SHA256AESGCM

API 文档

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

社区

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

许可证

该库基于 Apache 2.0 许可。 完整的许可证文本可在 LICENSE 中获得。