Javascript 如何将Uint8Array的对象转换为字符串,并将字符串转换回同一对象?

Javascript 如何将Uint8Array的对象转换为字符串,并将字符串转换回同一对象?,javascript,json,public-key-encryption,json-deserialization,Javascript,Json,Public Key Encryption,Json Deserialization,我正在使用eccrypto.js库进行公钥加密。 这里我想用B的公钥加密A的消息,然后让B用B的私钥解密 在库中,这是通过以下方式完成的: // Encrypting the message for B. eccrypto.encrypt(publicKeyB, Buffer.from("msg to b")).then(function(encrypted) { // B decrypting the message. eccrypto.decrypt(privateKeyB, enc

我正在使用eccrypto.js库进行公钥加密。 这里我想用B的公钥加密A的消息,然后让B用B的私钥解密

在库中,这是通过以下方式完成的:

// Encrypting the message for B.
eccrypto.encrypt(publicKeyB, Buffer.from("msg to b")).then(function(encrypted) {
  // B decrypting the message.
  eccrypto.decrypt(privateKeyB, encrypted).then(function(plaintext) {
    console.log("Message to part B:", plaintext.toString());
  });
});
如果我将加密值记录在控制台日志中,则得到的对象为:

{iv:Uint8Array(16),ephemppublickey:Uint8Array(65),密文:Uint8Array(48),mac:Uint8Array(32)}
密文:Uint8Array(48)[13、240、10、109、88、109、108、153、213、115、40、237、66、232、251、120、27、67、119、231、17、143、78、69、43、76、214、74、132、127、220、131、44、144、221、133、48、124、239、158、226、22、119、200、170、101、241、82]
ephemPublicKey:Uint8Array(65)[4,84,253,207,251,2,157,203,14,233,166,216,107,1,23,90,229,209,150,58,95,253,214,183,148,167,224,224,224,176,165,84,121,70,4,175,186,189,104,211,207,255,195,20,128,200,237,7,9,173,234,14,208,208,208,208,68,46,76,38,10,188,41]
iv:Uint8Array(16)[230、246、79、17、203、191、117、7、57、149、198、68、193、220、159、56]
mac:Uint8Array(32)[202、77、212、211、27、186、174、106、211、145、100、81、100、68、61、172、175、188、213、49、63、92、172、83、30、22、47、93、60、215、33、116]
注意:我必须将其存储为json格式,因此我已将其转换为json数据

现在,如果我将此对象转换为json并恢复json数据,则恢复的对象不同

Json对象:

{
“iv”:{“类型”:“缓冲区”,“数据”:[226253245,0227222,47,37,65177171,68201142242,35]},
《以弗所公报》:{“类型”:“缓冲区”,“数据”:[4,9137,99138202169,89,90209,9213015610170132192250,88232,15250,33107,38,13129178,21237,77136215,3921523140226102,98,39110192209,79214138,83174192100183157,44,56128,38,52170244,422131992,57232]},
“密文”:{“类型”:“缓冲区”,“数据”:[135147187164109,39204244195161,65,24178160132146200,35113120164140,20223225104,23111,13155193,26,35,73236,77209246,85,16,77,3025012220242111,63],
“mac:{“类型”:“缓冲区”,“数据”:[79195220150230150,13187,9131,12,81151107,292161814385,52153,71179167243141107,88,97206110107]}
恢复的对象(JSON.parse(加密))是:

{iv:{…},以弗所:{…},密文:{…},mac:{…}
密文:
数据:(48)[135、147、187、164、109、39、204、244、195、161、65、24、178、160、132、146、200、35、113、120、164、140、20、223、225、104、23、111、13、155、193、26、35、73、236、77、209、246、85、16、77、30、250、122、206、242、111、63]
类型:“缓冲区”
__原型:对象
以弗所公共图书馆:
数据:(65)[4,9,137,99,138,202,169,89,90,209,92,130,156,105,170,132,192,250,88,232,15,250,33,107,38,13,129,178,21,237,77,136,215,39,215,123,140,226,102,98,39,110,192,209,79,214,138,83,174,192,100,183,157,44,56,128,38,52,170,244,42,213,199,57,232]
类型:“缓冲区”
__原型:对象
四:
数据:(16)[226253245,022722247,37,65177171,68201142242,35]
类型:“缓冲区”
__原型:对象
雨衣:
数据:(32)[79195220150230150,13187,913112,81151,107,29216,138,143,85,52153,71179167243141107,88,97206,110107]
类型:“缓冲区”
__原型:对象
__原型:对象
如果我使用恢复的对象进行解密,则会将错误作为坏公钥

我的代码是:


让PublicKey=Buffer.from(“0418C7CED07C0C17F42B132B747C70FDDB6B31EA0AD349C2E9F800F48F0A73C2EA028D41B1B239077A48136CE546F9D2811BF1EC311C56E6A41F33906A1FC242E451”,“十六进制”)
eccrypto.encrypt(公钥,缓冲区,from('Message to encrypt')。然后(函数(加密){
console.log(加密)
让encoded=JSON.stringify(加密)
console.log(编码)
var-actual=JSON.parse((编码))
console.log(实际)
设pk=Buffer.from(“9A2D66404B69023C45DA81CA4B696A8234B7AE53EA6B7FFC0D6BDD0E0E3279”,“十六进制”)
eccrypto.decrypt(pk,实际).then(函数(明文){
log(“发送到B部分的消息:”,明文.toString());
});
});
我得到错误作为坏公钥

如果我在eccrypto.decrypt(pk,encrypted)中使用加密变量而不是acutal


然后我得到解密后的值。

您可以向
JSON.parse添加第二个参数,以允许您插入代码来帮助解释反序列化后的JSON。在文档中,它被称为
恢复器

您将获得对象中的每个键、值对

以下是一些示例代码:

JSON.parse('{"p": 5}', (key, value) =>
  typeof value === 'number'
    ? value * 2 // return value * 2 for numbers
    : value     // return everything else unchanged
);
以下是MDN的模式信息:


在您的示例中,我认为您希望将值标识为type
buffer
,然后将其替换为
UInt8Array

或创建如下新对象:

    const newWorkingObject = {
      ciphertext: Buffer.from([...recoveredObject.ciphertext.data]),
      ephemPublicKey: Buffer.from([...recoveredObject.ephemPublicKey.data]),
      iv: Buffer.from([...recoveredObject.iv.data]),
      mac: Buffer.from([...recoveredObject.mac.data]),
    }