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

Javascript:为什么通过Crypto js生成的加密文件非常大?,javascript,encryption,Javascript,Encryption,我有以下使用Crypto JS加密任何文件的代码 它工作得很好,而且应该如此 但是,生成的加密文件与原始文件相比是巨大的 示例:如果使用2.99MB的文件并对其进行加密,生成的加密文件将为5.3MB 我能做些什么使加密文件尽可能小 这是我的全部代码: <!DOCTYPE html> <html> <head> <meta content="text/html; charset=utf-8" http-equiv="Content-Type" /&

我有以下使用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>

获取目录
//type=“text/javascript”在html5中是不必要的
//doing`$(document).ready(function()的简短版本{`
//更安全的命名与$
jQuery(函数($){
$('#文件输入')。在('change',function()上{
//不能对所有文件使用同一个读卡器
//var reader=新文件读取器
$.each(this.files,function(i,file){
//对所有文件使用不同的读取器
var reader=新文件读取器
reader.onload=函数(){
//reader.result参考数据URL
//文件是blob…CryptoJS需要一个字符串。。。
var encrypted=CryptoJS.AES.encrypt(reader.result,'12334');
var ecr=encrypted.toString();
var blob=新blob([ecr]{
“类型”:“文本/普通”
});
var link=document.createElement(“a”);
link.download=“Encrypteddocument”;
link.href=URL.createObjectURL(blob);
document.body.appendChild(链接);
link.click();
document.body.removeChild(link);
//警报(加密);
}
reader.readAsDataURL(文件)
$(“#列表”).append('FILES:'+file.name+'
')) }) }) });
任何帮助都将不胜感激

这个问题可能是多年前提出的另一个问题的重复,但另一个问题没有有效或“被接受”的答案。因此,这个问题仍然存在


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

加密不会改变数据的大小,除了可能添加块大小或更小的填充(AES具有16字节的块大小),预先添加块大小aqnd/或身份验证(可能最多100字节)的IV

因此,除了加密之外,还有其他一些事情正在增加文件大小,可能是:

  • 加密数据编码的更改,可能是加密数据的Base64编码,请注意,保存到文件时不需要更改

  • 传递给加密函数的数据编码的更改


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

    来自旧Google代码存档:

    加密后返回的密文还不是字符串。它是一个
    CipherParams
    对象。
    CipherParams
    对象允许您访问加密期间使用的所有参数。当您在字符串上下文中使用CipherParams对象时,它会根据格式策略自动转换为字符串。efault是一种与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编码。

    可能与@James重复,问题可能相同,但该问题没有可接受的答案,并且给出的答案根本不完整。.toString方法接受编码类型,默认为十六进制。具体取决于您r用例您可以尝试其他受支持的编码器之一(作为.toString的参数)例如
    CryptoJS.enc.Base64
    CryptoJS.enc.Latin1
    CryptoJS.enc.Utf8
    。但这只是鹦鹉学舌的@James,这就是问题所在。大多数答案,特别是您指出的与此答案重复的答案,只是鹦鹉学舌地鹦鹉学舌了文档,而没有真正解决问题
    var encrypted=CryptoJS.AES.encrypt(reader.result,'12334'的输出);
    在base64中..将输出放大33%。如果您不想放大33%,您需要找出如何将输出以二进制格式放入文件中。您如何做到这一点我不知道,因为我不喜欢javascript..但这就是问题所在。不是真的。无论我加密的文件类型是什么…加密文件的大小总是一样的它比原始文件大得多。可以是图像、音频、php文件、html文件甚至文本文件。因此,它与建议的base64无关。@DavidHope什么是“不正确?”我说:“除了加密之外,还有其他事情在进行”并提供了两种可能性,但不限于这两种。你知道加密不会改变数据的大小,对吧?它不是文件的类型,而是处理数据,无论是在输入还是输出中,都会增加数据的大小。你检查过输出数据吗?如果是,它看起来像完全随机的8位da吗ta字节?你一直在说还有其他东西…我已经提供了工作代码,所以如果有“其他东西”,那么如果你告诉我们“其他东西”是什么,可能会有帮助!哈哈…。旁注,帮助永远不会有回报…)你知道加密不会改变数据的大小,对吗?AES的时间是16字节,这是一个块输入,一个块输出,这就是加密。我不做JavaScript,但我理解加密。你可以通过pr来帮助我