如何使用自己的密钥使用ECDiffieHellmanCng加密数据

时间:2016-09-07 07:23:53

标签: vb.net encryption cryptography diffie-hellman

我的任务是使用.Net中的Elliptic Curve Cryptography加密数据(特定于客户端),我尝试使用Microsoft的示例,但它似乎每次都会生成自己的密钥。

我需要在此过程中使用自己的密钥,例如创建密码" S3curEChaNNel_01?"并将其转换为字节然后用作键,但我无法找到一种方法来执行此操作。

Using alice As New ECDiffieHellmanCng()
    Dim abData() As Byte
    Dim Str = txtKey.Text 'custom password
    abData = System.Text.Encoding.Default.GetBytes(Str)
    Str = System.Text.Encoding.Default.GetString(abData)

    Dim bobPublicKey() As Byte
    Dim bobKey() As Byte
    Dim bob As New ECDiffieHellmanCng()

    bob.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash
    bob.HashAlgorithm = CngAlgorithm.Sha256
    bobPublicKey = bob.PublicKey.ToByteArray()
    bob.HmacKey = abData

    bobKey = bob.DeriveKeyMaterial(CngKey.Create(CngAlgorithm.Sha256))
    'at this line i get an exception, "The requested operation is not supported."

    'Dim aliceKey As Byte() = alice.DeriveKeyMaterial(CngKey.Create(CngAlgorithm.Sha256))
    Dim encryptedMessage As Byte() = Nothing
    Dim iv As Byte() = Nothing
    txtOutput.Text = ByteArrayToString(Encrypt(bobKey, txtPlainStr.Text, encryptedMessage, iv))
End Using

1 个答案:

答案 0 :(得分:1)

你将两种不同的东西混合在一起。

当您需要自己的密码时,您使用此密码发送加密数据的人必须知道密码才能解密。但是你无法发送密码,因为MITM可以抓住它。

这就是你使用Diffie - Hellman的原因 基本上,Diffie - Hellman只输出一个数字,但这个数字不能用作加密密钥,因为它很弱。

现在这里是KDF(密钥派生函数)的来源。 例如PBKDF2。它将password和salt作为参数并输出派生密钥,用于加密和解密您要发送的数据。

所以你拿走交换的号码,把它作为密码传递给KDF。 作为盐,你可以使用爱丽丝或鲍勃的IP。

KDF将在双方产生相同的强密码来加密和解密数据。

希望这是有道理的。