0

我已经在我的一个应用程序中成功实现了 Rob Napier 的 iOS AES 加密方法。我现在希望能够使用我的 JavaScript 实现加密和解密该应用程序中的文件。我正在使用 FileReader 从用户那里获取本地信息并加载它

reader.readAsArrayBuffer(file);

完成此操作后,文件将使用斯坦福 JavaScript 加密库进行加密,最后可以下载加密文件:

reader.onloadend = function(e) {

    var content = new Uint8Array(e.target.result);
    var utf8 = "";
    for (var i = 0, len = content.length; i < len; i++) {
         utf8 += String.fromCharCode(content[i]);
    }
    var b64 = btoa(utf8);

    //we finally encrypt it 
    var encrypted = sjcl.encrypt(password, b64,{ks:256});
    var json = JSON.parse(encrypted);
    var ciphertext = json.ct;

    a.attr('href', 'data:application/octet-stream,' + ciphertext);
    a.attr('download', file.name + '.encrypted');

    step(4);

    };

reader.readAsArrayBuffer(file);

问题是加密文件比原始文件大得多。在我的 iOS 实现中情况并非如此,它工作得很好。当然,它不能毫无错误地解密。事实上,生成的文件将有 0 个字节的大小。

我希望有人可以向我指出我的代码中的错误。那真的很棒。

@邓肯:

谢谢你。我对此进行了调查,但我不确定我必须采取的所有步骤。尤其是它们在代码中的含义。也许有人可以在这里帮助我。非常感谢!

加密

  1. 生成随机加密盐
  2. 使用 PBKDF2 生成加密密钥(请参阅您的语言文档了解如何调用它)。将密码作为字符串、随机加密盐和 10,000 次迭代传递。
  3. 生成随机 HMAC 盐
  4. 使用 PBKDF2 生成 HMAC 密钥(请参阅您的语言文档了解如何调用它)。将密码作为字符串、随机 HMAC 盐和 10,000 次迭代传递。
  5. 生成随机 IV
  6. 使用加密密钥(上图)、IV(上图)、AES-256 和 CBC 模式加密数据。这是几乎所有 AES 加密库的默认模式。
  7. 将您的标头和密文以及 HMAC 密钥(上图)和 PRF“SHA-256”(有关 PRF 函数的名称,请参阅您的库的文档;这也可能称为“SHA- 2, 256 位”)。
  8. 按照上面给出的格式将这些元素放在一起。
4

1 回答 1

1

使用加密密钥(上图)、IV(上图)、AES-256 和 CBC 模式加密数据。这是几乎所有 AES 加密库的默认模式。

这是一个错误的假设,根据这个sjcl 使用 ccm 作为默认模式。

于 2013-12-03T12:55:45.847 回答