Swift - 第三方加密库CryptoSwift使用详解4(ChaCha20、Rabbit、Blowfish)
作者:hangge | 2017-12-08 08:10
七、其他加密算法
CryptoSwift 还提供了 ChaCha20、Rabbit、Blowfish 这三种加密算法,它们同上文介绍的 AES 一样都是对称加密算法。而且用法也差不多,加密时都需要提供一个密钥(key)和一个密钥偏移量(iv)。
1,ChaCha20
(1)基本介绍
- ChaCha20 是 ChaCha 系列流密码,作为 salsa 密码的改良版,具有更强的抵抗密码分析攻击的特性,“20”表示该算法有 20 轮的加密计算。
- 由于是流密码,故以字节为单位进行加密,安全性的关键体现在密钥流生成的过程,即所依赖的伪随机数生成器(PRNG)的强度,加密过程即是将密钥流与明文逐字节异或得到密文,反之,解密是将密文再与密钥流做一次异或运算得到明文。
- ChaCha20 已经在 RFC 7539 中标准化。
(2)使用样例
do {
let str = "欢迎访问 hangge.com"
print("原始字符串:\(str)")
let key = "hangge.com123456hangge.com123456"
print("key密钥:\(key)")
let iv = "12345678"
print("密钥偏移量:\(iv)")
//使用ChaCha20加密模式
let chiper = try ChaCha20(key: key.bytes, iv: iv.bytes)
//开始加密
let encrypted = try chiper.encrypt(str.bytes)
print("加密结果(base64):\(encrypted.toBase64()!)")
//开始解密
let decrypted = try chiper.decrypt(encrypted)
print("解密结果:\(String(data: Data(decrypted), encoding: .utf8)!)")
} catch { }
运行结果如下:

2,Rabbit
(1)基本介绍
- Rabbit 流密码是由 Cryptico 公司设计的,密钥长度 128 位,
- 最大加密消息长度为 264 Bytes,即 16 TB,若消息超过该长度,则需要更换密钥对剩下的消息进行处理。
(2)使用样例(iv 不是必需的):
do {
let str = "欢迎访问 hangge.com"
print("原始字符串:\(str)")
let key = "hangge.com123456"
print("key密钥:\(key)")
//使用Rabbit加密模式
let chiper = try Rabbit(key: key.bytes)
//开始加密
let encrypted = try chiper.encrypt(str.bytes)
print("加密结果(base64):\(encrypted.toBase64()!)")
//开始解密
let decrypted = try chiper.decrypt(encrypted)
print("解密结果:\(String(data: Data(decrypted), encoding: .utf8)!)")
} catch { }
运行结果如下:
3,Blowfish
(1)基本介绍
- Blowfish 算法是一个 64 位分组及可变密钥长度的对称密钥分组密码算法,可用来加密 64 比特长度的字符串。
- Blowfish 算法具有加密速度快、紧凑、密钥长度可变、可免费使用等特点,已被广泛使用于众多加密软件。
- 由于 Blowfish 算法采用变长密钥,这在给用户带来极大便利的同时也存在隐患。由于算法加/解密核心在于密钥的选择和保密,但在实际应用中经常使用一些弱密钥对信息资源进行加密,导致存在着很大的安全隐患。
- Blowfish 同上文介绍的 AES 一样,也拥有多种加密模式:ECB、CBC、CFB、CTR、OFB、PCBC
(2)使用样例1:使用 ECB 模式
do {
let str = "欢迎访问 hangge.com"
print("原始字符串:\(str)")
let key = "hangge.com123456"
print("key密钥:\(key)")
//使用Blowfish-ECB加密模式
let chiper = try Blowfish(key: key.bytes, blockMode: .ECB, padding: .pkcs7)
//开始加密
let encrypted = try chiper.encrypt(str.bytes)
print("加密结果(base64):\(encrypted.toBase64()!)")
//开始解密
let decrypted = try chiper.decrypt(encrypted)
print("解密结果:\(String(data: Data(decrypted), encoding: .utf8)!)")
} catch { }
运行结果如下:
(3)使用样例2:使用 CBC 模式
do {
let str = "欢迎访问 hangge.com"
print("原始字符串:\(str)")
let key = "hangge.com123456"
print("key密钥:\(key)")
let iv = "12345678"
print("密钥偏移量:\(iv)")
//使用Blowfish-CBC加密模式
let chiper = try Blowfish(key: key.bytes, blockMode: .CBC(iv: iv.bytes),
padding: .pkcs7)
//开始加密
let encrypted = try chiper.encrypt(str.bytes)
print("加密结果(base64):\(encrypted.toBase64()!)")
//开始解密
let decrypted = try chiper.decrypt(encrypted)
print("解密结果:\(String(data: Data(decrypted), encoding: .utf8)!)")
} catch { }
运行结果如下:
全部评论(0)