CryptoStream.FlushFinalBlock, выбрасывающий входные данные, не является полным исключением блока - PullRequest
0 голосов
/ 17 октября 2011

Я использую следующие два метода для шифрования и дешифрования строк:

'Encrypts string. Returns encrypted byte array.
Public Function Encrypt(ByVal str As String) As Byte()
    Dim inputInBytes() As Byte = Encoding.Unicode.GetBytes(str)

    Dim laesProvider As New AesCryptoServiceProvider()
    laesProvider.Key = _key
    laesProvider.Mode = CipherMode.CBC
    laesProvider.IV = _IV
    laesProvider.Padding = PaddingMode.PKCS7
    Dim lencryptor As ICryptoTransform = laesProvider.CreateEncryptor

    Dim encryptedStream As New MemoryStream
    Dim cryptStream As CryptoStream = New CryptoStream(encryptedStream, lencryptor, CryptoStreamMode.Write)

    cryptStream.Write(inputInBytes, 0, inputInBytes.Length)
    cryptStream.FlushFinalBlock()
    encryptedStream.Position = 0

    Dim result(encryptedStream.Length - 1) As Byte
    encryptedStream.Read(result, 0, encryptedStream.Length)
    cryptStream.Close()
    Return result
End Function

'Decrypts bytearray. Returns string.
Public Function DecryptToStr(ByVal inputInBytes() As Byte) As String

    Dim laesProvider As New AesCryptoServiceProvider()
    laesProvider.Key = _key
    laesProvider.Mode = CipherMode.CBC
    laesProvider.IV = _IV
    laesProvider.Padding = PaddingMode.PKCS7
    Dim ldecryptor As ICryptoTransform = laesProvider.CreateDecryptor

    ' Provide a memory stream to decrypt information into 
    Dim decryptedStream As MemoryStream = New MemoryStream()
    Dim cryptStream As CryptoStream = New CryptoStream(decryptedStream, ldecryptor, CryptoStreamMode.Write)
    cryptStream.Write(inputInBytes, 0, inputInBytes.Length)
    cryptStream.FlushFinalBlock() '#### This is where the exception is thrown ####
    decryptedStream.Position = 0

    ' Read the memory stream and convert it back into a string 
    Dim result(decryptedStream.Length - 1) As Byte
    decryptedStream.Read(result, 0, decryptedStream.Length)
    cryptStream.Close()

    Return Encoding.Unicode.GetString(result)
End Function

Ошибка возникает при попытке расшифровать строки определенной длины. Если строка представляет собой номер социального страхования (11 символов, включая тире), то она выбрасывает «Входные данные не являются полным блоком» CryptographicException. Если я, например, передам строку длиной ровно 8 символов, то все будет работать как положено. Я думал, что прокладка PKCS7 позаботится о разной длине. Я уверен, что упускаю что-то простое, но после нескольких часов поисков в Google ответ ускользает от меня.

1 Ответ

0 голосов
/ 18 октября 2011

Проблема была не в методе шифрования, а в длине varbinary набора в базе данных, где он хранился. Таким образом, зашифрованные данные были усечены.

...