【问题标题】:Error on encryption/decryption files加密/解密文件错误
【发布时间】:2010-02-02 01:20:22
【问题描述】:

当我解密一个加密文件时;它与原始文件的字节大小不同,并且文件的哈希值不同。

我使用 File.ReadAllBytes 获取文件的字节并使用密码发送到 EncryptBytes。 DecryptBytes 也一样。

当我收到加密或解密的字节时,我使用 File.WriteAllBytes 保存它们。

我需要解密文件和原始文件具有相同的哈希字节数。

请帮忙

这是我的代码:

Public Function EncryptBytes(ByVal pass As String, ByVal bytes() As Byte)

    Dim myRijndael As New RijndaelManaged
    myRijndael.Padding = PaddingMode.Zeros
    myRijndael.KeySize = 256
    myRijndael.BlockSize = 256

    Dim encrypted() As Byte
    Dim key() As Byte = CreateKey(pass)
    Dim IV() As Byte = CreateIV(pass)

    Dim encryptor As ICryptoTransform = myRijndael.CreateEncryptor(key, IV)

    Dim msEncrypt As New MemoryStream()
    Dim csEncrypt As New CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)

    csEncrypt.Write(bytes, 0, bytes.Length)
    csEncrypt.FlushFinalBlock()

    encrypted = msEncrypt.ToArray()

    Return encrypted

End Function

Public Function DecryptBytes(ByVal pass As String, ByVal bytes() As Byte)

    Dim myRijndael As New RijndaelManaged
    myRijndael.Padding = PaddingMode.Zeros
    myRijndael.KeySize = 256
    myRijndael.BlockSize = 256

    Dim key() As Byte = CreateKey(pass)
    Dim IV() As Byte = CreateIV(pass)

    Dim decryptor As ICryptoTransform = myRijndael.CreateDecryptor(key, IV)

    Dim fromEncrypt() As Byte = New Byte(bytes.Length) {}

    Dim msDecrypt As New MemoryStream(bytes)
    Dim csDecrypt As New CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)

    csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length)

    Return fromEncrypt

End Function

Private Function CreateKey(ByVal strPassword As String) As Byte()
    Dim chrData() As Char = strPassword.ToCharArray

    Dim intLength As Integer = chrData.GetUpperBound(0)

    Dim bytDataToHash(intLength) As Byte

    For i As Integer = 0 To chrData.GetUpperBound(0)
        bytDataToHash(i) = CByte(Asc(chrData(i)))
    Next

    Dim SHA512 As New System.Security.Cryptography.SHA512Managed

    Dim bytResult As Byte() = SHA512.ComputeHash(bytDataToHash)

    Dim bytKey(31) As Byte

    For i As Integer = 0 To 31
        bytKey(i) = bytResult(i)
    Next

    Return bytKey

End Function

Private Function CreateIV(ByVal strPassword As String) As Byte()
    Dim chrData() As Char = strPassword.ToCharArray

    Dim intLength As Integer = chrData.GetUpperBound(0)

    Dim bytDataToHash(intLength) As Byte

    For i As Integer = 0 To chrData.GetUpperBound(0)
        bytDataToHash(i) = CByte(Asc(chrData(i)))
    Next

    Dim SHA512 As New System.Security.Cryptography.SHA512Managed

    Dim bytResult As Byte() = SHA512.ComputeHash(bytDataToHash)

    Dim bytIV(31) As Byte

    For i As Integer = 32 To 47
        bytIV(i - 32) = bytResult(i)
    Next

    Return bytIV

End Function

【问题讨论】:

    标签: vb.net encryption file


    【解决方案1】:

    您的 DecryptBytes() 方法已损坏。您没有使用 csDecrypt.Read() 的返回值,它告诉您有很多字节被解密。这与 fromEncrypt.Length 不同。你也很难猜测要传递给这个函数的字节数组有多大。

    考虑更改函数以返回 MemoryStream。在循环中调用 Read() 并将读取的内容写入内存流。当 Read() 返回 0 时退出循环。

    【讨论】:

    • 没有坏掉。 csDecrypt.Read() 返回一个整数 noy 字节数组。
    • 是的,这个整数非常很重要。它告诉您要写入输出文件的字节数。
    • 但是使用 File.WriteAllBytes 不需要字节长度
    • 那么不要使用 File.WriteAllBytes。使用 FileStream.Write
    • 仍然创建比原始文件更大的文件,因为它使用加密字节数组的字节长度,而不是来自原始文件。
    【解决方案2】:

    试试这个:

    Public Function EncryptBytes(ByVal pass As String, ByVal bytes() As Byte)
    
        Dim myRijndael As New RijndaelManaged
        myRijndael.Padding = PaddingMode.PKCS7
        myRijndael.Mode = CipherMode.CBC
        myRijndael.KeySize = 256
        myRijndael.BlockSize = 256
    
        Dim encrypted() As Byte
        Dim key() As Byte = CreateKey(pass)
        Dim IV() As Byte = CreateIV(pass)
    
        Dim encryptor As ICryptoTransform = myRijndael.CreateEncryptor(key, IV)
    
        Dim msEncrypt As New MemoryStream()
        Dim csEncrypt As New CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)
    
        csEncrypt.Write(bytes, 0, bytes.Length)
        csEncrypt.FlushFinalBlock()
    
        encrypted = msEncrypt.ToArray()
    
        Return encrypted
    
        msEncrypt.Close()
        csEncrypt.Close()
    
    End Function
    
    Public Function DecryptBytes(ByVal pass As String, ByVal bytes() As Byte)
    
        Dim myRijndael As New RijndaelManaged
        myRijndael.Padding = PaddingMode.PKCS7
        myRijndael.Mode = CipherMode.CBC
        myRijndael.KeySize = 256
        myRijndael.BlockSize = 256
    
        Dim decrypted() As Byte
        Dim key() As Byte = CreateKey(pass)
        Dim IV() As Byte = CreateIV(pass)
    
        Dim decryptor As ICryptoTransform = myRijndael.CreateDecryptor(key, IV)
    
        Dim msDecrypt As New MemoryStream()
        Dim csDecrypt As New CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Write)
    
        csDecrypt.Write(bytes, 0, bytes.Length)
        csDecrypt.FlushFinalBlock()
    
        decrypted = msDecrypt.ToArray()
    
        Return decrypted
    
        msDecrypt.Close()
        csDecrypt.Close()
    
    End Function
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      相关资源
      最近更新 更多