首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SJCL CBC模式不解密

SJCL CBC模式不解密
EN

Stack Overflow用户
提问于 2015-08-24 22:21:50
回答 2查看 1.2K关注 0票数 1

使用RNCryptor,它使用SJCL。我试图解密一条十六进制信息,但当使用CBC模式时,事情会变得很奇怪。显然,在使用CBC时,必须声明一条小心语句,而我得到了一个错误。

代码语言:javascript
复制
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端的加密在盐类、密钥和散列方面相匹配。但我知道这个错误:

代码语言:javascript
复制
TypeError: Cannot read property 'CBC mode is dangerous because it doesn't protect message integrity.' of undefined

我认为这个方法是不推荐的,所以我尝试使用这个CryptoJS方法:

代码语言:javascript
复制
var decrypted = CryptoJS.AES.decrypt(ciphertext, encryption_key, {iv:iv});

这只是返回了一个空字符串。

我觉得我真的很亲密,只是在最后的部分需要一些帮助,谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-02 01:47:22

正如Artjom .所说的,cbc.jsbitArray.js (解密的必要部分和我缺少的东西)一样是必需的。原来的代码现在运行良好。

正如罗伯纳皮尔所指出的,在PBKDF2迭代计算中,它是缓慢的。然而,对于这种情况(解密),10K计数工作得很快,但是对于加密,我在1000次迭代时用CryptoJS的PBKDF2来补充kdf (用sjcl获取bitArray错误)。

票数 0
EN

Stack Overflow用户

发布于 2015-08-25 08:29:43

SJCL

如果您查看sjcl.js,CBC不包含在预构建的基于GitHub的配置中。您必须在页面中单独包含CBC文件(core/cbc.js),否则需要操作配置文件以将cbc添加到已启用模块的列表中。

CryptoJS

decrypted不是空字符串。CryptoJS.<cipher>.decrypt()返回一个负数为sigBytesWordArray对象。此属性表示期望WordArray包含的字节数。负数意味着出了问题。它不一定总是一个负数。

可能会有一些问题:

  • 你没有正确的钥匙。
  • 你没有正确分割的密文。
  • ciphertext不是OpenSSL格式的字符串,也不是CipherParams对象。试着通过{ciphertext: ciphertext}
  • 键和IV格式不正确:它们应该是WordArray对象。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32192697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档