Использование объекта Rijndael в VB.NET - PullRequest
1 голос
/ 20 апреля 2010

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

  1. Получение имени компьютера пользователя.

  2. Добавление случайного числа от 100 до 1000000000

Затем я объединяю их и использую в качестве номера лицензии (вероятно, это изменится в окончательной версии, но я просто делаю что-то простое для демонстрационных целей).

Вот пример кода:

 Private Sub Main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim generator As New Random
    Dim randomValue As Integer
    randomValue = generator.Next(100, 1000000000)


    ' Create a new Rijndael object to generate a key
    ' and initialization vector (IV).
    Dim RijndaelAlg As Rijndael = Rijndael.Create

    ' Create a string to encrypt.
    Dim sData As String = My.Computer.Name.ToString + randomValue.ToString
    Dim FileName As String = "C:\key.txt"

    ' Encrypt text to a file using the file name, key, and IV.
    EncryptTextToFile(sData, FileName, RijndaelAlg.Key, RijndaelAlg.IV)

    ' Decrypt the text from a file using the file name, key, and IV.
    Dim Final As String = DecryptTextFromFile(FileName, RijndaelAlg.Key, RijndaelAlg.IV)

    txtDecrypted.Text = Final


End Sub

Это мое событие загрузки, но здесь происходит волшебство:

Sub EncryptTextToFile(ByVal Data As String, ByVal FileName As String, ByVal Key() As Byte, ByVal IV() As Byte)

    Dim fStream As FileStream = File.Open(FileName, FileMode.OpenOrCreate)
    Dim RijndaelAlg As Rijndael = Rijndael.Create
    Dim cStream As New CryptoStream(fStream, _
                                   RijndaelAlg.CreateEncryptor(Key, IV), _
                                   CryptoStreamMode.Write)
    Dim sWriter As New StreamWriter(cStream)

    sWriter.WriteLine(Data)
    sWriter.Close()
    cStream.Close()
    fStream.Close()



End Sub

Есть пара вещей, которые я не понимаю. Что если кто-то прочитает текстовый файл и узнает, что это Rijndael, и напишет приложение VB или C #, которое расшифровывает его? Я не совсем понимаю весь этот код, поэтому, если вы, ребята, сможете мне помочь, я буду любить вас всех навсегда.

Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 20 апреля 2010

Вы наткнулись на очень простую проблему: достаточно просто зашифровать некоторые данные, но как передать ключ?

Вы можете взглянуть на асимметричное шифрование ( RSA ), вы можете добавить подпись, похожую на подпись сборок.

Описание на высшем уровне:

  1. Вы генерируете пару ключей (открытый и закрытый ключ) 1 раз. Держите секретный ключ в секрете.
  2. Вы получаете UserName, хешируете его и шифруете хеш с помощью закрытого ключа.
  3. Вы отправляете зашифрованный хеш (подпись) клиенту как часть вашего файла лицензии.
  4. Ваша программа использует (встроенный) открытый ключ для декодирования подписи
  5. Ваша программа хэширует локальное имя пользователя и сравнивается с декодированной версией.
  6. Ваша программа решает, лицензирована она или нет, и действует соответственно.

Хеширование используется для ограничения количества байтов для шифрования. Для имени пользователя вы можете заменить любые данные, которые вам нужны (например, имя пользователя + EndDate).

1 голос
/ 20 апреля 2010

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

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

Edit:

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

1 голос
/ 20 апреля 2010

Метод EncryptTextToFile просто шифрует строку, используя класс CryptoStream и алгоритм RijndaelManaged. Есть и другие алгоритмы, такие как TripleDES , которые также могут быть использованы.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...