Безопасные (ish) алгоритмы шифрования / дешифрования в vb.net с использованием строки в качестве ключа - PullRequest
1 голос
/ 25 августа 2009

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

Я НЕ имею в виду шифрование с открытым и закрытым ключом или что-либо в этом роде.

Может кто-нибудь помочь мне построить два саба для них?

Если нет, то какой второй лучший способ шифрования / дешифрования данных без открытых / закрытых ключей?

Я хочу сделать простой способ безопасной отправки сообщений.

Спасибо за помощь!

Ответы [ 3 ]

4 голосов
/ 25 августа 2009

Как описано в предыдущем ответе, симметричный алгоритм (где для шифрования и дешифрования используется один секретный ключ). Мне довелось использовать алгоритм DES. Эта подпрограмма шифрования возвращает выходные данные процесса шифрования (а дешифрование имеет в качестве входных данных) строку в кодировке base64, а не байтовый массив (который является «естественным» выводом классов шифрования инфраструктуры).

Private key() As Byte = {}
Private IV() As Byte = {&H12, &H34, &H56, &H78, &H90, &HAB, &HCD, &HEF}
Private Const EncryptionKey As String = "abcdefgh"
Public Function Decrypt(ByVal stringToDecrypt As String) As String
    Try
        Dim inputByteArray(stringToDecrypt.Length) As Byte
        key = System.Text.Encoding.UTF8.GetBytes(Left(EncryptionKey, 8))
        Dim des As New DESCryptoServiceProvider
        inputByteArray = Convert.FromBase64String(stringToDecrypt)
        Dim ms As New MemoryStream
        Dim cs As New CryptoStream(ms, des.CreateDecryptor(key, IV), CryptoStreamMode.Write)
        cs.Write(inputByteArray, 0, inputByteArray.Length)
        cs.FlushFinalBlock()
        Dim encoding As System.Text.Encoding = System.Text.Encoding.UTF8
        Return encoding.GetString(ms.ToArray())
    Catch ex As Exception
        'oops - add your exception logic
    End Try
End Function

Public Function Encrypt(ByVal stringToEncrypt As String) As String
    Try
        key = System.Text.Encoding.UTF8.GetBytes(Left(EncryptionKey, 8))
        Dim des As New DESCryptoServiceProvider
        Dim inputByteArray() As Byte = Encoding.UTF8.GetBytes(stringToEncrypt)
        Dim ms As New MemoryStream
        Dim cs As New CryptoStream(ms, des.CreateEncryptor(key, IV), CryptoStreamMode.Write)
        cs.Write(inputByteArray, 0, inputByteArray.Length)
        cs.FlushFinalBlock()
        Return Convert.ToBase64String(ms.ToArray())
    Catch ex As Exception
        'oops - add your exception logic
    End Try
End Function

Отредактировано, чтобы добавить:
Вот импорт, который я имею в этом модуле:

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

Длина ключа DES составляет 56 бит (всего 8 байтов или символов). На «большой картине» в наши дни это не считается очень безопасным (см. эту статью в Википедии о размерах ключей ), но, как вы описали «secure-ish», возможно, это нормально. Если вам нужно более безопасное шифрование, вам следует исследовать его с помощью одного из более безопасных алгоритмов.

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

Не уверен, почему Left и Convert были бы сломаны. Слева - член Microsoft.VisualBasic.Strings, а Convert - член системы.

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

1 голос
/ 25 августа 2009

В MSDN есть несколько примеров того, как зашифровать и расшифровать данные с помощью симметричного ключа (что вам и нужно). Самым простым в использовании является CryptoStream , вы можете построить криптопоток поверх обычного потока памяти или потока файлов, записать в криптопоток и зашифрованные данные записать в поток памяти / файла, и для расшифровки вы присоединяете поток шифрования к зашифрованной строке (поток памяти) или потоку файлов и считываете дешифрованные данные из потока шифрования: Шифрование данных и Дешифрование данных .

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

0 голосов
/ 18 февраля 2015

Приведенный ниже фрагмент кода шифрует / дешифрует строку данных с помощью пароля с помощью простого оператора xor math (исключая или).

'datain = data to be encrypted
 'password is string to encrypt datain
 '
 'passwprd pointer to start
 kep= 0
 'len of data to be encrypted
 d = Len(datain$) 
 'ddataout$ is encrypted string
 dataout$=""
 For n = 1 To d
    kep=kep+1                   : 'point to password location
    i$ = Mid(password$, kep, 1) : 'get character from password
    p = Asc(i$)                 : 'convert character to integer
    x$= Mid(datain$,n,1)        : 'get character from datain
    h = Asc(x$)                 : 'convert character to integer
    f = h Xor p                 : 'xor the two values and put result in integer
    o$ = Chr(f)                 : 'convert integer back to character
    dataout$ = dataout$ + o$
    If kep = Len(password$) Then
        kep = 0                 : 'reset password pointer to first character
    End If
Next n
' output string dataout$ contains encrypted data

 'dataout = data to be dencrypted
 'password is string to dencrypt datain
 '
 'passwprd pointer set to start
 kep= 0
 'len of data to be encrypted
 d = Len(dataout$) 
 'ddataout$ is encrypted string
 datain$=""
 For n = 1 To d
    kep=kep+1                   : ' point to password location
    i$ = Mid(password$, kep, 1) : 'get character from password
    p = Asc(i$)                 : ' convert character to integer
    x$= Mid(dataout$,n,1)       : ' get character from dataout
    h = Asc(x$)                 : 'convert character to integer
    f = h Xor p                 :' xor the two values and put result in integer
    o$ = Chr(f)                 :' convert integer back to character
    datain$ = datain$ + o$      : ' built datain string
    If kep = Len(password$) Then
        kep = 0                 : 'reset password pointer to first character
    End If
Next n
'output string datain$ contains decrypted data
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...