【问题标题】:Cryptography in VB.net - decrypted file is larger than source file?VB.net 中的密码学 - 解密文件大于源文件?
【发布时间】:2012-06-15 16:49:55
【问题描述】:

您好,我一直在尝试使用 System.Security.Cryptography 来加密和解密文件,但它对我不起作用

这段代码

Private Sub EncryptFile(ByVal sInputFilename As String, ByVal sOutputFilename As String, ByVal sKey As String)
    Dim fsInput As New FileStream(sInputFilename, FileMode.Open, FileAccess.Read)
    Dim fsEncrypted As New FileStream(sOutputFilename, FileMode.Create, FileAccess.Write)
    Dim DES As New DESCryptoServiceProvider()
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey)
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)
    Dim desencrypt As ICryptoTransform = DES.CreateEncryptor()
    Dim cryptostream As New CryptoStream(fsEncrypted, desencrypt, CryptoStreamMode.Write)
    Dim bytearrayinput(fsInput.Length - 1) As Byte
    fsInput.Read(bytearrayinput, 0, bytearrayinput.Length)
    cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length)
    cryptostream.Close()
End Sub

调用

EncryptFile(OpenFileDialog1.FileName, SaveFileDialog1.FileName, "12345678")[/CODE]

似乎工作正常,我得到一个与源文件大小相同的文件

这里出了问题

这段代码

Private Sub DecryptFile(ByVal sInputFilename As String, ByVal sOutputFilename As String, ByVal sKey As String)
    Dim DES As New DESCryptoServiceProvider()
    DES.Key() = ASCIIEncoding.ASCII.GetBytes(sKey)
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)
    Dim fsread As New FileStream(sInputFilename, FileMode.Open, FileAccess.Read)
    Dim desdecrypt As ICryptoTransform = DES.CreateDecryptor()
    Dim cryptostreamDecr As New CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read)
    Dim fsDecrypted As New StreamWriter(sOutputFilename)
    fsDecrypted.Write(New StreamReader(cryptostreamDecr).ReadToEnd)
    fsDecrypted.Flush()
    fsDecrypted.Close()
End Sub

调用

DecryptFile(OpenFileDialog1.FileName, SaveFileDialog1.FileName, "12345678")[/CODE]

输出的文件几乎是加密源文件的 2 倍。

我确定这在几周前运行良好,我看不出有什么明显的问题。

有什么想法吗?

【问题讨论】:

  • 使用StreamReader/Writer不合适,读取原文件时没有使用。

标签: vb.net encryption cryptography


【解决方案1】:

主要问题是 EncryptFile 使用字节数组读取数据,而 DecryptFile 使用流读取数据。 EncryptFile 和 DecryptFile 方法之间的唯一区别应该是您的 ICryptoTransform 分配。在 1 个过程中使用通用代码会更容易:

Private Sub EncryptFile(ByVal sInputFilename As String, ByVal sOutputFilename As String, ByVal sKey As String)
    Crypto(sInputFilename, sOutputFilename, sKey, True)
End Sub

Private Sub DecryptFile(ByVal sInputFilename As String, ByVal sOutputFilename As String, ByVal sKey As String)
    Crypto(sInputFilename, sOutputFilename, sKey, False)
End Sub

Private Sub Crypto(ByVal sInputFileName As String, ByVal sOutputFileName As String, ByVal sKey As String, ByVal bEncrypt As Boolean)
    'Define the service provider
    Dim DES As New DESCryptoServiceProvider()
    DES.Key() = ASCIIEncoding.ASCII.GetBytes(sKey)
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)


    'Read the input file into array
    Dim fsInput As New FileStream(sInputFileName, FileMode.Open, FileAccess.Read)
    Dim bytearrayinput(fsInput.Length - 1) As Byte
    fsInput.Read(bytearrayinput, 0, bytearrayinput.Length)


    'Define the crypto transformer
    Dim cryptoTransform As ICryptoTransform

    If bEncrypt Then
        cryptoTransform = DES.CreateEncryptor()
    Else
        cryptoTransform = DES.CreateDecryptor
    End If


    'Create the encrypting streams
    Dim fsEncrypted As New FileStream(sOutputFileName, FileMode.Create, FileAccess.Write)
    Dim cryptostream As New CryptoStream(fsEncrypted, cryptoTransform, CryptoStreamMode.Write)

    'Write the output file
    cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length)
    cryptostream.Close()
End Sub

Crypto 过程与 EncryptFile 过去几乎相同。不同之处在于我会根据您是在加密还是解密来更改 ICryptoTransform 分配。

【讨论】:

  • 感谢您的解释。现在工作正常。谢谢你的分:)
猜你喜欢
  • 1970-01-01
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多