2013-05-07 5 views
4

Существует ли стандартная библиотека для шифрования AES для VB.NET? Я хочу зашифровать строку со статическим закрытым ключом.Стандартная библиотека для шифрования AES для VB.NET?

Я нашел googled и нашел много вариаций. Я не знаю, как определить, какие алгоритмы безопасны или нет.

+4

Вы даже смотреть на [System.Security.Cryptography] (Http: // MSDN. microsoft.com/en-us/library/system.security.cryptography.aspx) пространство имен? – Oded

+0

См. Http://stackoverflow.com/questions/273452/using-aes-encryption-in-c-sharp –

+0

@Однако эй .. Я наткнулся на этот сайт только сейчас. Http://msdn.microsoft.com/ en-us/library/system.security.cryptography.aes.aspx Я действительно не знаю, что делать с примером там. = x – ysj

ответ

9

Пространство имен System.Security.Cryptography содержит все классы, необходимые для выполнения большинства стандартных задач шифрования. К сожалению, поскольку шифрование - довольно сложная тема, с некоторыми классами сложно работать - особенно для новичков. Иногда бывает трудно найти простой рабочий пример. Но, поскольку я симпатичен, я дам вам простой пример, с которым вы можете играть и улучшать :)

Класс, который вы, вероятно, хотите использовать, называется RijndaelManaged. Это класс, который реализует типичное шифрование AES. Вот класс образец, который использует его для преобразования между простыми текстовыми строками и массивами байтов:

Public Class Aes256Encrypter 
    Public Function Encrypt(ByVal plainText As String, ByVal secretKey As String) As Byte() 
     Dim encryptedPassword As Byte() 
     Using outputStream As MemoryStream = New MemoryStream() 
      Dim algorithm As RijndaelManaged = getAlgorithm(secretKey) 
      Using cryptoStream As CryptoStream = New CryptoStream(outputStream, algorithm.CreateEncryptor(), CryptoStreamMode.Write) 
       Dim inputBuffer() As Byte = Encoding.Unicode.GetBytes(plainText) 
       cryptoStream.Write(inputBuffer, 0, inputBuffer.Length) 
       cryptoStream.FlushFinalBlock() 
       encryptedPassword = outputStream.ToArray() 
      End Using 
     End Using 
     Return encryptedPassword 
    End Function 

    Public Function Decrypt(ByVal encryptedBytes As Byte(), ByVal secretKey As String) As String 
     Dim plainText As String = Nothing 
     Using inputStream As MemoryStream = New MemoryStream(encryptedBytes) 
      Dim algorithm As RijndaelManaged = getAlgorithm(secretKey) 
      Using cryptoStream As CryptoStream = New CryptoStream(inputStream, algorithm.CreateDecryptor(), CryptoStreamMode.Read) 
       Dim outputBuffer(0 To CType(inputStream.Length - 1, Integer)) As Byte 
       Dim readBytes As Integer = cryptoStream.Read(outputBuffer, 0, CType(inputStream.Length, Integer)) 
       plainText = Encoding.Unicode.GetString(outputBuffer, 0, readBytes) 
      End Using 
     End Using 
     Return plainText 
    End Function 

    Private Function getAlgorithm(ByVal secretKey As String) As RijndaelManaged 
     Const salt As String = "put your salt here" 
     Const keySize As Integer = 256 

     Dim keyBuilder As Rfc2898DeriveBytes = New Rfc2898DeriveBytes(secretKey, Encoding.Unicode.GetBytes(salt)) 
     Dim algorithm As RijndaelManaged = New RijndaelManaged() 
     algorithm.KeySize = keySize 
     algorithm.IV = keyBuilder.GetBytes(CType(algorithm.BlockSize/8, Integer)) 
     algorithm.Key = keyBuilder.GetBytes(CType(algorithm.KeySize/8, Integer)) 
     algorithm.Padding = PaddingMode.PKCS7 
     Return algorithm 
    End Function 
End Class 

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

Если вы хотите иметь зашифрованное значение, возвращенное в виде строки, а не в виде массива байт, вы можете использовать Base-64 кодировку, чтобы преобразовать массив байт, и из, строк, например:

Public Class Aes256Base64Encrypter 
    Public Function Encrypt(ByVal plainText As String, ByVal secretKey As String) As String 
     Dim encryptedPassword As String = Nothing 
     Using outputStream As MemoryStream = New MemoryStream() 
      Dim algorithm As RijndaelManaged = getAlgorithm(secretKey) 
      Using cryptoStream As CryptoStream = New CryptoStream(outputStream, algorithm.CreateEncryptor(), CryptoStreamMode.Write) 
       Dim inputBuffer() As Byte = Encoding.Unicode.GetBytes(plainText) 
       cryptoStream.Write(inputBuffer, 0, inputBuffer.Length) 
       cryptoStream.FlushFinalBlock() 
       encryptedPassword = Convert.ToBase64String(outputStream.ToArray()) 
      End Using 
     End Using 
     Return encryptedPassword 
    End Function 

    Public Function Decrypt(ByVal encryptedBytes As String, ByVal secretKey As String) As String 
     Dim plainText As String = Nothing 
     Using inputStream As MemoryStream = New MemoryStream(Convert.FromBase64String(encryptedBytes)) 
      Dim algorithm As RijndaelManaged = getAlgorithm(secretKey) 
      Using cryptoStream As CryptoStream = New CryptoStream(inputStream, algorithm.CreateDecryptor(), CryptoStreamMode.Read) 
       Dim outputBuffer(0 To CType(inputStream.Length - 1, Integer)) As Byte 
       Dim readBytes As Integer = cryptoStream.Read(outputBuffer, 0, CType(inputStream.Length, Integer)) 
       plainText = Encoding.Unicode.GetString(outputBuffer, 0, readBytes) 
      End Using 
     End Using 
     Return plainText 
    End Function 

    Private Function getAlgorithm(ByVal secretKey As String) As RijndaelManaged 
     Const salt As String = "put your salt here" 
     Const keySize As Integer = 256 

     Dim keyBuilder As Rfc2898DeriveBytes = New Rfc2898DeriveBytes(secretKey, Encoding.Unicode.GetBytes(salt)) 
     Dim algorithm As RijndaelManaged = New RijndaelManaged() 
     algorithm.KeySize = keySize 
     algorithm.IV = keyBuilder.GetBytes(CType(algorithm.BlockSize/8, Integer)) 
     algorithm.Key = keyBuilder.GetBytes(CType(algorithm.KeySize/8, Integer)) 
     algorithm.Padding = PaddingMode.PKCS7 
     Return algorithm 
    End Function 
End Class 

Если вы храните зашифрованное значение в текстовом файле, файле XML или даже базе данных, часто проще просто использовать Base-64, вот так.

+1

-1 Случайная соль с вашим кодом на самом деле не совсем другая тема или просто идеально необходима, вы генерируете свой IV с того же ввода, что и ваш ключ, таким образом, любой повторно используемый пароль с постоянная соль всегда будет иметь тот же самый IV. Это нарушает семантическую безопасность CBC - IV должен быть уникальным для каждого ключа и непредсказуемым, это основное правило для CBC. – jbtule

+0

Вы спасли меня много времени. Спасибо за ваш ответ. – Matth3w

1

Существуют высокоуровневые библиотеки шифрования, которые обрабатывают тонкие детали шифрования, поэтому вы не делаете эти ошибки, Keyczar, Nacl, GPGME.

Я портировал Keyczar to .net и использует AES для его симметричного шифрования по умолчанию.

Вы используете программу командной строки для создания набора ключей со случайным ключом AES.

:> KeyczarTool.exe create --location=path_to_key_set --purpose=crypt 
:> KeyczarTool.exe addkey --location=path_to_key_set --status=primary 

В Вашем проекте шифровать,

Using encrypter As New Encrypter("path_to_key_set") 
    Return encrypter.Encrypt(plaintext) 
End Using 

И затем расшифровать

Using crypter As new Crypter("path_to_key_set") 
    Return crypter.Decrypt(ciphertext) 
End Using 
Смежные вопросы