我正在尝试使用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实现了混合加密的完整实现!