如何解决我可以在不呈指数级增长的情况下多次加密一个文件吗?
以下导致 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 算法/方法/方法不会导致指数大小增加?
或者这是不可能的?
注意:如果我不使用 toString()
,当我尝试重新加密已经加密的内容时它会中断。我得到一个 UnhandledPromiseRejectionWarning: RangeError: Invalid array length
。
解决方法
运行你的代码对我来说会超时。加密字符串显然变得很长,因为它是 base64 编码的。
我们可以通过加密 wordarray 而不是 wordarray 的 base64 编码版本来减少它增加的程度:
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)
}
这运行得很快,并创建一个每次迭代仅增长几个字节的字符串。您可以通过设置填充选项或传入可能阻止添加盐参数的 key/iv 对来减少更多。
解密看起来像:
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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。