Javascript:为什么通过Crypto-js生成的加密文件非常大?



我有以下代码使用Crypto-JS加密任何文件。

它工作正常,应该。

但是,与原始文件相比,生成的加密文件是巨大的!

示例:如果我使用2.99MB的文件并对其进行加密,则生成的加密文件将为5.3MB。

我能做些什么来保持加密文件尽可能小?

这是我的整个代码:

<!DOCTYPE html>
<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>Get Directory</title>
<!-- Update your jQuery version??? -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>

<!--
https://cdnjs.com/libraries/crypto-js
-->
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>

<!--[if lt IE 9]>
<script src="https://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<script> // type="text/javascript" is unnecessary in html5
// Short version of doing `$(document).ready(function(){`
// and safer naming conflicts with $
jQuery(function($) { 
$('#file-input').on('change', function() {
// You can't use the same reader for all the files
// var reader = new FileReader
$.each(this.files, function(i, file) {
// Uses different reader for all files
var reader = new FileReader
reader.onload = function() {
// reader.result refer to dataUrl
// theFile is the blob... CryptoJS wants a string...
var encrypted = CryptoJS.AES.encrypt(reader.result, '12334');


var ecr = encrypted.toString();

var blob = new Blob([ecr], {
"type": "text/plain"
});
var link = document.createElement("a");
link.download = "Encrypteddocument";
link.href = URL.createObjectURL(blob);

document.body.appendChild(link);
link.click();
document.body.removeChild(link);
//alert(encrypted);

}
reader.readAsDataURL(file)
$('#thelist').append('FILES: ' + file.name + '<br>')
})
})
});
</script>
</head>
<body>
<input type="file" id="file-input">
<div id="thelist"></div>

<input type="button" id="button" value="Save" />
</body>
</html>

任何帮助将不胜感激。

这个问题可能是很久以前提出的另一个问题的重复,但另一个问题没有有效或"接受"的答案。 所以这个问题仍然成立。

我们如何减小加密文件的大小?

加密不会改变数据的大小,除了可能添加块大小或更小的填充(AES 的块大小为 16 字节(,在块大小 aqnd/或身份验证(可能最多 100 字节(之前添加 IV。

因此,除了加密之外,还有其他事情正在增加文件大小,也许:

  1. 请注意,加密数据编码的更改(可能是对加密数据的 Base64 编码(不是保存到文件所必需的。

  2. 传递给加密函数的数据编码的更改。

var ecr = encrypted.toString();是可疑的,因为通常任意二进制数据(加密数据显示为随机字节(无法转换为可显示的字符串。必要时,通常使用 Base64 编码。Base64 编码将使数据扩展 33%(每 3 个字节 4 个 Base64 个字符。

来自旧的谷歌代码存档:

加密后返回的密文还不是字符串。这是一个CipherParams的对象。CipherParams对象允许您访问加密期间使用的所有参数。在字符串上下文中使用 CipherParams 对象时,它会根据格式策略自动转换为字符串。默认值为与 OpenSSL 兼容的格式。

示例如下:

var encrypted = CryptoJS.AES.encrypt("Message", "Secret Passphrase");
alert(encrypted.key);        // 74eb593087a982e2a6f5dded54ecd96d1fd0f3d44a58728cdcd40c55227522223
alert(encrypted.iv);         // 7781157e2629b094f0e3dd48c4d786115
alert(encrypted.salt);       // 7a25f9132ec6a8b34
alert(encrypted.ciphertext); // 73e54154a15d1beeb509d9e12f1e462a0
alert(encrypted);            // U2FsdGVkX1+iX5Ey7GqLND5UFUoV0b7rUJ2eEvHkYqA=

在最后一行中显示OpenSSL兼容格式也是Base 64编码的。

最新更新