“无效的AES块大小” SJCL解密 - javascript

尝试使用使用SJCL的RNCryptor-js解密AES。在记录了每一端的所有步骤(另一端为RNCryptor-python)之后,密钥,盐,HMAC哈希值都将匹配。但是当我进入最后一步时:

var aes = new sjcl.cipher.aes(encryption_key);
sjcl.beware["CBC mode is dangerous because it doesn't protect message integrity."]()
var decrypted = aes.decrypt(ciphertext, iv);

我得到错误:

 sjcl.exception.invalid {toString: function, message: "invalid aes block size"}

这是完整的代码:

PBKDF2:

this.KeyForPassword = function(password, salt) {

  var hmacSHA256 = function (password) {
      var hasher = new sjcl.misc.hmac(password, sjcl.hash.sha256);
      this.encrypt = function () {
          return hasher.encrypt.apply(hasher, arguments);
      };
  };
  return sjcl.misc.pbkdf2(password, salt, 10000, 32 * 8, hmacSHA256);
};

解密(接受十六进制输入):

this.decrypt = function(password, message, options) {

  message = sjcl.codec.hex.toBits(message);

  options = options || {};

  var version = sjcl.bitArray.extract(message, 0 * 8, 8);
  var options = sjcl.bitArray.extract(message, 1 * 8, 8);

  var encryption_salt = sjcl.bitArray.bitSlice(message, 2 * 8, 10 * 8);
  var encryption_key = _this.KeyForPassword(password, encryption_salt, "decryption");

  var hmac_salt = sjcl.bitArray.bitSlice(message, 10 * 8, 18 * 8);
  var hmac_key = _this.KeyForPassword(password, hmac_salt, "decryption");

  var iv = sjcl.bitArray.bitSlice(message, 18 * 8, 34 * 8);

  var ciphertext_end = sjcl.bitArray.bitLength(message) - (32 * 8);
  var ciphertext = sjcl.bitArray.bitSlice(message, 34 * 8, ciphertext_end);

  var hmac = sjcl.bitArray.bitSlice(message, ciphertext_end);
  var expected_hmac = new sjcl.misc.hmac(hmac_key).encrypt(sjcl.bitArray.bitSlice(message, 0, ciphertext_end));

  if (! sjcl.bitArray.equal(hmac, expected_hmac)) {
    throw new sjcl.exception.corrupt("HMAC mismatch or bad password.");
  }

  var aes = new sjcl.cipher.aes(encryption_key);
  sjcl.beware["CBC mode is dangerous because it doesn't protect message integrity."]()
  var decrypted = aes.decrypt(ciphertext, iv);

  return decrypted;
}

错误在定义了decrypted的倒数第二条语句上引发。

我看了看sjcl异常,看起来它正在寻找长度为4的输入,我猜这是一个WordArray。我只是不知道如何获得有效的输入。就像我说的那样,密文,iv,hmac标签,盐都已在javascript端正确地切片。可能只是编码问题。

这个错误似乎也只发生在json(格式:'{“ key”:“ value”}')上,当我尝试类似“ Hello,world”之类的东西时,我得到了一个没有错误的4字数组。

有什么建议?

参考方案

 var decrypted = aes.decrypt(ciphertext, iv);

应该

 var decrypted = sjcl.mode.cbc.decrypt(aes, ciphertext, iv);

我也遇到了在cbc.js (link to source)中发生填充问题的麻烦,事实证明我没有包含bitArray.js (link),后者包含重要的xor函数(不要与简单的^运算符相混淆) )。

所以:包括bitArray.js

输出也应该编码:

return sjcl.codec.utf8String.fromBits(decrypted);

Javascript-从当前网址中删除查询字符串 - javascript

单击提交按钮后,我需要从网址中删除查询字符串值。我可以用jQuery做到这一点吗?当前网址:siteUrl/page.php?key=value 页面提交后:siteUrl/page.php 实际上,我已经从另一个带有查询字符串的页面着陆到当前页面。我需要在页面首次加载时查询字符串值以预填充一些详细信息。但是,一旦我提交了表格,我就需要删除查询字符串值。我已…

使用php echo定义一个javascript var - javascript

我已经看到了对该问题的多个答复-因此,我敢肯定有人会很快将其标记为重复,但是我在任何其他线程中都没有看到该特定问题的答案。我有两个测试文件:a.php和a.js在a.php中,我定义$q = $_GET['q']; 效果很好。然后,我调用一个单独的a.js文件,其中有:var partNumber = " <?php ec…

Javascript IF语句 - javascript

                        嗨,我有这段代码可以正常工作,并将两个日历显示为一个日历。我还有一个php变量$login_session,其中包含登录电子邮件地址的用户。关于如何显示[email protected]日历的任何想法(伪代码)IF $login_session == "[email protected]&#…

如何根据手势滚动网页 - javascript

如何使用pyhton / javascript使用手势向上/向下或向左/向右滚动页面。我尝试了很多找到解决方案,但无法解决。 参考方案 Javascript手势插件(JSHG)是一个很棒的插件,它使您可以通过现有网站或Web应用程序中的网络摄像头来支持用户的手势识别。您无需具有计算机视觉的任何背景即可使用此插件。当前,它提供了一组基本的手势,其中包括手的位置…

从一个脚本到另一个脚本的统一变量访问 - javascript

所以我有一个统一的3D文本上的文本网格脚本,我希望它从具有OnMouseDown函数的多维数据集中访问一个变量,在该函数内部它会更改分数,并且我希望将该分数输出到文本。当我在CS中编写文本脚本时,多维数据集脚本是用JavaScript编写的。谁有想法? 参考方案 如果我误解了您的问题,请纠正我。选项1:C#代码在js代码之前进行编译,这意味着您无权从c#代码…