背景
最近项目有对一些配置项信息下发做了加解密的工作,所以记录一下。
实现
导入AES加解密框架 CryptoSwift
Easy to use
Convenient extensions for String and Data
Support for incremental updates (stream, ...)
iOS, Android, macOS, AppleTV, watchOS, Linux support
Hash (Digest)
MD5 | SHA1 | SHA2-224 | SHA2-256 | SHA2-384 | SHA2-512 | SHA3
Cyclic Redundancy Check (CRC)
CRC32 | CRC32C | CRC16
Cipher
AES-128, AES-192, AES-256 | ChaCha20 | Rabbit | Blowfish
RSA (public-key encryption algorithm)
Encryption, Signature
Message authenticators
支持多种算法加解密,很棒的库。
后台数据下发json为16进制字符串,我们要先通过转换成UInt8字节数组来解密
func fx_bytes(from hexStr: String) -> [UInt8] {
assert(hexStr.count % 2 == 0, "输入字符串格式不对,8位代表一个字符")
var bytes = [UInt8]()
var sum = 0
let intRange = 48...57
let lowercaseRange = 97...102
let uppercasedRange = 65...70
for (index, c) in hexStr.utf8CString.enumerated() {
var intC = Int(c.byteSwapped)
if intC == 0 {
break
} else if intRange.contains(intC) {
intC -= 48
} else if lowercaseRange.contains(intC) {
intC -= 87
} else if uppercasedRange.contains(intC) {
intC -= 55
} else {
assertionFailure("输入字符串格式不对,每个字符都需要在0~9,a~f,A~F内")
}
sum = sum * 16 + intC
if index % 2 != 0 {
bytes.append(UInt8(sum))
sum = 0
}
}
return bytes
}
加解密
// AES 解密
public func fx_decryptStr(value: String) -> String {
var key = "abcdabcdabcdabcdabcdabcdabcdabc"
let iv = "00000000000000000000000000000000"
do {
let aes = try AES(key: fx_bytes(from: key), blockMode: CBC(iv:fx_bytes(from: iv)), padding: .pkcs7)
let decrypted = try aes.decrypt(fx_bytes(from: value))
let datastring = String(bytes: decrypted, encoding: .utf8)
return datastring ?? value
} catch {
return value
}
}
// AES 加密
public func fx_encryptStr(value: String) -> String {
var key = "abcdabcdabcdabcdabcdabcdabcdabc"
let iv = "00000000000000000000000000000000"
do {
let aes = try AES(key: fx_bytes(from: key), blockMode: CBC(iv:fx_bytes(from: iv)), padding: .pkcs7)
let encrypted = try aes.encrypt(fx_bytes(from: value))
return String(bytes: Data(encrypted).bytes, encoding: .utf8) ?? value
} catch {
return value
}
}