Rijndael Encryption and Decryption не работает на другом компьютере - PullRequest
1 голос
/ 28 января 2020

Прежде всего, если я делаю шифрование и дешифрование на одном компьютере, он работает нормально. Но когда я хочу расшифровать файл, зашифрованный на другом компьютере с тем же ключом, он не работает. Ошибка говорит «Параметр неверен». Вот определения:

Dim cspp As New CspParameters
Dim rsa As New RSACryptoServiceProvider
Dim bVis As New baseVisitor
Dim encDec As New EncryptDecrypt
Public encFolder As String = ""
Public decFolder As String = ""
Public keyName As String = ""

Вот как я могу определить ключ;

Public Function GetKey() As Boolean
    Dim sonuc As Boolean = False
    Try
        keyName = "keyName25*-"
        If keyName.Length > 4 Then
            cspp.KeyContainerName = keyName
            rsa = New RSACryptoServiceProvider(cspp)
            rsa.PersistKeyInCsp = True
            sonuc = True
        End If
    Catch ex As Exception
        sonuc = False
    End Try
    Return sonuc
End Function

После получения ключа вот код шифрования;

Public Sub EncryptFile(ByVal decFile As String)

    Dim rjndl As RijndaelManaged = New RijndaelManaged()
    rjndl.KeySize = 256
    rjndl.BlockSize = 256
    rjndl.Mode = CipherMode.CBC
    Dim transform As ICryptoTransform = rjndl.CreateEncryptor()
    Dim keyEncrypted As Byte() = rsa.Encrypt(rjndl.Key, False)
    Dim LenK As Byte() = New Byte(3) {}
    Dim LenIV As Byte() = New Byte(3) {}
    Dim lKey As Integer = keyEncrypted.Length
    LenK = BitConverter.GetBytes(lKey)
    Dim lIV As Integer = rjndl.IV.Length
    LenIV = BitConverter.GetBytes(lIV)
    Dim startFileName As Integer = decFile.LastIndexOf("\") + 1
    Dim outFile As String = decFile

    Using outFs As FileStream = New FileStream(outFile, FileMode.Create)
        outFs.Write(LenK, 0, 4)
        outFs.Write(LenIV, 0, 4)
        outFs.Write(keyEncrypted, 0, lKey)
        outFs.Write(rjndl.IV, 0, lIV)

        Using outStreamEncrypted As CryptoStream = New CryptoStream(outFs, transform, CryptoStreamMode.Write)
            Dim count As Integer = 0
            Dim offset As Integer = 0
            Dim blockSizeBytes As Integer = rjndl.BlockSize / 8
            Dim data As Byte() = New Byte(blockSizeBytes - 1) {}
            Dim bytesRead As Integer = 0

            Using inFs As FileStream = New FileStream(decFile, FileMode.Open)

                Do
                    count = inFs.Read(data, 0, blockSizeBytes)
                    offset += count
                    outStreamEncrypted.Write(data, 0, count)
                    bytesRead += blockSizeBytes
                Loop While count > 0

                inFs.Close()
            End Using

            outStreamEncrypted.FlushFinalBlock()
            outStreamEncrypted.Close()
        End Using

        outFs.Close()
    End Using
End Sub

Шифрование работает на всех компьютерах. Но код описания, который находится ниже, является проблемой:

Public Sub DecryptFile(ByVal enFile As String)
    Dim rjndl As RijndaelManaged = New RijndaelManaged()
    rjndl.KeySize = 256
    rjndl.BlockSize = 256
    rjndl.Mode = CipherMode.CBC
    Dim LenK As Byte() = New Byte(3) {}
    Dim LenIV As Byte() = New Byte(3) {}
    Dim outFile As String = enFile

    Using inFs As FileStream = New FileStream(enFile, FileMode.Open)
        inFs.Seek(0, SeekOrigin.Begin)
        inFs.Seek(0, SeekOrigin.Begin)
        inFs.Read(LenK, 0, 3)
        inFs.Seek(4, SeekOrigin.Begin)
        inFs.Read(LenIV, 0, 3)
        Dim lenK32 As Integer = BitConverter.ToInt32(LenK, 0)
        Dim lenIV32 As Integer = BitConverter.ToInt32(LenIV, 0)
        Dim startC As Integer = lenK32 + lenIV32 + 8
        Dim lenC As Integer = CInt(inFs.Length) - startC
        Dim KeyEncrypted As Byte() = New Byte(lenK32 - 1) {}
        Dim IV As Byte() = New Byte(lenIV32 - 1) {}
        inFs.Seek(8, SeekOrigin.Begin)
        inFs.Read(KeyEncrypted, 0, lenK32)
        inFs.Seek(8 + lenK32, SeekOrigin.Begin)
        inFs.Read(IV, 0, lenIV32)
        Dim KeyDecrypted As Byte() = rsa.Decrypt(KeyEncrypted, False)
        Dim transform As ICryptoTransform = rjndl.CreateDecryptor(KeyDecrypted, IV)

        Using outFs As FileStream = New FileStream(outFile, FileMode.Create)
            Dim count As Integer = 0
            Dim offset As Integer = 0
            Dim blockSizeBytes As Integer = rjndl.BlockSize / 8
            Dim data As Byte() = New Byte(blockSizeBytes - 1) {}
            inFs.Seek(startC, SeekOrigin.Begin)

            Using outStreamDecrypted As CryptoStream = New CryptoStream(outFs, transform, CryptoStreamMode.Write)

                Do
                    count = inFs.Read(data, 0, blockSizeBytes)
                    offset += count
                    outStreamDecrypted.Write(data, 0, count)
                Loop While count > 0

                outStreamDecrypted.FlushFinalBlock()
                outStreamDecrypted.Close()
            End Using

            outFs.Close()
        End Using

        inFs.Close()
    End Using
End Sub

Использование одного и того же ключа должно решить проблему, но это ошибка все время. Я искал везде. Кто-нибудь может мне помочь?

ПРИМЕЧАНИЕ: я просто хочу зашифровать-расшифровать файлы jpg

...