5

こんにちは、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 倍の大きさのファイルを出力します。

何が起こっているのか、これは数週間前に正常に機能していたと確信しており、明らかに問題はありません。

アイデアはありますか?

4

1 に答える 1

3

主な問題は、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暗号化するか復号化するかに基づいて割り当てを変更することです。

于 2012-06-15T19:28:58.523 に答える