Avatar billede hlt Juniormester
03. maj 2008 - 13:26 Der er 11 kommentarer og
1 løsning

Kryptering eller ?

Hej
Jeg har et lille problem som jeg håber nogen kan hjælpe mig med. Jeg har brug for at "kryptere" noget tekst, som skal gemmes i en database, og på den måde, hvis uvedkommende får adgang til databasen, skjule informationerne for dem. teksten skal kunne hentes ud igen og dekrypteres så man kan læse indholdet.
Jeg har fundet denne kode på nettet, og forsøgt at æbdre den så det passer til det jeg skal bruge det til. Men nu får jeg alle mulige fejl, når jeg forsøger at dekryptere teksten igen.
Jeg har forsøgt at lave teksten fra databasen om til byte igen, men det virker ikke helt efter hensigten.
Er der en anden måde at gøre det på. Og vil det gøre hele siden sløv hvis alt skal krypteres/dekrypteres hele tiden?

Dim myRijndael As New RijndaelManaged()

            ' Encrypt the string to an array of bytes.
            Dim encrypted As Byte() = encryptStringToBytes_AES(original, myRijndael.Key, myRijndael.IV)

            ' Decrypt the bytes to a string.
            Dim roundtrip As String = decryptStringFromBytes_AES(encrypted, myRijndael.Key, myRijndael.IV)

            'Display the original data and the decrypted data.
            'TextBox1.Text = encrypted
            'TextBox2.Text = roundtrip
            Dim str As String
            For i = 0 To encrypted.Length - 1
                str = str & (encrypted(i))
            Next
Function encryptStringToBytes_AES(ByVal plainText As String, ByVal Key() As Byte, ByVal IV() As Byte) As Byte()
        ' Check arguments.
        If plainText Is Nothing OrElse plainText.Length <= 0 Then
            Throw New ArgumentNullException("plainText")
        End If
        If Key Is Nothing OrElse Key.Length <= 0 Then
            Throw New ArgumentNullException("Key")
        End If
        If IV Is Nothing OrElse IV.Length <= 0 Then
            Throw New ArgumentNullException("Key")
        End If
        ' Declare the streams used
        ' to encrypt to an in memory
        ' array of bytes.
        Dim msEncrypt As MemoryStream = Nothing
        Dim csEncrypt As CryptoStream = Nothing
        Dim swEncrypt As StreamWriter = Nothing

        ' Declare the RijndaelManaged object
        ' used to encrypt the data.
        Dim aesAlg As RijndaelManaged = Nothing

        ' Declare the bytes used to hold the
        ' encrypted data.
        Dim encrypted As Byte() = Nothing

        Try
            ' Create a RijndaelManaged object
            ' with the specified key and IV.
            aesAlg = New RijndaelManaged()
            aesAlg.Key = Key
            aesAlg.IV = IV

            ' Create a decrytor to perform the stream transform.
            Dim encryptor As ICryptoTransform = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV)

            ' Create the streams used for encryption.
            msEncrypt = New MemoryStream()
            csEncrypt = New CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)
            swEncrypt = New StreamWriter(csEncrypt)

            'Write all data to the stream.
            swEncrypt.Write(plainText)

        Finally
            ' Clean things up.
            ' Close the streams.
            If Not (swEncrypt Is Nothing) Then
                swEncrypt.Close()
            End If
            If Not (csEncrypt Is Nothing) Then
                csEncrypt.Close()
            End If
            If Not (msEncrypt Is Nothing) Then
                msEncrypt.Close()
            End If
            ' Clear the RijndaelManaged object.
            If Not (aesAlg Is Nothing) Then
                aesAlg.Clear()
            End If
        End Try
        ' Return the encrypted bytes from the memory stream.
        Return msEncrypt.ToArray()

    End Function


    Function decryptStringFromBytes_AES(ByVal cipherText() As Byte, ByVal Key() As Byte, ByVal IV() As Byte) As String
        ' Check arguments.
        If cipherText Is Nothing OrElse cipherText.Length <= 0 Then
            Throw New ArgumentNullException("cipherText")
        End If
        If Key Is Nothing OrElse Key.Length <= 0 Then
            Throw New ArgumentNullException("Key")
        End If
        If IV Is Nothing OrElse IV.Length <= 0 Then
            Throw New ArgumentNullException("Key")
        End If
        ' TDeclare the streams used
        ' to decrypt to an in memory
        ' array of bytes.
        Dim msDecrypt As MemoryStream = Nothing
        Dim csDecrypt As CryptoStream = Nothing
        Dim srDecrypt As StreamReader = Nothing

        ' Declare the RijndaelManaged object
        ' used to decrypt the data.
        Dim aesAlg As RijndaelManaged = Nothing

        ' Declare the string used to hold
        ' the decrypted text.
        Dim plaintext As String = Nothing

        Try
            ' Create a RijndaelManaged object
            ' with the specified key and IV.
            aesAlg = New RijndaelManaged()
            aesAlg.Key = Key
            aesAlg.IV = IV

            ' Create a decrytor to perform the stream transform.
            Dim decryptor As ICryptoTransform = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV)

            ' Create the streams used for decryption.
            msDecrypt = New MemoryStream(cipherText)
            csDecrypt = New CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)
            srDecrypt = New StreamReader(csDecrypt)

            ' Read the decrypted bytes from the decrypting stream
            ' and place them in a string.
            plaintext = srDecrypt.ReadToEnd()
        Finally
            ' Clean things up.
            ' Close the streams.
            If Not (srDecrypt Is Nothing) Then
                srDecrypt.Close()
            End If
            If Not (csDecrypt Is Nothing) Then
                csDecrypt.Close()
            End If
            If Not (msDecrypt Is Nothing) Then
                msDecrypt.Close()
            End If
            ' Clear the RijndaelManaged object.
            If Not (aesAlg Is Nothing) Then
                aesAlg.Clear()
            End If
        End Try
        Return plaintext

    End Function
Avatar billede arne_v Ekspert
03. maj 2008 - 15:16 #1
Din kryptering og dekrypytering virker fint hos mig. Jeg mener at koden kunne laves
lidt nemmere. Men det virker altså.

Fejlen må ligge i forbindelse med at gemme i eller hente fra database.
Avatar billede hlt Juniormester
03. maj 2008 - 20:43 #2
Det går også fint med at gemme teksten i databasen, men når jeg skal hente den ud igen og lave den lange række af tal om til tekst får jeg en fejl, (Length of the data to decrypt is invalid)
Avatar billede arne_v Ekspert
03. maj 2008 - 20:49 #3
Jeg tror at vil finde det nemmere at gemme i text form f.eks. base64.

Men et eller andet må der gå galt i enten din gem eller hent fra DB.

Hvilken felt type gemmer du i og hvordan tilgår du databasen ?

(det skal være en binary type og der skal bruges parameters)
Avatar billede hlt Juniormester
03. maj 2008 - 21:06 #4
ok, jeg gemmer det bare som alm. tekst. men hvad mener du med at der skal være parameters med? Jeg bygger min sql sætning op med "insert into tabel(...) values(...) og laver forbindelsen til databasen sammen med denne sætning.
Men har du et eksempel på at gemme i base64, og hvad er base64 helt præcist?
jeg er egentlig ligeglad med hvordan det bliver gemt, det skal bare ikke være tilgængeligt i ren tekst, hvis uvedkommende skulle få adgang til databasen.
Avatar billede arne_v Ekspert
03. maj 2008 - 21:47 #5
Du kan ikke gemme et byte array med en normal INSERT uden parameters.

Base64 konverterer binære data til text data.
Avatar billede arne_v Ekspert
03. maj 2008 - 21:49 #6
Kode snippet:

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

Public Class MainClass
    Private Shared utf As Encoding = New UTF8Encoding()
    Private Shared aes As Rijndael = New RijndaelManaged()
    Private Shared iv As Byte() = {1, 2, 3, 4, 5, 6, _
        7, 8, 9, 10, 11, 12, _
        13, 14, 15, 16}
    Public Shared Function Encrypt(plain As String, key As String) As String
        Dim aesenc As ICryptoTransform = aes.CreateEncryptor(utf.GetBytes(key), iv)
        Return Convert.ToBase64String(aesenc.TransformFinalBlock(utf.GetBytes(plain), 0, utf.GetByteCount(plain)))
    End Function
    Public Shared Function Decrypt(cipher As String, key As String) As String
        Dim aesdec As ICryptoTransform = aes.CreateDecryptor(utf.GetBytes(key), iv)
        Dim b As Byte() = Convert.FromBase64String(cipher)
        Return utf.GetString(aesdec.TransformFinalBlock(b, 0, b.Length))
    End Function
    Public Shared Sub Main(args As String())
        Console.WriteLine(Encrypt("Dette er en test !", "hemmeligabcdefgh12345678"))
        Console.WriteLine(Decrypt(Encrypt("Dette er en test !", "hemmeligabcdefgh12345678"), "hemmeligabcdefgh12345678"))
    End Sub
End Class
Avatar billede hlt Juniormester
04. maj 2008 - 00:24 #7
Jamen det ser jo ud til at det er det jeg skal bruge. Nu skal jeg lige have det sat ind i resten af koden og få det sat sammen med databasen. Men skal jeg stadig have lavet feltet om til at være binary eller kan jeg godt lade det være tekst?
Og hvad med "hemmeligadb....." Det er vel noget jeg selv skal lave en eller anden form for bogstav/tal sekvens. Men skal den have en vis længde? Og hvad gør iv arrayet?
Jeg håber du gider bruge lidt tid på at forklare det. Og smid et svar så får du point.
Ihvertfald tusind tak for hjælpen
Avatar billede arne_v Ekspert
04. maj 2008 - 01:58 #8
Med base64 kan du bruge varchar/text/nvarchar/ntext.

"hemmeligabcdefgh12345678" er den key jeg bruger. Key skal have en vis længde.

iv skal bare være ens for kryptering og dekryptering.

Og svar.
Avatar billede hlt Juniormester
04. maj 2008 - 10:18 #9
Tak for dit svar, men vil det sige at den key er en som jeg selv kan/skal lave. ved du hvor lang den skal være eller er det noget jeg kan prøve mig lidt frem med. Nu er jeg ikke helt med på hvordan den kryptere, men hvis alle i teorien bruge den samme nøgle, er det så ikke lige meget med krypteringen, eller bliver det sat sammen på en anden måde?
Avatar billede arne_v Ekspert
04. maj 2008 - 17:10 #10
Eksemplet antyder at den skal være 24 lang. Du kan også prøve med 16. Du får en
exception ved invalid længde.

Det gælder ved alle former for kryptering (af den slags) at den der krypterer og
den der dekrypterer skal have den samme key.

I din originale kode brugte du bare en key som .NET genererede.

Der er ikke noget som siger at alle skal bruge samme key. Du kan bruge brugernes
password som (basis for) key.

Men selvom de bruger samme key, så er der stadig noget beskyttelse. De sorte hatte skal
så både bruge en kopi af databasen og algoritme+key.
Avatar billede hlt Juniormester
04. maj 2008 - 23:50 #11
Det lyder fornuftigt. Så skulle det være sikkert nok. Det har så åbnet for et nyt problem. Jeg henter en liste med de tekster som er krypteret. Og det gør jeg ved hjælp af en SQLdatasource. Findes der en måde hvorpå man kan kalde en metode til at dekryptere teksten når den indlæses i gridviwet, eller er jeg nødt til at genere en liste selv? Det ville være lidt nemmere hvis man bare lige kunne kalde dekrypterings metoden når listen bliver/er genereret. Jeg ved godt at det egentligt er et nyt spørgsmål, men det er lidt relateret til det her. Men hvis du vil kan jeg lave et nyt spørgsmål som du måske vil svare på?
Avatar billede arne_v Ekspert
05. maj 2008 - 01:04 #12
Jeg ved ikke meget om GridView.

Jeg ville udføre en query i code behind og læse ind i en List<Something> og binde
kontrollen til denne.
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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