0

我使用以下两种方法来加密和解密字符串:

'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 填充会处理各种长度。我确定我遗漏了一些简单的东西,但是经过数小时的谷歌搜索,我无法找到答案。

4

1 回答 1

0

问题不在于加密方法,而在于存储它的数据库中设置的 varbinary 的长度。所以加密的数据被截断了。

于 2011-10-18T13:28:24.967 回答