Avatar billede jacknet Nybegynder
19. april 2006 - 19:31 Der er 17 kommentarer og
1 løsning

Padding is invalid and cannot be removed

Hey,

Min applikation smider en exception når jeg forsøger at dekryptere tekst fra en fil. Koden er stort set den fra VS2005's code snippet for dekryptering af en fil.

Jeg får følgende fejl: Padding is invalid and cannot be removed.

Min kode:

Public Function Decrypt(ByVal name As String) As String
            Dim loc As String = String.Format("{0}\{1}.txt", Locations.SafeItemsDirectory, name)
            Dim stream As FileStream = File.Open(loc, FileMode.OpenOrCreate)

            Dim alg As Rijndael = Rijndael.Create
            alg.IV = _iv
            alg.Key = _password

            Dim crypto As New CryptoStream(Stream, alg.CreateDecryptor(), CryptoStreamMode.Read)
            Dim reader As New StreamReader(crypto)

            Return reader.ReadToEnd ' Her går det galt

            reader.Close()
            crypto.Close()
            stream.Close()
        End Function
Avatar billede jacknet Nybegynder
19. april 2006 - 19:33 #1
Smider også lige koden til kryptering:

Public Sub Encrypt(ByVal name As String, ByVal data As String)
            Dim loc As String = String.Format("{0}\{1}.txt", Locations.SafeItemsDirectory, name)
            Dim stream As FileStream = File.Open(loc, FileMode.OpenOrCreate)

            Dim alg As Rijndael = Rijndael.Create
            alg.IV = _iv
            alg.Key = _password

            Dim crypto As New CryptoStream(Stream, alg.CreateEncryptor(), CryptoStreamMode.Write)
            Dim writer As New StreamWriter(crypto)

            writer.WriteLine(data)

            writer.Close()
            crypto.Close()
            stream.Close()
        End Sub
Avatar billede arne_v Ekspert
19. april 2006 - 20:49 #2
jeg er meget skeptisk overfor brug af Writer og Reader med binary data

kan du ikke bruge raa stream IO ?
Avatar billede jacknet Nybegynder
19. april 2006 - 20:57 #3
Hvordan mener du? Og hvorfor?

Jeg er åben overfor forslag :)
Avatar billede arne_v Ekspert
19. april 2006 - 21:07 #4
Dim writer As New StreamWriter(crypto)
writer.WriteLine(data)

->

crypto.Write(Encoding.Default.GetBytes(data))

og

Dim reader As New StreamReader(crypto)
Return reader.ReadToEnd

->

crypto.Read(b, 0, n)
return Encoding.Default.ToString(b, 0, n)

hvor b er et passende stort byte array
Avatar billede arne_v Ekspert
19. april 2006 - 21:17 #5
det sidste skal vaere:

n = crypto.Read(b, 0, b.Length)
return Encoding.Default.ToString(b, 0, n)
Avatar billede jacknet Nybegynder
19. april 2006 - 21:22 #6
Okay, men jeg har ingen anelse om hvad passende stort er..
Avatar billede arne_v Ekspert
19. april 2006 - 21:33 #7
du bruger filens stoerelse !
Avatar billede jacknet Nybegynder
19. april 2006 - 22:19 #8
Nå ja... Nu er det vist også på tide jeg holder for i dag :)

Return Encoding.Default.ToString(b, 0, n) forstår jeg ikke lige helt... Så vidt jeg kan se tager ToString ikke i mod sådan et sæt parametre.

En anden ting; det skal vel være:
n = crypto.Read(b, 0, b.Length -1) ?
Avatar billede arne_v Ekspert
19. april 2006 - 22:21 #9
Return Encoding.Default.GetString(b, 0, n)
Avatar billede arne_v Ekspert
19. april 2006 - 22:22 #10
hvorfor vil du traekke 1 fra - C# er ikke C
Avatar billede jacknet Nybegynder
19. april 2006 - 22:25 #11
Length giver vel 1 for meget når arrayet starter ved 0?
Avatar billede jacknet Nybegynder
19. april 2006 - 22:39 #12
Anyways, jeg får "Padding is invalid and can not be removed." ved:
n = crypto.Read(b, 0, b.Length)
Avatar billede arne_v Ekspert
19. april 2006 - 22:44 #13
nej

arrayet indeholder b.Length elementer med index fra 0 til b.Length-1

men det argument er antal elementer ikke index paa sidste element
Avatar billede arne_v Ekspert
19. april 2006 - 22:49 #14
jeg bliver vist noedt til at lave et simpelt eksempel

:-)
Avatar billede arne_v Ekspert
19. april 2006 - 23:08 #15
det her virker:

Imports System
Imports System.IO
Imports System.Text
Imports System.Security.Cryptography

Public Class MainClass
    Public Shared Sub Save(data As String, key As String, fnm As String)
        Dim stm As Stream = New FileStream(fnm, FileMode.Create, FileAccess.Write)
        Dim alg As Rijndael = Rijndael.Create
        alg.IV = New Byte() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }
        alg.Key = Encoding.Default.GetBytes(key)
        Dim crypto As New CryptoStream(stm, alg.CreateEncryptor(), CryptoStreamMode.Write)
        Dim b As Byte() = Encoding.Default.GetBytes(data)
        crypto.Write(b, 0, b.Length)
        crypto.Close()
    End Sub
    Public Shared Function Load(fnm As String, key As String) As String
        Dim n As Integer = (New FileInfo(fnm)).Length
        Dim stm As Stream = New FileStream(fnm, FileMode.Open, FileAccess.Read)
        Dim alg As Rijndael = Rijndael.Create
        alg.IV = New Byte() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }
        alg.Key = Encoding.Default.GetBytes(key)
        Dim crypto As New CryptoStream(stm, alg.CreateDecryptor(), CryptoStreamMode.Read)
        Dim b(n) As Byte
        n = crypto.Read(b, 0, b.Length)
        crypto.Close()
        return Encoding.Default.GetString(b, 0, n)
    End Function
    Public Shared Sub Main(ByVal args As String())
        Save("Dette er en lille test", "012345670123456701234567", "C:\cryp.dat")
        Console.WriteLine(Load("C:\cryp.dat", "012345670123456701234567"))
    End Sub
End Class
Avatar billede jacknet Nybegynder
20. april 2006 - 17:31 #16
Tak for det :) Smid et svar.
Avatar billede arne_v Ekspert
20. april 2006 - 17:36 #17
OK

du har ogsaa faaet det til at virke ?
Avatar billede jacknet Nybegynder
20. april 2006 - 17:43 #18
Hahahha... Ja, ellers havde jeg sagt noget :)

Jeg undrer mig dog over at det andet ikke ville virke, men nu er kryptografi og streams heller ikke lige noget jeg er super god til.

Tak for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester