BlueECC 1.2.5

BlueECC 1.2.5

Matt KilnerDavid JonesAndrew LeesSwift-at-IBM 维护。



BlueECC 1.2.5

  • IBM

Kitura

APIDoc Build Status - Master macOS Linux Apache 2 Slack Status

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

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

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曲线。curvesecp384r1secp521r1曲线不支持在苹果平台上使用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中找到。