我不了解密码库中的“加密”对象

时间:2019-09-21 20:42:53

标签: javascript ecies

我正在学习eccrypto的基础知识-JavaScript椭圆曲线加密库。我从文档中获得了以下代码。

var eccrypto = require("eccrypto");
    
var privateKeyA = eccrypto.generatePrivate();
var publicKeyA = eccrypto.getPublic(privateKeyA);
    
// Encrypting the message for A.
eccrypto.encrypt(publicKeyA, Buffer.from("msg to a")).then(function (encrypted) {
    console.log(encrypted)
    // A decrypting the message.
    eccrypto.decrypt(privateKeyA, encrypted).then(function (plaintext) {
    console.log("Message to part A:", plaintext.toString());
    });
});

恐怕我无法正确理解“加密”对象的密钥。

  

该对象中有四个键:“ iv”,“ ephemPublicKey”,   “密文”和“ mac”。

如何从该对象中以二进制格式获取加密的文本?

1 个答案:

答案 0 :(得分:1)

eccrypto(和任何其他ECIES lib)需要这些参数来解密数据。您可以在this survey中阅读有关“集成加密方案”的更多信息。简而言之,“ iv”是初始化向量,它可以是随机缓冲区,也可以是您自己生成的特殊值。 “ ephemPublicKey”是发送者的临时公共密钥缓冲区。 “密文”是加密的消息缓冲区。最后,“ mac”缓冲区有助于检查消息(校验和)的完整性。

如果要存储此加密数据,可以将它们转换为十六进制或base64或任何适合您需要的字符串类型。例如,您可以使用JSON.stringify(encrypted)将此对象转换为JSON,然后按原样存储或将其转换为'base64'字符串以减少空间。在某些其他库中已经应用的另一种解决方案是将所有这些缓冲区合并在一个Buffer.concat(encrypted.ephemPublicKey, encrypted.iv, encrypted.ciphertext, encrypted.mac).toString('base64')这样的单个缓冲区中,现在,当您想要解密此字符串时,应首先将其转换回一个缓冲区并拆分这些缓冲区。 / p>