从类ECDiffieHellmanCng中提取共享密钥

时间:2016-06-29 16:13:15

标签: c# .net ssh elliptic-curve diffie-hellman

我目前正在开发一个SSH客户端,所述客户端必须能够通过ECDH KEX(NIST-256,384和521)与服务器交换密钥。

我做了一些(实际上很多)研究,发现了.NET类ECDiffieHellmanCng,并且能够将服务器的公钥提取并导入到类中。

但问题是,我无法在不派生共享密钥的情况下提取共享密码(ECDiffieHellmanCng.DeriveKeyMaterial(CngKey otherpartyPublicKey))。

有没有办法直接访问共享密钥(" k"因为它在RFC论文中被调用)?

Here是来自ECDH实施的RFC的第7页,以及为什么我需要共享密钥:

  

交换哈希值H被计算为串联的哈希值   以下。

     

字符串V_C,客户端的标识字符串(不包括CR和LF)

     

字符串V_S,服务器的标识字符串(不包括CR和LF)

     

字符串I_C,客户端的有效负载&SSH_MSG_KEXINIT

     

字符串I_S,服务器的有效负载&SSH_MSG_KEXINIT

     

字符串K_S,服务器的公共主机密钥

     

字符串Q_C,客户端的短暂公钥八位字符串

     

字符串Q_S,服务器的短暂公钥八位字符串

     

mpint K,共享秘密< - 这就是为什么我需要纯粹的秘密   在任何推导之前

感谢任何解决方案或提示!

2 个答案:

答案 0 :(得分:1)

您实际上并不需要byte[] prepend = Concat(V_C, V_S, I_C, I_S, K_S, Q_C, Q_S); byte[] exchangeHash = ecdh.DeriveKeyFromHash(otherPublic, new HashAlgorithmName("whatever your hash algorithm is"), prepend, null); ,那么,您只需要计算H. ECDiffieHellman类允许您这样做。

ecdhCng.SecretPrepend = prepend;
ecdhCng.SecretAppend = null;
ecdhCng.HashAlgorithm = new CngAlgorithm("whatever your hash algorithm is");
ecdhCng.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash;
byte[] exchangeHash = ecdhCng.DeriveKeyMaterial(otherPublic);

虽然那是使用.NET 4.6.2(当前处于预览状态)API:DeriveKeyFromHash

如果您使用较旧的框架,它仍然可以使用,但需要特别使用ECDiffieHellmanCng类型:

import java.util.Scanner;

public class Factorial {
public static void main(String[] args) {

    System.out.print("Enter a non-negative number that you wish to perform a factorial function on: ");

    //Create scanner object for reading user input
    Scanner input = new Scanner(System.in);

    //Declare variables
    int number = input.nextInt();
    int factTotal = 1;

    //Execute factorial
    do{
        factTotal = factTotal * number;
        number--;
        while (number >= 1);
    }
    while (number <= 0);{
        System.out.println("That's not a positive integer!");
    }

    System.out.print(factTotal);
}

答案 1 :(得分:0)

即使经过大量的研究,我找不到办法,所以答案是否定的 - 你无法提取秘密。

我的全局解决方案是完全丢弃ECDiffieHellmanCng类,而是用C#包装OpenSSH库。

希望这至少可以帮助其他人有同样的想法。