Javascript 让crypto.minute.encrypt像CryptoJS.AES.encrypt一样工作

Javascript 让crypto.minute.encrypt像CryptoJS.AES.encrypt一样工作,javascript,cryptography,aes,cryptojs,webcrypto-api,Javascript,Cryptography,Aes,Cryptojs,Webcrypto Api,我编写了一个使用CryptoJS实现的系统 在编写代码之后,我发现了crypto.minute.encrypt,它是内置于浏览器中的AES实现 我想将我的代码从使用CryptoJs改为使用crypto.minute.encrypt 以旧方式(CryptoJS)编码的数据必须与新方式(crypto.minute.encrypt)兼容 我怎样才能做到这一点 当我编写我的原始代码时,它看起来很像: function cryptojs_encrypt(message) { var key = "

我编写了一个使用CryptoJS实现的系统

在编写代码之后,我发现了
crypto.minute.encrypt
,它是内置于浏览器中的AES实现

我想将我的代码从使用CryptoJs改为使用crypto.minute.encrypt

以旧方式(CryptoJS)编码的数据必须与新方式(crypto.minute.encrypt)兼容

我怎样才能做到这一点

当我编写我的原始代码时,它看起来很像:

function cryptojs_encrypt(message) {
    var key = "my password";
    return CryptoJS.AES.encrypt(message, key).toString());
}
// Initialize the library
initWebCrypto();

// Encrypt your stuff
WebCrypto.encrypt({
    data: btoa("my message"),
    password: "my password",
    callback: function(response){
        if( !response.error ){
            console.log(response.result); // Compatible with CryptoJS
        }else{
            console.error(response.error);
        }
    }
});
其中传入的“键”只是一个字符串。根据我从其他stackoverflow问题中读到的内容,CryptoJS将该字符串转换为“key”和“iv”。这究竟是如何实现的?我试图查看CryptoJS源代码,但找不到我要找的内容

encrypt.encrypt的工作方式是,必须显式地传入密钥和iv。这是我的密码:

function subtle_encrypt(message) {
    var msg = new TextEncoder().encode(message);
    var pass = new TextEncoder().encode('my password');
    var alg = { name: 'AES-CBC', iv: pass };
    crypto.subtle.importKey('raw', pass, alg, false, ['encrypt']).then(function(key){
        crypto.subtle.encrypt(alg, key, msg).then(function(ctBuffer){
            var string = btoa(ctBuffer);
            console.log("result", string);
        });
    });
}

这可以工作,但会返回不同的结果。我需要修改进入
alg
的参数,该参数与您传入字符串时CryptoJS使用的参数相匹配。我如何做到这一点?

我创建了一个小型库来实现这一点

在文档中嵌入(缩小)

像这样使用它:

function cryptojs_encrypt(message) {
    var key = "my password";
    return CryptoJS.AES.encrypt(message, key).toString());
}
// Initialize the library
initWebCrypto();

// Encrypt your stuff
WebCrypto.encrypt({
    data: btoa("my message"),
    password: "my password",
    callback: function(response){
        if( !response.error ){
            console.log(response.result); // Compatible with CryptoJS
        }else{
            console.error(response.error);
        }
    }
});
有关更多示例,请参见

源代码:


希望这有帮助

您必须实现OpenSSL的
EVP\u BytesToKey
函数,该函数也需要MD5。这不是您想要重新实现的东西,因为它不是真正安全的。此外,在添加到@ArtjomB的WebCryptoApi中,MD5似乎不可用。crypto js以与OpenSSL兼容的方式将密码短语输入转换为密钥和IV(请参阅此处的互操作性部分:)。密码短语的OpenSSL转换如下所述:。令人失望的是,crypto js与OpenSSL中不太理想的安全算法进行互操作。