我可以在文件不呈指数增长的情况下多次加密文件吗?

Can I encrypt a file multiple times without an exponential file increase?

以下导致 encrypted 的大小呈指数增长:

let original = 'something'
let passphrase = 'whatever'
let times = 100
let i = 0

let encrypted = CryptoJS.AES.encrypt(original, passphrase).toString()

while (i < times) {
  encrypted = CryptoJS.AES.encrypt(encrypted, passphrase).toString()
  i++
}

是否有其他一些我可以使用的 CryptoJS algorithm/method/approach 不会 导致大小呈指数增长?

或者这是不可能的?

注意: 如果我不使用 toString() 它会在我尝试重新加密已经加密的内容时中断。我得到一个 UnhandledPromiseRejectionWarning: RangeError: Invalid array length.

运行 你的代码对我来说会超时。加密字符串显然变得很长,因为它是 base64 编码的。

我们可以通过加密 wordarray 而不是 base64 编码版本的 wordarray 来减少它增加的数量:

let original = 'something'
let passphrase = 'whatever'
let times = 100
let i = 0

let encrypted = CryptoJS.AES.encrypt(original, passphrase).toString()
encrypted = CryptoJS.enc.Base64.parse(encrypted)

while (i < times) {
  encrypted = CryptoJS.AES.encrypt(encrypted, passphrase).toString()
  i++
  encrypted = CryptoJS.enc.Base64.parse(encrypted)
}

http://jsfiddle.net/dwvxua96/

这运行速度很快,创建的字符串每次迭代仅增长几个字节。您可以通过设置填充选项或传入 key/iv 对来进一步减少它,这可能会阻止添加 salt 参数。

解密看起来像:

i = 0
while (i <= times) {
  encrypted = CryptoJS.AES.decrypt(encrypted, passphrase)
  encrypted = CryptoJS.enc.Base64.stringify(encrypted);
  i++
}


encrypted = CryptoJS.enc.Base64.parse(encrypted);
encrypted = CryptoJS.enc.Utf8.stringify(encrypted)