swift - 具有 AES128 CTR 模式的 CryptoSwift - 错误计数器增量?
问题描述
我在CryptoSwift-API (krzyzanowskim)
使用和我的测试函数时遇到了一个问题,AES128
该函数在特定的计数器值(0 到 25 = 13 和 24 之间)上产生错误的数组计数,通常应该是 16!即使我使用带有错误值 13 的手动递增的“iv_13”而不是默认的“iv_0”和计数器 13... 测试一下以了解我的意思。CTR-Mode
(nullArrayBugTest())
func nullArrayBugTest() {
var ctr:CTR
let nilArrayToEncrypt = Data(hex: "00000000000000000000000000000000")
let key_ = Data(hex: "000a0b0c0d0e0f010203040506070809")
let iv_0: Array<UInt8> = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f]
//let iv_13: Array<UInt8> = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x1c]
var decryptedNilArray = [UInt8]()
for i in 0...25 {
ctr = CTR(iv: iv_0, counter: i)
do {
let aes = try AES(key: key_.bytes, blockMode: ctr)
decryptedNilArray = try aes.decrypt([UInt8](nilArrayToEncrypt))
print("AES_testcase_\(i) for ctr: \(ctr) withArrayCount: \(decryptedNilArray.count)")
}catch {
print("De-/En-CryptData failed with: \(error)")
}
}
}
为什么我总是需要具有 16 个值的加密数组的问题并不重要:D。
有人知道为什么aes.decrypt()
-function 会像我收到的那样处理吗?
谢谢你的时间。
迈克尔·S。
解决方案
CryptoSwift 默认为 PKCS#7 填充。您生成的明文有无效的填充。CryptoSwift 忽略填充错误, IMO 是一个错误,但这就是它的实现方式。(您认为“正确”的所有计数器都应该根本无法解密。) (我与 Marcin 讨论过这个问题,他提醒我,即使在这个低级别,忽略填充错误以避免填充 oracle 也是正常的攻击。我忘记了我也是这样做的......)
也就是说,有时填充将“足够接近”,以至于 CryptoSwift 会尝试删除填充字节。它通常不是有效的填充,但对于 CrypoSwift 的测试来说已经足够接近了。
例如,您的第一个计数器创建以下填充明文:
[233, 222, 112, 79, 186, 18, 139, 53, 208, 61, 91, 0, 120, 247, 187, 254]
254 > 16,因此 CryptoSwift 不会尝试删除填充。
对于 13 的计数器,将返回以下填充明文:
[160, 140, 187, 255, 90, 209, 124, 158, 19, 169, 164, 110, 157, 245, 108, 12]
12 < 16,所以 CryptoSwift 删除 12 个字节,留下 4 个。(这不是 PKCS#7 填充的工作方式,但 CryptoSwift 是这样工作的。)
根本的问题是你没有解密你加密的东西。您只是通过解密方案运行一个静态块。
如果您不想要填充,您可以要求:
let aes = try AES(key: key_.bytes, blockMode: ctr, padding: .noPadding)
这将返回您所期望的。
以防其他读者有任何困惑:CTR 的这种使用非常不安全,不应复制任何部分。我假设实际的加密代码不能像这样工作。
推荐阅读
- html - 从网站中删除 .html 扩展名
- android - 执行 adb-sync 后,文件 * 真的 * 存在于哪里?
- angular - 将属性公开为可观察对象的最简单语法?
- excel - 如何在 Excel 中编写 Countifs 公式?
- ruby-on-rails - Cancancan ActiveAdmin:跳过对 :create 的授权
- swift - 在 Swift 中继承 NSLayoutConstraint
- r - 在 Shiny 中,我只想在 UI 加载期间更新选择输入()一次
- java - 未找到名称为“默认”的配置 gradle 同步失败
- apache-zeppelin - 在 Windows 10 或 7 的 Apache Zeppelin 中运行 spark 程序时出错
- html - 具有持久纵横比的响应式 CSS 网格