Я новичок в шифровании, пытаюсь передавать некоторые значения между системами. Я могу зашифровать значение, но не могу понять, как расшифровать на другом конце. Я создал простое приложение Windows Forms с использованием VB.NET. Попытка ввести значение и ключ, зашифровать, а затем расшифровать, чтобы получить исходное значение. Вот мой код. Любая помощь очень ценится. Спасибо.

Imports System
Imports System.IO
Imports System.Security.Cryptography
Imports System.Text

Public Class Form1

    Private Sub btnEncode_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEncode.Click
        Dim hmacsha1 As New HMACSHA1(Encoding.ASCII.GetBytes(txtKey.Text))
        Dim hashValue As Byte() = hmacsha1.ComputeHash(Encoding.ASCII.GetBytes(txtValue.Text))
        txtResult.Text = BytesToHexString(hashValue)
        hmacsha1.Clear()
    End Sub

    Private Sub btnDecode_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDecode.Click
        '???
    End Sub

    Private Function BytesToHexString(ByVal bytes As Byte()) As String
        Dim output As String = String.Empty
        Dim i As Integer = 0
        Do While i < bytes.Length
            output += bytes(i).ToString("X2")
            i += 1
        Loop
        Return output
    End Function
End Class
9
user292487 12 Мар 2010 в 19:31

3 ответа

Лучший ответ

HMAC-SHA1 - это односторонний хеш, а не двунаправленный алгоритм шифрования. Вы не можете его расшифровать. У меня нет времени предоставлять здесь полный код шифрования - это сложная тема, но Барри Дорранс " Начало работы с безопасностью ASP.NET "послужит хорошей отправной точкой. (Только некоторые из них относятся к ASP.NET.) Вы также можете посмотреть его Обсуждение DDD по теме.

19
Jon Skeet 12 Мар 2010 в 19:34
2
Sha-1 - односторонний хэш. HMAC-SHA1 - это код аутентификации сообщения. Это явно не одно и то же. Было бы действительно полезно быть немного точнее.
 – 
Accipitridae
13 Мар 2010 в 01:03
Это чувство, когда Джон Скит отвечает вам на вопрос ... Мы все вам завидуем, дорогой уже ушедший друг.
 – 
FranciscoBouza
11 Май 2016 в 22:31

Просто чтобы расширить ответ Джона, потому что вам, вероятно, интересно, в чем смысл шифрования того, что вы не можете расшифровать - HMAC-SHA1, как сказал Джон, является хешем. Полученная строка не содержит исходной информации даже в зашифрованном виде ... Это просто последовательность байтов.

Однако прелесть хеша в том, что любое изменение, которое вы можете внести в строку, почти наверняка приведет к изменению результата хеширования, а результат хеширования, как правило, будет довольно маленьким. По этой причине хеши часто используются, чтобы гарантировать, что часть информации не была изменена.

Например,

Я хочу отправить Джону сообщение - и я хочу, чтобы он был уверен, что один из его товарищей не изменил сообщение до того, как он его прочитал. Я не могу просто взять хэш своего сообщения и отправить его, потому что все, что должен был сделать виновник проблемы, - это заменить сообщение своим собственным и предоставить соответствующий хеш ...

Однако, если я добавляю в свое сообщение хэш не самого сообщения, а скорее сообщения с несколькими конкретными дополнительными байтами, о которых мы с Джоном заранее договорились, создатель проблем потерпит поражение. Джон знает, что нужно добавить дополнительные байты (обычно это называется «соление хэша»), прежде чем он хэширует мое сообщение, но источник проблем не делает этого - поэтому, если он изменяет сообщение, даже если он вырабатывает свой собственный хеш, Джон может видеть, что что-то неправильно ...

Шифрование / хэши - занятие утомительное, и я сам едва поцарапал поверхность, но подумал, что это может дать вам простой пример того, для чего используются хэши ...

Еще одно очень распространенное использование - сохранение информации о членстве на сайте - люди хранят не пароль, а хэш пароля. Это означает, что даже если кому-то удастся заблокировать ваши пользовательские данные, он не сможет использовать их для входа в вашу систему.

Мартин

21
Martin Milan 12 Мар 2010 в 19:47

Простое одностороннее хеш-объяснение того, почему люди захотят это сделать.

Допустим, у вас есть учетная запись пользователя с именем пользователя John и паролем Doe. Вы храните хеш следующей строки.

Имя, ваш любимый номер и выбранный пароль

Например: hash = myHash ("john7 @ password")

             now hash = "qk239qa*@$)(*84509053903" or whatever

Теперь этот хеш безопасен и не может быть отменен, чтобы выяснить, какой ваш любимый номер в большинстве случаев. Чтобы проверить, подходит ли хеш для входа в систему, вы должны повторно хешировать предоставленный ввод (имя, ваш номер или ж / д, пароль), и если вы получите тот же точный хеш, это действительная сделка. Как бы то ни было, это совсем не просто!

- Могу ли я использовать тот же ключ для повторного хеширования моих данных?

2
Community 16 Июл 2012 в 07:09