SJCL を使用する RNCryptor を使用します。16 進メッセージを復号化しようとしていますが、CBC モードを使用すると、状況がおかしくなります。どうやら、CBC を使用するときに beware ステートメントを宣言する必要があり、エラーが発生します。
function KeyForPassword(password, salt) {
console.log("Creating key...");
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);
};
function decrypt(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);
var hmac_salt = sjcl.bitArray.bitSlice(message, 10 * 8, 18 * 8);
var hmac_key = _this.KeyForPassword(password, hmac_salt);
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));
// .equal is of consistent time
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 = sjcl.mode.cbc.decrypt(aes, ciphertext, iv);
return decrypted.toString(CryptoJS.enc.Utf8);
};
ソルト、キー、およびハッシュに関して、すべてが Python 側の暗号化と一致します。しかし、私はこのエラーが発生します:
TypeError: Cannot read property 'CBC mode is dangerous because it doesn't protect message integrity.' of undefined
このメソッドは非推奨になっていると思われるため、この CryptoJS メソッドを使用しようとしました。
var decrypted = CryptoJS.AES.decrypt(ciphertext, encryption_key, {iv:iv});
これは空白の文字列を返しました。
私は本当に近づいているように感じます。この最後の部分で助けが必要です。ありがとう。