03. maj 2008 - 13:26Der 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
Med kunstig intelligens skaber HP’s nye OmniBook X 14 en unik og skræddersyet brugeroplevelse målrettet dem, der ønsker høj ydeevne og intelligente funktioner
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)
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.
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
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
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?
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å?
Jeg ville udføre en query i code behind og læse ind i en List<Something> og binde kontrollen til denne.
Synes godt om
Ny brugerNybegynder
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.