Насколько защищено управляемое шифрование VB.NET Rijndael или AES? - PullRequest
3 голосов
/ 11 февраля 2012

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

Насколько это безопасно? Это шифрование невозможно взломать, верно?

Очень жаль, вот рабочая ссылка. http://www.codeproject.com/Articles/12092/Encrypt-Decrypt-Files-in-VB-NET-Using-Rijndael

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


'*************************
'** Global Variables
'*************************

Dim strFileToEncrypt As String
Dim strFileToDecrypt As String
Dim strOutputEncrypt As String
Dim strOutputDecrypt As String
Dim fsInput As System.IO.FileStream
Dim fsOutput As System.IO.FileStream



'*************************
'** Create A Key
'*************************

Private Function CreateKey(ByVal strPassword As String) As Byte()
    'Convert strPassword to an array and store in chrData.
    Dim chrData() As Char = strPassword.ToCharArray
    'Use intLength to get strPassword size.
    Dim intLength As Integer = chrData.GetUpperBound(0)
    'Declare bytDataToHash and make it the same size as chrData.
    Dim bytDataToHash(intLength) As Byte

    'Use For Next to convert and store chrData into bytDataToHash.
    For i As Integer = 0 To chrData.GetUpperBound(0)
        bytDataToHash(i) = CByte(Asc(chrData(i)))
    Next

    'Declare what hash to use.
    Dim SHA512 As New System.Security.Cryptography.SHA512Managed
    'Declare bytResult, Hash bytDataToHash and store it in bytResult.
    Dim bytResult As Byte() = SHA512.ComputeHash(bytDataToHash)
    'Declare bytKey(31).  It will hold 256 bits.
    Dim bytKey(31) As Byte

    'Use For Next to put a specific size (256 bits) of 
    'bytResult into bytKey. The 0 To 31 will put the first 256 bits
    'of 512 bits into bytKey.
    For i As Integer = 0 To 31
        bytKey(i) = bytResult(i)
    Next

    Return bytKey 'Return the key.
End Function


'*************************
'** Create An IV
'*************************

Private Function CreateIV(ByVal strPassword As String) As Byte()
    'Convert strPassword to an array and store in chrData.
    Dim chrData() As Char = strPassword.ToCharArray
    'Use intLength to get strPassword size.
    Dim intLength As Integer = chrData.GetUpperBound(0)
    'Declare bytDataToHash and make it the same size as chrData.
    Dim bytDataToHash(intLength) As Byte

    'Use For Next to convert and store chrData into bytDataToHash.
    For i As Integer = 0 To chrData.GetUpperBound(0)
        bytDataToHash(i) = CByte(Asc(chrData(i)))
    Next

    'Declare what hash to use.
    Dim SHA512 As New System.Security.Cryptography.SHA512Managed
    'Declare bytResult, Hash bytDataToHash and store it in bytResult.
    Dim bytResult As Byte() = SHA512.ComputeHash(bytDataToHash)
    'Declare bytIV(15).  It will hold 128 bits.
    Dim bytIV(15) As Byte

    'Use For Next to put a specific size (128 bits) of bytResult into bytIV.
    'The 0 To 30 for bytKey used the first 256 bits of the hashed password.
    'The 32 To 47 will put the next 128 bits into bytIV.
    For i As Integer = 32 To 47
        bytIV(i - 32) = bytResult(i)
    Next

    Return bytIV 'Return the IV.
End Function

Шифрование и дешифрование

'****************************
'** Encrypt/Decrypt File
'****************************

Private Enum CryptoAction
    'Define the enumeration for CryptoAction.
    ActionEncrypt = 1
    ActionDecrypt = 2
End Enum

Private Sub EncryptOrDecryptFile(ByVal strInputFile As String, _
                                 ByVal strOutputFile As String, _
                                 ByVal bytKey() As Byte, _
                                 ByVal bytIV() As Byte, _
                                 ByVal Direction As CryptoAction)
    Try 'In case of errors.

        'Setup file streams to handle input and output.
        fsInput = New System.IO.FileStream(strInputFile, FileMode.Open, _
                                              FileAccess.Read)
        fsOutput = New System.IO.FileStream(strOutputFile, _
                                               FileMode.OpenOrCreate, _
                                               FileAccess.Write)
        fsOutput.SetLength(0) 'make sure fsOutput is empty

        'Declare variables for encrypt/decrypt process.
        Dim bytBuffer(4096) As Byte 'holds a block of bytes for processing
        Dim lngBytesProcessed As Long = 0 'running count of bytes processed
        Dim lngFileLength As Long = fsInput.Length 'the input file's length
        Dim intBytesInCurrentBlock As Integer 'current bytes being processed
        Dim csCryptoStream As CryptoStream
        'Declare your CryptoServiceProvider.
        Dim cspRijndael As New System.Security.Cryptography.RijndaelManaged
        'Setup Progress Bar
        pbStatus.Value = 0
        pbStatus.Maximum = 100

        'Determine if ecryption or decryption and setup CryptoStream.
        Select Case Direction
            Case CryptoAction.ActionEncrypt
                csCryptoStream = New CryptoStream(fsOutput, _
                cspRijndael.CreateEncryptor(bytKey, bytIV), _
                CryptoStreamMode.Write)

            Case CryptoAction.ActionDecrypt
                csCryptoStream = New CryptoStream(fsOutput, _
                cspRijndael.CreateDecryptor(bytKey, bytIV), _
                CryptoStreamMode.Write)
        End Select

        'Use While to loop until all of the file is processed.
        While lngBytesProcessed < lngFileLength
            'Read file with the input filestream.
            intBytesInCurrentBlock = fsInput.Read(bytBuffer, 0, 4096)
            'Write output file with the cryptostream.
            csCryptoStream.Write(bytBuffer, 0, intBytesInCurrentBlock)
            'Update lngBytesProcessed
            lngBytesProcessed = lngBytesProcessed + _
                                    CLng(intBytesInCurrentBlock)
            'Update Progress Bar
            pbStatus.Value = CInt((lngBytesProcessed / lngFileLength) * 100)
        End While

        'Close FileStreams and CryptoStream.
        csCryptoStream.Close()
        fsInput.Close()
        fsOutput.Close()

Я вставил основные коды оттуда сюда.

Ответы [ 2 ]

9 голосов
/ 11 февраля 2012

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

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

Всякий раз, когда вы можете, вы должны генерировать симметричные ключи с защищенным PRNG (генератор псевдослучайных чисел).Если нет особой необходимости привлекать пароли, не делайте этого.Если это обязательно должны быть пароли, используйте PBKDF2 из PKCS5 или альтернативы, такие как bcrypt или scrypt.

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

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

3 голосов
/ 11 февраля 2012

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

...