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
由于某种原因失败。)
我想将 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
由于某种原因失败。)