我想在Swift中使用带有CryptoSwift库的aes-128-ctr,但是我生成的密文太长了。
我的IV是16个字节,盐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,但我怎么得到这样的盐?
答案 0 :(得分:2)
根据CryptoSwift documentation,它默认使用PKCS7填充。由于CTR模式不需要填充,您可以(并且应该)通过将padding: .noPadding
添加到AES()
构造函数调用来禁用它。
对PBKDF2盐没有特殊的格式要求(它可以是字面上的任何随机字节串),因此您应该能够使用AES.randomIV()
(或任何其他随机字节源)来生成一个。
(Internally,CryptoSwift AES.randomIV()
代码似乎使用RandomBytesSequence,但不幸的是,CryptoSwitf的一部分似乎没有记录。我能找到的唯一用法示例,除了randomIV()
源代码本身是this test case。其中,BTW看起来像是一个非常糟糕的单元测试 - 所有看起来都在测试的是AnyIterator<UInt8>
实际返回UInt8
它甚至没有检查迭代器实际上是否返回了所请求的字节数,这可能完全无法完成,例如,如果由于某种原因打开/dev/urandom
失败。)