gpt4 book ai didi

rsa - 无法使用 SubtleCrypto Web Crypto API 解密使用 PyCryptodome 加密的 RSA-OAEP 消息

转载 作者:行者123 更新时间:2023-12-04 00:16:19 29 4
gpt4 key购买 nike

在服务器端我使用PyCryptodome使用 RSA-OAEP(使用 SHA-256)加密消息。
我正在尝试使用 SubtleCrypto 解密消息客户端的 Web Crypto API,但它给了我一个 DOMException 错误,没有更多细节。
在 SubtleCrypto 上,我可以毫无问题地导入在 PyCryptodome 中生成的私钥,但是当我尝试解密消息时它给了我错误。

我还尝试在客户端导入 PyCryptodome 上生成的公钥,以使用 SubtleCrypto 加密相同的消息。在这种情况下,我可以毫无问题地解密它,使用与以前相同的流程。

这两个库之间的 RSA-OAEP 算法是否不兼容?我注意到 PyCryptodome 引用了 RFC 8017(v2.2)和 SubtleCrypto RFC 3447(v2.1)在他们各自的文档中。

编辑:

  • 服务器端代码(pycryptodome==3.9.8):

      from Crypto.PublicKey import RSA
    from Crypto.Cipher import PKCS1_OAEP

    class Cipher:

    def rsa_encrypt(self, data, key_string):
    key = RSA.importKey(key_string)
    rsa_encryption_cipher = PKCS1_OAEP.new(key)
    ciphertext = rsa_encryption_cipher.encrypt(data)
    return base64.b64encode(ciphertext)

    def rsa_decrypt(self, data, key_string):
    data = base64.b64decode(data)
    key = RSA.importKey(key_string)
    rsa_decryption_cipher = PKCS1_OAEP.new(key)
    plaintext = rsa_decryption_cipher.decrypt(data)
    return plaintext

    ( ... )
  • 客户端代码

    private decryptRSAString (encryptedText: string, privateKey: string) : Observable<ArrayBuffer> {

    return Observable.create ((observer: any) => {

    let keyBuffer: ArrayBuffer = this.str2ab(window.atob(privateKey));
    let encryptedTextBuffer: ArrayBuffer = this.str2ab(window.atob(encryptedText));
    let algorithmParams: RsaHashedImportParams = {
    name: "RSA-OAEP",
    hash: "SHA-256"
    };
    window.crypto.subtle.importKey(
    'pkcs8',
    keyBuffer,
    algorithmParams,
    true,
    ["decrypt"]
    ).then (
    (cryptoKey: CryptoKey) => {
    window.crypto.subtle.decrypt(
    {
    name: "RSA-OAEP"
    },
    cryptoKey,
    encryptedTextBuffer
    ).then (
    (decryptedMessage: ArrayBuffer) => {
    observer.next (decryptedMessage);
    observer.complete();
    },
    (error: any) => {
    observer.error (error)
    }
    )
    },
    (error: any) => {
    observer.error (error)
    }
    );
    });
    }

最佳答案

PyCryptodome应用 SHA-256 作为 OAEP 的默认摘要,但 SHA-1,here .因此,必须在 WebCrypto 端使用 SHA-1:

let algorithmParams: RsaHashedImportParams = {
name: "RSA-OAEP",
hash: "SHA-1"
};

当然,您也可以在 PyCryptodome 端应用 SHA-256,然后在 WebCrypto 端无需更改。

from Crypto.Hash import SHA256
...
rsa_encryption_cipher = PKCS1_OAEP.new(key, SHA256) # default: Crypto.Hash.SHA1

通过双方一致的摘要,我可以使用您的 WebCrypto 代码成功解密密文,该代码是我之前使用您的 PyCryptodome 代码生成的(使用我自己的 key )。

关于rsa - 无法使用 SubtleCrypto Web Crypto API 解密使用 PyCryptodome 加密的 RSA-OAEP 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63595996/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com