【问题标题】:Using SubtleCrypto in IE 11在 IE 11 中使用 SubtleCrypto
【发布时间】:2021-08-10 09:42:31
【问题描述】:

我正在尝试让 SubtleCrypto 与 IE 11 一起使用。具体来说,我只是想简单地加密一些东西,让我开始,我已经能够为 AES-CBC 生成一个密钥,但是当我尝试进行加密我得到一个错误:“类型不匹配错误”。

我有一个 JSFiddle:https://jsfiddle.net/tuwzsyyp/

        try {
            //Asynchronous crypto
            window.msCrypto.subtle.generateKey(
                { name: 'AES-CBC', length: 256 },
                false,
                ['encrypt']
                )
                .oncomplete = function (key) {
                    try {
                        window.msCrypto.subtle.encrypt(
                            {
                                name: "AES-CBC",
                                iv: initialisationVector
                            },
                            key, //from generateKey or importKey above
                            new Uint16Array(currentArrayBuffer) //ArrayBuffer of data you want to encrypt
                            ).oncomplete = function (encrypted) {
                                alert(3 + "; " + new Uint16Array(encrypted));
                            };
                    } catch (err) {
                        alert(err);
                    }
                };
        } catch (err) {
            alert(err);
        }

我认为输入数据的类型很可能是错误的,但 Microsoft 文档并不清楚。它说它需要是一个 ArrayBufferView 但据我所知 Uint16Array 应该满足它。

【问题讨论】:

    标签: javascript


    【解决方案1】:

    我找到了答案here

    事实证明,IE 11 是返回一个事件而不是直接返回结果。因此,我的示例代码变为:

    window.msCrypto.subtle.generateKey(
                    { name: 'AES-CBC', length: 256 },
                    false,
                    ['encrypt']
                    )
                    .oncomplete = function (e) {
                        var key = e.target.result;
    
                        try {
                            window.msCrypto.subtle.encrypt(
                                {
                                    name: "AES-CBC",
                                    iv: initialisationVector
                                },
                                key, //from generateKey or importKey above
                                new Uint16Array(currentArrayBuffer) //ArrayBuffer of data you want to encrypt
                                ).oncomplete = function (e) {
                                    var encrypted = e.target.result;
    
                                    alert(3 + "; " + ab2str(encrypted));
                                };
                        } catch (err) {
                            alert(err);
                        }
                    };
    

    这就是我们遵守规范的原因。

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 2015-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-21
      • 2014-03-20
      • 1970-01-01
      相关资源
      最近更新 更多