BlueRSA 1.0.200

BlueRSA 1.0.200

Danny SungBill AbtSwift-at-IBM 维护。



BlueRSA 1.0.200

  • IBM 及 Kitura 项目作者

APIDoc Build Status - Master macOS iOS Linux Apache 2 Slack Status

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属性中。您可以使用majorVersionminor参数选择版本。例如:

	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可以是createPublicKeycreatePrivateKey,具体取决于您要创建什么):

  • 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 - 此函数创建包含指定dataPlaintextData
  • CryptorRSA.createPlaintext(with string: String, using encoding: String.Encoding) throws -> PlaintextData - 此函数使用指定encoding编码的string作为数据创建PlaintextData对象。

创建PlaintextData对象后,有两个可以用来操作包含数据的实例函数。它们是

  • encrypted(with key: PublicKey, algorithm: Data.Algorithm) throws -> EncryptedData? - 该函数允许您使用指定的 keyalgorithm 加密包含的数据。此函数返回一个可选的 EncryptedData 对象,包含加密数据。
  • signed(with key: PrivateKey, algorithm: Data.Algorithm) throws -> SignedData? - 该函数允许您使用指定的 keyalgorithm 签名包含的数据。此函数返回一个可选的 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 - 该函数创建包含指定加密 dataEncryptedData
  • CryptorRSA.createEncrypted(with base64String: String) throws -> EncryptedData - 该函数使用已加密数据的 Base64 表示形式创建 EncryptedData

创建 EncryptedData 对象后,有一个实例函数可用于解密封装的数据

  • decrypted(with key: PrivateKey, algorithm: Data.Algorithm) throws -> DecryptedData? - 该函数允许您使用指定的 keyalgorithm 解密包含的数据。此函数返回一个可选的 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 - 该函数创建包含指定签名 dataSignedData

创建了或获取了 PlaintextDataSignedData 后,有一个实例函数可用于验证包含的签名

  • verify(with key: PublicKey, signature: SignedData, algorithm: Data.Algorithm) throws -> Bool - 该函数用于验证使用指定的 keyalgorithmsignature。如果签名有效则返回 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中查看。