Swift 跨平台 RSA 封装库,用于 RSA 加密和签名。可在受支持的 Apple 平台(使用 Security framework)上运行。Linux(使用 OpenSSL)可以工作,但仍在开发中。
swift-4.0.0-RELEASE
工具链(最新版本最低要求)swift-5.2-RELEASE
工具链(推荐)要从命令行构建 CryptorRSA
% cd <path-to-clone>
% swift build
要从命令行运行为 CryptorRSA 提供的单元测试
% cd <path-to-clone>
% swift build
% swift test
要将 BlueRSA 包含到 Swift Package Manager 包中,请将其添加到 Package.swift
文件中定义的 dependencies
属性。您可以使用 majorVersion
和 minor
参数选择版本。例如
dependencies: [
.package(url: "https://github.com/Kitura/BlueRSA", majorVersion: <majorVersion>, minor: <minor>)
]
要在使用 Carthage 的项目中包含 BlueRSA,请在您的 Cartfile
中添加一行,其中包含 GitHub 组织和项目名称以及版本。例如
github "Kitura/BlueRSA" ~> <majorVersion>.<minor>
您需要做的第一件事是导入 CryptorRSA 框架。这可以通过以下方式完成
import CryptorRSA
BlueRSA 支持以下主要数据类型
密钥处理
CryptorRSA.PublicKey
- 表示 RSA 公钥。CryptorRSA.PrivateKey
- 表示 RSA 私钥。数据处理
CryptorRSA.EncryptedData
- 表示加密数据。CryptorRSA.PlaintextData
- 表示明文或解密数据。CryptorRSA.SignedData
- 表示签名数据。BlueRSA 提供了七 (7) 个函数,分别用于从数据创建公钥和私钥。它们如下所示(其中 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
- 这会使用 pemName
指向且位于 path
指定路径上的 PEM 编码文件
创建私钥或公钥。CryptorRSA.createXXXX(withDERNamed derName: String, onPath path: String) throws
- 这会使用 derName
指向且位于 path
指定路径上的 DER 编码文件
创建私钥或公钥。CryptorRSA.createXXXX(withPEMNamed pemName: String, in bundle: Bundle = Bundle.main) throws
- 这会使用 pemName
指向且位于 bundle
指定的 Bundle
中的 PEM 编码文件
创建私钥或公钥。默认情况下,此 API 将在 main
bundle 中查找。注意:仅限 Apple 平台CryptorRSA.createXXXX(withDERNamed derName: String, in bundle: Bundle = Bundle.main) throws
- 这会使用 derName
指向且位于 bundle
指定的 Bundle
中的 DER 编码文件
创建私钥或公钥。默认情况下,此 API 将在 main
bundle 中查找。注意:仅限 Apple 平台此外,还有三个 API,用于通过从 PEM 格式的证书中提取密钥来创建公钥:它们是
CryptorRSA.createPublicKey(extractingFrom data: Data) throws
- 这会通过从 data
指向的 PEM 编码证书
中提取来创建公钥。CryptorRSA.createPublicKey(extractingFrom certName: String, onPath path: String) throws
- 这会通过从 certName
指向且位于 path
指定路径上的 PEM 编码证书
中提取来创建公钥。CryptorRSA.createPublicKey(extractingFrom certName: String, in bundle: Bundle = Bundle.main) throws
- 这会使用 derName
指向且位于 bundle
指定的 Bundle
中的 PEM 编码证书
来创建公钥。默认情况下,此 API 将在 main
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.encrypted(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 表示形式创建一个 EncrpytedData
。创建 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.encrypted(with: publicKey, algorithm: .sha1)
let decryptedData = try encryptedData.decrypted(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
- 此函数返回一个 Data
对象,其中包含使用指定的 algorithm
构建的摘要。string(using encoding: String.Encoding) throws -> String
- 此函数返回使用指定的 encoding
的数据的 String
表示形式。我们喜欢讨论服务器端 Swift 和 Kitura。加入我们的 Slack 与团队会面!
此库在 Apache 2.0 许可证下获得许可。完整许可证文本可在 LICENSE 中找到。