APIDoc SwiftPackageIndex TravisCI License

BlueCryptor

基于 IDZSwiftCommonCrypto 的 Swift 跨平台加密库。

重要提示: 此版本与之前的版本在源代码层面上不完全兼容。现在某些情况下会抛出异常,而不是框架调用 fatalError()。 这意味着库中存在比以前更多的可恢复错误。 仅在指示编程错误不可恢复的系统错误时,才会调用 fatalError()

注意: 在 macOS 和 iOS 上,BlueCryptor 使用 Apple 提供的 CommonCrypto 库。 在 Linux 上,它使用 OpenSSL 项目中的 libcrypto

先决条件

Swift

macOS

iOS

Linux

构建

要从命令行构建 Cryptor

% cd <path-to-clone>
% swift build

测试

要从命令行运行提供的 Cryptor 单元测试

% cd <path-to-clone>
% swift build
% swift test

入门

包含在你的项目中

Swift Package Manager

要将 BlueCryptor 包含到 Swift Package Manager 包中,请将其添加到 Package.swift 文件中定义的 dependencies 属性。 您可以使用 majorVersionminor 参数选择版本。 例如

	dependencies: [
		.Package(url: "https://github.com/Kitura/BlueCryptor.git", majorVersion: <majorVersion>, minor: <minor>)
	]

Carthage

要使用 Carthage 将 BlueCryptor 包含在项目中,请在您的 Cartfile 中添加一行,其中包含 GitHub 组织和项目名称以及版本。 例如

	github "Kitura/BlueCryptor" ~> <majorVersion>.<minor>

CocoaPods

要使用 CocoaPods 将 BlueCryptor 包含在项目中,只需将 BlueCryptor 添加到您的 Podfile 中,例如

    platform :ios, '10.0'

    target 'MyApp' do
        use_frameworks!
        pod 'BlueCryptor'
    end

开始之前

您需要做的第一件事是导入 Cryptor 框架。 这可以通过以下方式完成

import Cryptor

API

Cryptor

以下代码演示了使用可选链的 AES 单块 CBC 模式进行加密和解密。

let key = CryptoUtils.byteArray(fromHex: "2b7e151628aed2a6abf7158809cf4f3c")
let iv = CryptoUtils.byteArray(fromHex: "00000000000000000000000000000000")
let plainText = CryptoUtils.byteArray(fromHex: "6bc1bee22e409f96e93d7e117393172a")

var textToCipher = plainText
if plainText.count % Cryptor.Algorithm.aes.blockSize != 0 {
	textToCipher = CryptoUtils.zeroPad(byteArray: plainText, blockSize: Cryptor.Algorithm.aes.blockSize)
}
do {
	let cipherText = try Cryptor(operation: .encrypt, algorithm: .aes, options: .none, key: key, iv: iv).update(byteArray: textToCipher)?.final()
		
	print(CryptoUtils.hexString(from: cipherText!))
		
	let decryptedText = try Cryptor(operation: .decrypt, algorithm: .aes, options: .none, key: key, iv: iv).update(byteArray: cipherText!)?.final()

	print(CryptoUtils.hexString(from: decryptedText!))
} catch let error {
	guard let err = error as? CryptorError else {
		// Handle non-Cryptor error...
		return
	}
	// Handle Cryptor error... (See Status.swift for types of errors thrown)
}

摘要

以下示例说明了如何从 StringNSData 的实例生成 MD5 摘要。

let qbfBytes : [UInt8] = [0x54,0x68,0x65,0x20,0x71,0x75,0x69,0x63,0x6b,0x20,0x62,0x72,0x6f,0x77,0x6e,0x20,0x66,0x6f,0x78,0x20,0x6a,0x75,0x6d,0x70,0x73,0x20,0x6f,0x76,0x65,0x72,0x20,0x74,0x68,0x65,0x20,0x6c,0x61,0x7a,0x79,0x20,0x64,0x6f,0x67,0x2e]
let qbfString = "The quick brown fox jumps over the lazy dog."

// String...
let md5 = Digest(using: .md5)
md5.update(string: qfbString)
let digest = md5.final()

// NSData using optional chaining...
let qbfData = CryptoUtils.data(from: qbfBytes)
let digest = Digest(using: .md5).update(data: qbfData)?.final()

HMAC

以下演示了如何使用字节数组作为密钥和数据来生成 SHA256 HMAC。

let myKeyData = "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b"
let myData = "4869205468657265"
let key = CryptoUtils.byteArray(fromHex: myKeyData)
let data : [UInt8] = CryptoUtils.byteArray(fromHex: myData)

let hmac = HMAC(using: HMAC.Algorithm.sha256, key: key).update(byteArray: data)?.final()

密钥派生

以下说明了如何使用密码、盐、轮数和指定的派生密钥长度,并使用 SHA1 算法生成密钥。 然后它显示了如何从生成的密钥生成 String

let password = "password"
let salt = salt
let rounds: UInt = 2
let derivedKeyLen = 20
do {
	let key = PBKDF.deriveKey(fromPassword: password, salt: salt, prf: .sha1, rounds: rounds, derivedKeyLength: derivedKeyLen)
	let keyString = CryptoUtils.hexString(from: key)
} catch let error {
	guard let err = error as? CryptorError else {
		// Handle non-Cryptor error...
		return
	}
	// Handle Cryptor error... (See Status.swift for types of errors thrown)
}

随机字节生成

以下演示了生成给定长度的随机字节。

let numberOfBytes = 256*256
do {
	let randomBytes = try Random.generate(byteCount: numberOfBytes)
} catch {
  	print("Error generating random bytes")
}

实用工具

Cryptor 还提供了一组数据操作实用程序函数,用于转换来自各种格式的数据

还提供了一个 API 来填充字节数组 ([UInt8]),使其成为 block size in bytes 长度的整数倍。

限制

以下算法在 Linux 上不可用,因为它不受 OpenSSL 支持。

在所有情况下,使用不受支持的 API 或算法将导致 Swift fatalError(),终止程序,应将其视为编程错误。

社区

我们很乐意讨论服务器端的 Swift 和 Kitura。 加入我们的 Slack 与团队会面!

许可证

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