在离子3中使用WebCryptoapi加密图像的错误



我正在尝试使用WebCryptoapi在离子3中加密图像。

我从编码为base64字符串的设备相机中获取图像。我使用base64-arraybuffer库将其转换为arraybuffer。在此之后,我创建了一个键盘,并使用公共密钥使用WebCryptoapi加密。

使用crypto.encrypt((时,代码在最后一部分掉落。我收到以下错误:

态 特定于操作的 原因"," __ __区_symbol__currentTask":{" type":" microtask"," state":" notscheduled"," source":" promise..then"," zone"," acncular"," cancelfn"," cancelfn":null,null,null," runcount":0}}

加密实现似乎仅通过接口可用,这使得(对我来说(很难将其固定为非常通用的例外 - 在一个阶段,我怀疑一个"区域"错误 - 并试图将代码包装在ngzone.run((中((,但无济于事。

代码运行如下:

....
import base64Arraybuffer from 'base64-arraybuffer';
declare var crypto: Crypto;
...
testCrypto() {
    // sample gif image (base64-encoded)
    const base64Image: string = "data:image/gif;base64,R0lGODlhPQ ... 0pCZbEhAAOw==";
    // convert base64 string to ArrayBuffer
    var encodedData_ab: ArrayBuffer = base64Arraybuffer.decode(base64Image);
    console.log("... arraybuffer bytelength: " + encodedData_ab.byteLength);
    // create keypair
    crypto.subtle.generateKey({
        name: "RSA-OAEP",
        modulusLength: 2048, //can be 1024, 2048, or 4096
        publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
        hash: { name: "SHA-256" }, 
    },
    true, 
    ["encrypt", "decrypt"])
    .then((keypair) => {
        console.log(keypair.publicKey);
        console.log(keypair.privateKey);
        // start encrypting data
        // ERROR occurs here >>>>
        crypto.subtle.encrypt({
            name: "RSA-OAEP"
        },
            keypair.publicKey,
            encodedData_ab
        )
        .then((buffer) => {
            console.log("... after encrypting data...")
            console.log(buffer.toString());
        });
    });
} 

阵列板似乎存在 - 它确实向我展示了特定的字节长度。关键对对象也显示在控制台中。Crypto Keypair生成和加密代码基于WebCrypto示例。

因此,问题似乎与编码过程有关。任何输入都将不胜感激。

好的 - 我学到了一些东西...

从Mozilla错误报告中,我了解到RSA加密仅适用于小消息:

使用RSA-OAEP,您可以加密的最大消息长度是: m -2-2*hlen M = 2048和HLEN = 512,如您的示例: 2048-2-2*512 = 1022位

当我缩短数据字符串 Base64Image到254个字符时,它有效...

找到正确的实现时,我会回到这一点...

----编辑----

正如所承诺的 - 我确实设法使用 hybrid Crypto 解决方案来实现此问题:

  • 使用对称加密来生成会话密钥和加密/解密明文
  • 使用不对称加密来加密/解密会话键

查尔斯·恩格尔克(Charles Engelke(的2016年研讨会是一个非常有用的资源。使用LAB 4中的WebCypto实现了混合加密的完整实现!

最新更新