2

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

编写代码后,我发现crypto.subtle.encrypt这是浏览器内置的 AES 实现。

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

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

我怎样才能做到这一点?

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

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

传入的“key”只是一个字符串。根据我从其他 stackoverflow 问题中了解到的内容,CryptoJS 将此字符串转换为“key”和“iv”。这究竟是如何实现的?我尝试浏览 CryptoJS 源代码,但找不到我要找的东西。

微妙.crypt.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 使用的参数相匹配的参数。我该怎么做呢?

4

1 回答 1

2

为此,我创建了一个小型库。

在您的文档中 嵌入WebCrypto.js (缩小版)。

像这样使用它:

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

有关更多示例,请参阅https://github.com/etienne-martin/WebCrypto.swift/blob/master/www/index.html

源代码:https ://github.com/etienne-martin/WebCrypto.swift/blob/master/source.js

希望这可以帮助!

于 2017-05-03T18:20:50.193 回答