我的任务是使用.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
答案 0 :(得分:1)
你将两种不同的东西混合在一起。
当您需要自己的密码时,您使用此密码发送加密数据的人必须知道密码才能解密。但是你无法发送密码,因为MITM可以抓住它。
这就是你使用Diffie - Hellman的原因 基本上,Diffie - Hellman只输出一个数字,但这个数字不能用作加密密钥,因为它很弱。
现在这里是KDF(密钥派生函数)的来源。 例如PBKDF2。它将password和salt作为参数并输出派生密钥,用于加密和解密您要发送的数据。
所以你拿走交换的号码,把它作为密码传递给KDF。 作为盐,你可以使用爱丽丝或鲍勃的IP。
KDF将在双方产生相同的强密码来加密和解密数据。
希望这是有道理的。