C# NSec。加密使用ChaCha20Poly1305和SharedSecret进行加密和解密

C# NSec。加密使用ChaCha20Poly1305和SharedSecret进行加密和解密,c#,encryption,cryptography,libsodium,shared-secret,C#,Encryption,Cryptography,Libsodium,Shared Secret,我试图使用NSec.Cryptography加密(和解密)从一个设备发送到另一个设备的消息,但我发现文档有点模糊。据我所知,我需要装置a和B的钥匙和公钥。我可以将这些文件转换为共享机密文件: var sharedSecret=keyagrementalgorithm.X25519.Agree(encryption.Key,deviceKey); 但是,此共享机密对于加密似乎没有用处,因为Encrypt(…)方法在其参数中要求密钥: var cyphertext=AeadAlgorithm.ch

我试图使用NSec.Cryptography加密(和解密)从一个设备发送到另一个设备的消息,但我发现文档有点模糊。据我所知,我需要装置a和B的
钥匙和
公钥。我可以将这些文件转换为
共享机密文件

var sharedSecret=keyagrementalgorithm.X25519.Agree(encryption.Key,deviceKey);
但是,此共享机密对于加密似乎没有用处,因为
Encrypt(…)
方法在其参数中要求密钥:

var cyphertext=AeadAlgorithm.chachacha20poly1305.Encrypt(共享加密,nonce,新字节[0],消息);
^--行不通
我有很多问题:

  • 如果SharedSecret不能用于加密,它有什么用途
  • 如果
    ChaCha20Poly1305.Encrypt
    方法使用一个不能作为共享密钥的密钥,那么该方法有何用处
  • 如何使用a的私钥和B的公钥(如libnaude中的box和secret box)对消息进行加密

  • 注意:我想使用X25519键。

    阅读
    共享密钥的文档:

    表示a和 输入

    所以您首先需要使用特定的KDF生成一个或多个密钥,NSec似乎实现了HKDF(使用SHA-256或SHA-512,我更喜欢后者,因为它更安全,而且在64位机器上可能更快。共享秘密本身对对手来说不是完全随机的,因此需要KDF从中创建最加密的密钥

    这应该回答1和2:
    SharedSecret
    用于派生实际键,它本身不是键

    如何使用a的私钥和B的公钥(如libnaude中的box和secret box)对消息进行加密

    至于3:您需要发送方A上的临时密钥对和接收方B的公钥。然后您执行密钥协议和密钥派生(如上所述)使用发送方的临时私钥并将临时公钥与密文一起发送。不要忘记在密钥协议后销毁发送方的临时私钥;您不再需要它,泄漏它将危及密文


    接收者现在可以使用他们的静态私钥和接收到的临时公钥执行相同的协议,并最终解密消息。

    对,因此LibNasdinal等人通常会隐藏一个额外的层。今天将尝试并相应地更新答案!感谢帮助。