Wubbable Skrevet 24. juli 2008 Del Skrevet 24. juli 2008 (endret) Altså, går det an med .NET sine cryptoprovidere, som f.eks. RijndaelManaged, å få til dette: Jeg krypterer "HALLO" Og får tilbake "LBJFK" (kun eksempel) Som dere ser, vil jeg ha samme mengde bytes som den originale stringen/bytearrayen... Slik som det er nå, krypterer jeg 8 bytes, og får 32 tilbake Koden: Dim SHA As New System.Security.Cryptography.SHA256CryptoServiceProvider SHA.ComputeHash(System.Text.Encoding.UTF8.GetBytes("psw")) Dim RJ As New System.Security.Cryptography.RijndaelManaged RJ.BlockSize = 256 RJ.Key = SHA.Hash RJ.IV = SHA.Hash Dim MemorySTR As New IO.MemoryStream Dim CryptoSTR As New CryptoStream(MemorySTR, RJ.CreateEncryptor, CryptoStreamMode.Write) Dim b() As Byte = System.Text.Encoding.UTF8.GetBytes("12345678") CryptoSTR.Write(b, 0, b.Length) CryptoSTR.FlushFinalBlock() MemorySTR.Position = 0 ReDim b(MemorySTR.Length - 1) MemorySTR.Read(b, 0, MemorySTR.Length) Noen måte å gjøre dette på ved hjelp av de innebygde providerene? Endret 24. juli 2008 av Wubbable Lenke til kommentar
HDSoftware Skrevet 24. juli 2008 Del Skrevet 24. juli 2008 (endret) Lite trolig, men her har du en enkelt liten greie som krypterer ganske greit og som resulterer i samme lengde: static public class EncryptionClass { public static string Encrypt(string pPassedString, string pPassword) { string WorkString = pPassedString; int strLength = WorkString.Length; int passLength = pPassword.Length; char[] tmpWorkString = WorkString.ToCharArray(); int i = 0; for(int o = 0; o < strLength; o++) { byte num1 = (byte)tmpWorkString[o]; byte num2 = (byte)pPassword[i]; byte xored = (byte)(num1 ^ num2); char Temp = (char)xored; tmpWorkString[o] = Temp; i++; if(i >= passLength) i = 0; } return new string(tmpWorkString); } } Sånn cirka fordi jeg måtte ta det ut av sammenhengen i min egen rutine fordi jeg også legger på checksum og kontrollsiffere. Dette er selvsagt et gitt antall siffer på egne posisjoner i den krypterte teksten, men du ville kunn ha samme lengde og da blir det sånn. hth edt: Var vist noen skrivefeil Endret 24. juli 2008 av HDSoftware Lenke til kommentar
Wubbable Skrevet 25. juli 2008 Forfatter Del Skrevet 25. juli 2008 (endret) Tenkte noe litt sterkere enn XOR da edit: System.Security.Cryptography.{alg}.Mode = CipherMode.CTS Den modusen vil fungere, siden den gir lik lengde som input'en, antatt at input > 1 Problemet er at hverken AES, Rijndael eller TripleDES aksepterer den modusen... Googlet litt også, men uten hell Noen ideer? Endret 25. juli 2008 av Wubbable Lenke til kommentar
HDSoftware Skrevet 25. juli 2008 Del Skrevet 25. juli 2008 Tenkte noe litt sterkere enn XOR da edit: System.Security.Cryptography.{alg}.Mode = CipherMode.CTS Den modusen vil fungere, siden den gir lik lengde som input'en, antatt at input > 1 Problemet er at hverken AES, Rijndael eller TripleDES aksepterer den modusen... Googlet litt også, men uten hell Noen ideer? Vell, siden passordet kan være så langt du vill så burde vel en XOR være like bra som noe annet. En kryptering er vel i bunn og grunn endring av bits uansett om det heter 3des, rijndael eller aes. Så vidt jeg vet så er f.eks. Rijndael basert på en seed nøkkel som så krypteres sammen med dataene for å få en ny nøkkel. Selve krypteringen er nok basert på XOR logikk på ett eller annet plan. Rutinen min er jo enkel og krypterer med en ukjent nøkkel. At den går rett frem og tar byte for byte i nøkkelen er jo en smal sak å endre på. F.eks. kan du jo lage logikk som endrer nøkkelen under veis ved å plukke en verdi fra dataene på bakgrunn av tverrsummen av BYTE verdien fra den aktuelle nøkkel verdien. Mange måter å gjøre det på. Er vel kunn Brute-Force som kan knekke dette så vidt jeg kan se, men jeg er jo ingen kryptolog så hva vet vel jeg ;-) Lenke til kommentar
Wubbable Skrevet 25. juli 2008 Forfatter Del Skrevet 25. juli 2008 Also, the XOR cipher is completely vulnerable to the known-plaintext attack, since (plaintext) XOR (ciphertext) = (key). Noe av det jeg krypterer er tekst, og teksten kan eksporteres Lenke til kommentar
Manfred Skrevet 25. juli 2008 Del Skrevet 25. juli 2008 Men det er jo strengt tatt ikke noe problem hvis du bruker secret key! Lenke til kommentar
Wubbable Skrevet 25. juli 2008 Forfatter Del Skrevet 25. juli 2008 (endret) Fant det ut med Rijndael... Satte bare paddingmodusen til RJ.Padding = PaddingMode.None *teste dekryptering* Fant det ut, til de som er interesserte: Public Class RJCrypt Private ICT_Enc As System.Security.Cryptography.ICryptoTransform Private ICT_Dec As System.Security.Cryptography.ICryptoTransform Sub New(ByVal password As String) Dim SHA As New System.Security.Cryptography.SHA256Managed SHA.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password)) For i As Integer = 0 To 100000 : SHA.ComputeHash(SHA.Hash) : Next Dim SB() As Byte = SHA.Hash ReDim Preserve SB(15) Dim RJM As New System.Security.Cryptography.RijndaelManaged RJM.BlockSize = 128 RJM.Padding = PaddingMode.None RJM.Mode = CipherMode.CBC ICT_Enc = RJM.CreateEncryptor(SHA.Hash, SB) ICT_Dec = RJM.CreateDecryptor(SHA.Hash, SB) End Sub Public Sub Encrypt(ByRef buffer() As Byte) ICT_Enc.TransformBlock(buffer, 0, buffer.Length, buffer, 0) ICT_Enc.TransformFinalBlock(buffer, 0, buffer.Length) End Sub Public Sub Decrypt(ByRef buffer() As Byte) ICT_Dec.TransformBlock(buffer, 0, buffer.Length, buffer, 0) ICT_Dec.TransformFinalBlock(buffer, 0, buffer.Length) End Sub End Class Grunnen til at jeg bruker ICT er at jeg slipper alt vaset med å først ha en cryptostream som skriver til en annen stream, for så å lese den streamen og returne bytene Hastighet Men merk: Lengden på buffer() må være en multiple av 16 ^^ edit: Måtte legge til transformfinalblock, ellers kunne du f.eks. ikke kryptere en byte() to ganger, så dekryptere to ganger Endret 26. juli 2008 av Wubbable Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå