BlueRSA
Swift 跨平台 RSA 包装库,用于 RSA 加密和签名。适用于支持的 Apple 平台(使用 Security 框架)。Linux(使用 OpenSSL)正在运行但仍在开发中。
内容
- CryptorRSA:用于 RSA 加密和签名的实用函数。纯 Swift
先决条件
Swift
- Swift 开源
swift-4.0.0-RELEASE
工具链(最新版本所需的最小要求) - Swift 开源
swift-4.2-RELEASE
工具链(建议使用) - 包含在 Xcode 版本 10.0 (10A255) 或更高版本 中的 Swift 工具链。
macOS
- macOS 10.12.0(Sierra)或更高版本
- 使用包含的工具链的 Xcode 版本 9.0(9A325)或更高版本(最新版本所需的最小要求)。
- 使用包含的工具链(推荐)的Xcode 10.0(10A255)或更高版本。
iOS
- iOS 10.3或更高版本
- 使用包含的工具链的 Xcode 版本 9.0(9A325)或更高版本(最新版本所需的最小要求)。
- 使用包含的工具链(推荐)的Xcode 10.0(10A255)或更高版本。
Linux
- Ubuntu 16.04(或16.10,但仅在16.04上测试过)和18.04。
- 上述列表中列出的任何Swift开源工具链。
- OpenSSL由发行版提供。注意:支持OpenSSL的1.0.x、1.1.x及以后版本。
- 构建时需要安装合适的libssl-dev软件包。
构建
从命令行构建CryptorRSA
% cd <path-to-clone>
% swift build
测试
从命令行运行为CryptorRSA提供的单元测试
% cd <path-to-clone>
% swift build
% swift test
使用CryptorRSA
包含到项目中
Swift包管理器
要将BlueRSA包含到Swift包管理器项目中,请将其添加到您的Package.swift
文件中定义的dependencies
属性中。您可以使用majorVersion
和minor
参数选择版本。例如:
dependencies: [
.Package(url: "https://github.com/IBM-Swift/BlueRSA", majorVersion: <majorVersion>, minor: <minor>)
]
Carthage
要使用Carthage将BlueRSA包含到项目中,请在您的Cartfile
中添加一行,包含GitHub组织名、项目名和版本。例如:
github "IBM-Swift/BlueRSA" ~> <majorVersion>.<minor>
开始之前
首先,您需要导入CryptorRSA框架。这可以通过以下代码完成:
import CryptorRSA
数据类型
BlueRSA支持以下主数据类型:
-
密钥处理
CryptorRSA.PublicKey
- 表示RSA公钥。CryptorRSA.PrivateKey
- 表示RSA私钥。
-
数据处理
CryptorRSA.EncryptedData
- 表示加密数据。CryptorRSA.PlaintextData
- 表示明文或解密数据。CryptorRSA.SignedData
- 表示签名数据。
密钥处理
BlueRSA提供了从数据创建公钥和私钥的七个函数。它们如下(其中createXXXX可以是createPublicKey
或createPrivateKey
,具体取决于您要创建什么):
CryptorRSA.createXXXX(with data: Data) throws
- 这将创建包含提供数据的私钥或公钥。 它假定所提供的数据是以正确格式。CryptorRSA.createXXXX(withBase64 base64String: String) throws
- 使用提供的 base64 编码字符串创建私钥或公钥。CryptorRSA.createXXXX(withPEM pemString: String) throws
- 使用提供的 PEM 编码字符串创建私钥或公钥。CryptorRSA.createXXXX(withPEMNamed pemName: String, onPath path: String) throws
- 使用指向.pem文件的pemName和通过提供的path指定的路径,创建私钥或公钥。CryptorRSA.createXXXX(withDERNamed derName: String, onPath path: String) throws
- 使用指向DER文件的derName和通过提供的path指定的路径,创建私钥或公钥。CryptorRSA.createXXXX(withPEMNamed pemName: String, in bundle: Bundle = Bundle.main) throws
- 使用指向PEM文件的pemName和位于由提供的bundle指定的Bundle中,创建私钥或公钥。默认情况下,此API将查找主Bundle。**注意:仅限Apple平台**CryptorRSA.createXXXX(withDERNamed derName: String, in bundle: Bundle = Bundle.main) throws
- 使用指向DER文件的derName和位于由提供的bundle指定的Bundle中,创建私钥或公钥。默认情况下,此API将查找主Bundle。**注意:仅限Apple平台**
此外,还有三个API用于从PEM格式的证书中提取密钥来创建公钥:它们是
CryptorRSA.createPublicKey(extractingFrom data: Data) throws
- 通过指向data的PEM编码证书提取,创建公钥。CryptorRSA.createPublicKey(extractingFrom certName: String, onPath path: String) throws
- 通过指向certName的PEM编码证书(位于提供的path指定的路径上)提取,创建公钥。CryptorRSA.createPublicKey(extractingFrom certName: String, in bundle: Bundle = Bundle.main) throws
- 使用指向derName的PEM编码证书和位于由提供的bundle指定的Bundle中创建公钥。默认情况下,此API将查找主Bundle。**注意:仅限Apple平台**
示例
以下示例说明根据位于特定路径的PEM编码文件创建公钥。**注意:省略异常处理以简化内容**。
import Foundation
import CryptorRSA
...
let keyName = ...
let keyPath = ...
let publicKey = try CryptorRSA.createPublicKey(withPEMNamed: keyName, onPath: keyPath)
...
<Do something with the key...>
数据加密和解密处理
BlueRSA提供创建每种三种(3)数据处理类型的函数
明文数据处理和签名
有创建PlaintextData
对象的两个类级别函数。它们是
CryptorRSA.createPlaintext(with data: Data) -> PlaintextData
- 此函数创建包含指定data
的PlaintextData
。CryptorRSA.createPlaintext(with string: String, using encoding: String.Encoding) throws -> PlaintextData
- 此函数使用指定encoding
编码的string
作为数据创建PlaintextData
对象。
创建PlaintextData
对象后,有两个可以用来操作包含数据的实例函数。它们是
encrypted(with key: PublicKey, algorithm: Data.Algorithm) throws -> EncryptedData?
- 该函数允许您使用指定的key
和algorithm
加密包含的数据。此函数返回一个可选的EncryptedData
对象,包含加密数据。signed(with key: PrivateKey, algorithm: Data.Algorithm) throws -> SignedData?
- 该函数允许您使用指定的key
和algorithm
签名包含的数据。此函数返回一个可选的SignedData
对象,包含签名数据。
示例
- 加密: 注意: 为简明起见,省略了异常处理。
import Foundation
import CryptorRSA
...
let keyName = ...
let keyPath = ...
let myData: Data = <... Data to be encrypted ...>
let publicKey = try CryptorRSA.createPublicKey(withPEMNamed: keyName, onPath: keyPath)
let myPlaintext = CryptorRSA.createPlaintext(with: myData)
let encryptedData = try myPlaintext.encrypt(with: publicKey, algorithm: .sha1)
...
< Do something with the encrypted data...>
- 签名: 注意: 为简明起见,省略了异常处理。
import Foundation
import CryptorRSA
...
let keyName = ...
let keyPath = ...
let myData: Data = <... Data to be signed ...>
let privateKey = try CryptorRSA.createPrivateKey(withPEMNamed: keyName, onPath: keyPath)
let myPlaintext = CryptorRSA.createPlaintext(with: myData)
let signedData = try myPlaintext.signed(with: privateKey, algorithm: .sha1)
...
< Do something with the signed data...>
加密数据处理
存在两个类级别函数可用于创建 EncryptedData
对象。这些是
CryptorRSA.createEncrypted(with data: Data) -> EncryptedData
- 该函数创建包含指定加密data
的EncryptedData
。CryptorRSA.createEncrypted(with base64String: String) throws -> EncryptedData
- 该函数使用已加密数据的 Base64 表示形式创建EncryptedData
。
创建 EncryptedData
对象后,有一个实例函数可用于解密封装的数据
decrypted(with key: PrivateKey, algorithm: Data.Algorithm) throws -> DecryptedData?
- 该函数允许您使用指定的key
和algorithm
解密包含的数据。此函数返回一个可选的DecryptedData
对象,包含加密数据。
BlueRSA 当前支持 OAEP
填充,这是推荐的填充算法。
示例
- 解密: 注意:为简明起见,省略了异常处理。
import Foundation
import CryptorRSA
...
let keyName = ...
let keyPath = ...
let publicKey = try CryptorRSA.createPublicKey(withPEMNamed: keyName, onPath: keyPath)
let pkeyName = ...
let pkeyPath = ...
let privateKey = try CryptorRSA.createPrivateKey(withPEMNamed: pkeyName, onPath: pkeyPath)
let myData: Data = <... Data to be encrypted ...>
let myPlaintext = CryptorRSA.createPlaintext(with: myData)
let encryptedData = try myPlaintext.encrypt(with: publicKey, algorithm: .sha1)
let decryptedData = try encryptedData.decrypt(with: privateKey, algorithm: .sha1)
...
< Do something with the decrypted data...>
签名验证处理
存在一个类级别函数可用以创建 SignedData
对象。它是
CryptorRSA.createSigned(with data: Data) -> SignedData
- 该函数创建包含指定签名data
的SignedData
。
创建了或获取了 PlaintextData
和 SignedData
后,有一个实例函数可用于验证包含的签名
-
verify(with key: PublicKey, signature: SignedData, algorithm: Data.Algorithm) throws -> Bool
- 该函数用于验证使用指定的key
和algorithm
的signature
。如果签名有效则返回 true,否则返回 false。 -
验证: 注意: 为简明起见,省略了异常处理。
import Foundation
import CryptorRSA
...
let keyName = ...
let keyPath = ...
let publicKey = try CryptorRSA.createPublicKey(withPEMNamed: keyName, onPath: keyPath)
let pkeyName = ...
let pkeyPath = ...
let privateKey = try CryptorRSA.createPrivateKey(withPEMNamed: pkeyName, onPath: pkeyPath)
let myData: Data = <... Data to be signed ...>
let myPlaintext = CryptorRSA.createPlaintext(with: myData)
let signedData = try myPlaintext.signed(with: privateKey, algorithm: .sha1)
if try myPlaintext.verify(with: publicKey, signature: signedData, algorithm: .sha1) {
print("Signature verified")
} else {
print("Signature Verification Failed")
}
数据类型实用函数
所有三种数据处理类型都有两个共同的实用实例函数。这些是
digest(using algorithm: Data.Algorithm) throws -> Data
- 该函数返回一个包含使用指定algorithm
构造的 digests 的Data
对象。string(using encoding: String.Encoding) throws -> String
- 该函数返回使用指定的encoding
的数据表示的String
。
社区
我们热衷于讨论服务器端Swift和Kitura。加入我们的Slack,来认识团队!
许可协议
此库遵循Apache 2.0许可协议。完整的许可协议文本可在LICENSE中查看。