1

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);
};

復号化 (16 進入力を受け取ります):

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が定義されている最後から 2 番目のステートメントでスローされます。

sjcl 例外を調べたところ、長さ 4 の入力を探しているように見えますが、これは WordArray であると推測しています。有効な入力を取得する方法がわかりません。私が言ったように、暗号文、iv、hmac タグ、ソルトはすべて JavaScript 側で適切にスライスされています。エンコーディングの問題かもしれません。

このエラーは、json (形式: '{"key":"value"}') でのみ発生しているようにも見えます。「Hello, world」などを試したところ、エラーなしで 4 ワードの配列が返されました。

助言がありますか?

4

1 に答える 1