Swift - AES 128 ctr,密文太长

Swift - AES 128 ctr, ciphertext too long

我想将 Swift 中的 aes-128-ctr 与 CryptoSwift 库一起使用,但是我生成的密文太长了。

我的IV是16字节,salt是32字节,aes明文也是32字节,为什么生成的密文是48字节,还要补16字节?

let salt: [UInt8] = Array("tkmlidnonknkqgvapjrpdcductebsozn".utf8) 
let derivedKey = try PKCS5.PBKDF2(password: password, salt: salt, iterations: numberOfIterations, variant: .sha256).calculate()
let iv: [UInt8] = Array("abcdefgthksdfghj".utf8)
let aesKey: [UInt8] = Array(derivedKey[..<16])
let aes = try AES(key: aesKey, blockMode: .CTR(iv: iv))
let ciphertext = try aes.encrypt(password)

这里的密码就是上面提到的32字节明文

另外,有什么方法可以生成随机盐吗?我发现

let iv: [UInt8] = AES.randomIV(AES.blockSize)

生成随机 IV,但是如何获得这样的盐?

根据CryptoSwift documentation,它默认使用PKCS7 填充。由于 CTR 模式不需要填充,您可以(并且应该)通过将 padding: .noPadding 添加到 AES() 构造函数调用来禁用它。

PBKDF2 盐没有特殊的格式要求(它可以是任何随机字节串),所以你应该能够使用 AES.randomIV()(或任何其他随机字节源)来生成一.

(Internally, the CryptoSwift AES.randomIV() code seems to use RandomBytesSequence, but unfortunately that part of CryptoSwitf appears to be undocumented. The only usage example I could find, besides the randomIV() source code itself, is this test case。顺便说一句,这看起来像是一个非常糟糕的单元测试——它似乎在测试的是 AnyIterator<UInt8> 实际上是 returns UInt8 值。它甚至不检查迭代器实际上 returns 请求的字节数,它可能完全无法做到,例如,如果打开 /dev/urandom 由于某种原因失败。)