使用 Diffie-Hellman 密钥交换解密消息

Decrypt message using Diffie-Hellman key exchange

我正在尝试使用通过 Diffie-Hellman 密钥交换算法 X25519 生成的共享秘密来解密某些消息。

服务器说出他们发送的消息are encrypted using symmetric key encryption generated from a Diffie-Hellman key exchange

我正在使用包 cryptography 生成密钥对,然后将此密钥对的 public 密钥发送到服务器,该服务器使用 public 密钥创建共享密钥 I发送和他们自己的私钥。然后他们发回 public 密钥,以及随机数和加密消息。然后我用我的私钥和他们的 public 密钥在我这边形成一个共享秘密。

我的问题是,如何使用这个共享密钥和随机数来解密消息?

我正在生成我的初始密钥对作为

final algorithm = X25519();
final myKeyPair = await algorithm.newKeyPair();

// Get the public get
var myPublicKey = await myKeyPair.extractPublicKey();

然后我用服务器发送的字节构建一个 public 密钥。

var bytesFromServer = List<int>.....

var serverPublicKey = SimplePublicKey(bytesFromServer, type: KeyPairType.x25519);

最后我与

建立了共享密钥
final sharedSecret = await algorithm.sharedSecretKey(
      keyPair: myKeyPair,
      remotePublicKey: serverPublicKey,
);

服务器的文档说:This shared secret should then be used to decrypt the data field in the response但我找不到一种方法或解密器可以让我使用秘密以及它们也从服务器发送的随机数。

作为共享密钥本身的 SecretKey class 不提供任何解密,我不确定如何进行。

我能够使用其他两个包实现此目的:

对于解密和密钥生成,我使用 pinenacl. For base58 decoding I'm using bs58

final sessionConnectPrivateKey = PrivateKey.generate();
final encodedSessionPrivateKey = base58.encode(
  sessionConnectPrivateKey.toUint8List(),
);

var box = Box(
  myPrivateKey: PrivateKey(base58.decode(encodedSessionPrivateKey)),
  theirPublicKey: PublicKey(base58.decode(encodedServerSessionPublicKey)),
);

// We are able to decrypt because the message was encrypted using
// a similar box with our public key and the server's private key
var decryptedMessageBytes = box.decrypt(
  ByteList.fromList(base58.decode(encodedData)),
  nonce: base58.decode(encodedNonce),
);

var decryptedMessageString = String.fromCharCodes(decryptedMessageBytes);

var decodedPayload = jsonDecode(decryptedMessageString);