基于 IDZSwiftCommonCrypto 的 Swift 跨平台加密库。
重要提示: 此版本与之前的版本在源代码层面上不完全兼容。现在某些情况下会抛出异常,而不是框架调用 fatalError()。 这意味着库中存在比以前更多的可恢复错误。 仅在指示编程错误或不可恢复的系统错误时,才会调用 fatalError()。
注意: 在 macOS 和 iOS 上,BlueCryptor 使用 Apple 提供的 CommonCrypto 库。 在 Linux 上,它使用 OpenSSL 项目中的 libcrypto。
swift-5.1-RELEASE
工具链(最新版本所需的最低要求)swift-5.4-RELEASE
工具链(推荐)要从命令行构建 Cryptor
% cd <path-to-clone>
% swift build
要从命令行运行提供的 Cryptor 单元测试
% cd <path-to-clone>
% swift build
% swift test
要将 BlueCryptor 包含到 Swift Package Manager 包中,请将其添加到 Package.swift
文件中定义的 dependencies
属性。 您可以使用 majorVersion
和 minor
参数选择版本。 例如
dependencies: [
.Package(url: "https://github.com/Kitura/BlueCryptor.git", majorVersion: <majorVersion>, minor: <minor>)
]
要使用 Carthage 将 BlueCryptor 包含在项目中,请在您的 Cartfile
中添加一行,其中包含 GitHub 组织和项目名称以及版本。 例如
github "Kitura/BlueCryptor" ~> <majorVersion>.<minor>
要使用 CocoaPods 将 BlueCryptor 包含在项目中,只需将 BlueCryptor
添加到您的 Podfile
中,例如
platform :ios, '10.0'
target 'MyApp' do
use_frameworks!
pod 'BlueCryptor'
end
您需要做的第一件事是导入 Cryptor 框架。 这可以通过以下方式完成
import 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)
}
以下示例说明了如何从 String
和 NSData
的实例生成 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()
以下演示了如何使用字节数组作为密钥和数据来生成 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 还提供了一组数据操作实用程序函数,用于转换来自各种格式的数据
[UInt8]
)Data
[UInt8]
)NSData
[UInt8]
)NSString
[UInt8]
)String
)[UInt8]
)还提供了一个 API 来填充字节数组 ([UInt8]
),使其成为 block size in bytes
长度的整数倍。
func zeroPad(byteArray: [UInt8], blockSize: Int) -> [UInt8]
func zeroPad(string: String, blockSize: Int) -> [UInt8]
以下算法在 Linux 上不可用,因为它不受 OpenSSL 支持。
在所有情况下,使用不受支持的 API 或算法将导致 Swift fatalError()
,终止程序,应将其视为编程错误。
我们很乐意讨论服务器端的 Swift 和 Kitura。 加入我们的 Slack 与团队会面!
该库在 Apache 2.0 许可下获得许可。 完整的许可证文本可在 LICENSE 中获得。