Swift - AES 128 ctr,密文太长

时间:2017-10-28 19:59:44

标签: swift encryption cryptography aes cryptoswift

我想在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,但我怎么得到这样的盐?

1 个答案:

答案 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失败。)