2016-09-07 9 views
0

Моя задача - зашифровать данные с использованием криптографии с эллиптической кривой в .Net (зависит от клиента), я попытался использовать образец из Microsoft, но, похоже, генерирует собственный ключ каждый раз.Как я могу использовать свой собственный ключ для шифрования данных с помощью ECDiffieHellmanCng

Мне нужно использовать свой собственный ключ для этого процесса, например, создать пароль «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

Вы смешиваете две разные вещи вместе.

Если вам нужен ваш собственный пароль, человек, которому вы отправляете зашифрованные данные с таким паролем, должен знать пароль, чтобы расшифровать его. Но вы не можете отправить пароль, потому что MITM может его поймать.

Вот почему вы используете Диффи - Хеллмана.
В принципе, Diffie - Hellman выводит только число, но это число нельзя использовать в качестве ключа шифрования, потому что оно слабое.

Теперь здесь находится KDF (функция деривации ключа). Например, PBKDF2. Он принимает пароль и соль в качестве параметров и выводит производный ключ, который используется для шифрования и дешифрования данных, которые вы хотите отправить.

Итак, вы берете обменный номер, передавая его в качестве пароля для KDF. Как соль, вы можете использовать, например, Алиса или Боба.

KDF будет выдавать одинаковый сильный пароль с обеих сторон для шифрования и дешифрования данных.

Надеюсь, это имеет смысл.

+0

Спасибо, что прицелился, но можно ли использовать мой собственный ключ? Если да, то как? Спасибо –

+1

Возможно, конечно, но Diffie Hellman используется для обмена ключами, а не для надежного отправки пароля на другую сторону. Вы можете просто использовать свой пароль 'S3curEChaNNel_01' в качестве параметра для KDF и получить от этого ключ. Однако нет способа (по крайней мере, из того, что я знаю), чтобы отправить безопасный пароль на другую сторону. Я полагаю, что человек, которому вы отправляете данные, не знает пароля. – ProXicT

+1

Спасибо за ответ. Наконец, работаю, но есть ли способ установить фиксированный hmac? Всякий раз, когда значение кодируется, hmac всегда изменяется на новый, я хочу, чтобы он исправлялся, когда я шифровал одно и то же значение одним и тем же ключом. Спасибо –

 Смежные вопросы

  • Нет связанных вопросов^_^