Microsoft Edge 中的公钥加密

Posted

技术标签:

【中文标题】Microsoft Edge 中的公钥加密【英文标题】:Public Key Encryption in Microsoft Edge 【发布时间】:2016-01-07 16:29:32 【问题描述】:

我有以下 javascript 代码来使用 Web Cryptography API 实现公钥加密。它适用于 Firefox 和 Chrome,但不适用于 Microsoft Edge。我从 Edge 得到的错误是“由于错误 80700011 无法完成操作。”我错过了什么?

<script>
    var data = new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);

    var crypto = window.crypto || window.msCrypto;
    var cryptoSubtle = crypto.subtle;

    cryptoSubtle.generateKey(
        
            name: "RSA-OAEP",
            modulusLength: 2048, 
            publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
            hash:  name: "SHA-256" , 
        ,
        true, 
        ["encrypt", "decrypt"]
    ).then(function (key)  
        console.log(key);
        console.log(key.publicKey);
        return cryptoSubtle.encrypt(
            
                name: "RSA-OAEP"
            ,
            key.publicKey,
            data
            );
    ).then(function (encrypted)  
        console.log(new Uint8Array(encrypted));
    ).catch(function (err) 
        console.error(err);
    );
</script>

【问题讨论】:

“W3CException_DOM_TYPE_MISMATCH_ERR:节点类型与预期的参数类型不兼容。”也许不是很有帮助,但这就是我能找到的全部。也许这表明问题出在代码的其他地方。 感谢@JamesKPolk。没有别的了。这是一个带有上述代码的空白页面。它也适用于 Firefox 和 Chrome。 【参考方案1】:

我找到了这个问题的原因。我必须在调用加密函数时添加哈希字段:

        return cryptoSubtle.encrypt(
            
                name: "RSA-OAEP",
                hash:  name: "SHA-256" 
            ,
            key.publicKey,
            data
            );

这与Web Cryptography API Spec 不匹配,但可以。

【讨论】:

如果此处的 Edge 行为不符合规范,请考虑提交针对 Edge 的错误,并尽可能在此处发布该错误的链接。【参考方案2】:

crypto.subtle.sign 也有同样的问题。需要添加哈希算法(Safari 中同样的问题)

替换

crypto.subtle.sign(
            
                 name: "RSASSA-PKCS1-v1_5"
            ,
            cryptoKey,
            digestToSignBuf);

crypto.subtle.sign(
            
                 name: "RSASSA-PKCS1-v1_5", 
                 hash: "SHA-256"
            ,
            cryptoKey,
            digestToSignBuf);

【讨论】:

以上是关于Microsoft Edge 中的公钥加密的主要内容,如果未能解决你的问题,请参考以下文章

非对称加密中的公钥和私钥怎么来的

公钥加密的常见算法

如何使用公钥加密openssl中的大文件

dotnet c#中的公钥RSA加密

认识区块链—— 非对称加密

公钥加密中的各种密钥有啥区别