11. juni 2012 - 14:56
Der er
18 kommentarer og 1 løsning
Encrypt/decrypt text
Hej,
Hvordan kan jeg kryptere/dekryptere tekst? Jeg har fundet nogle eksempler hist og her, men de bruger alle base64.. Hvis jeg forsøger med det, får jeg fejl "invalid base-64 character".
I de aktuelle tekststrenge er der da også karakterer udover de tilladte i.flg.
http://en.wikipedia.org/wiki/Base64 men det skal fungere med al tekst og ikke blot bestemte tegn.
Nogen der kan hjælpe? Pft :-)
Annonceindlæg fra Computerworld it-jobbank
Det er da under "Programmering » C#" jeg har posted denne og ikke under "free trial software download sites", ikk'? :-)
En kryptering vil stort set altid oversætte data til byte[]. Man kan saa konvertere det byte[] til String via enten Base64 eller Hex encoding. Hvis du kender encoding og krypterings algoritme og key, saa kan du dekryptere. Hvis du giver os et eksempel og de 3 oplysninger, saa kan vi lave et kode eksempel.
Det ville blive enormt værdsat :-) Jamen teksten kunne være noget med flere specialtegn i, eksempel: "[15:23:00] ++le> blablabla et eller andet tekst ! $<@". Algoritme: pas.. men key kan være hvad som helst. Enconding skal vel nærmere være ASCII end base64 hvis det skal tillade specialtegn m.v.?
Jeg har ikke den fjerneste anelse om hva det er du vil. Hvis du poster: * et eksempel paa en krypteret og encoded string * kryperings algoritme brugt * key brugt (ogsaa IV hvis saadan er brugt) * encoding brugt saa kan jeg skrive noget kode som kan decode. Hvis det ikke er det du vil, saa maa du forklare hvad du vil.
Beklager, har vist forklaret det lidt skidt. Det jeg i bund og grund mangler er en encrypt() og en decrypt() funktion som kan bruges til at kryptere/dekryptere tekst. Det kan være tekst i alle mulige henseender, men det essentielle er, at det ikke kun er base64 tekst, da der også vil være specialtegn iblandt (fx i et password). Jeg har ikke en algoritme eller lign endnu, det var det jeg håbede på nogen kunne hjælpe med.
Base64 er kun relevant for output ikke for input.
C# kode snippet: using System; using System.Text; using System.Security.Cryptography; public class MainClass { private static Encoding utf = new UTF8Encoding(); private static Rijndael aes = new RijndaelManaged(); private static byte[] iv = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; public static string Encrypt(string plain, string key) { ICryptoTransform encrypt = aes.CreateEncryptor(utf.GetBytes(key), iv); return Convert.ToBase64String(encrypt.TransformFinalBlock(utf.GetBytes(plain), 0, utf.GetByteCount(plain))); } public static string Decrypt(string cipher, string key) { ICryptoTransform decrypt = aes.CreateDecryptor(utf.GetBytes(key), iv); byte[] b = Convert.FromBase64String(cipher); return utf.GetString(decrypt.TransformFinalBlock(b, 0, b.Length)); } public static void Main(string[] args) { Console.WriteLine(Encrypt("Dette er en test !", "hemmeligabcdefgh12345678")); Console.WriteLine(Decrypt(Encrypt("Dette er en test !", "hemmeligabcdefgh12345678"), "hemmeligabcdefgh12345678")); } }
Og hvis du undrer dig over hvordan man kan have alle mulige tegn i input og kun 64 mulige tegn i output saa er tricket at output er stoerre end input.
12. juni 2012 - 12:35
#10
Det ser lækkert ud :P Men den fejler ved ICryptoTransform decrypt = aes.CreateDecryptor(utf.GetBytes(key), iv); ..med IndexOutOfRange: Index was outside the bounds of the array exception. Lidt info: cipher "PB36lK3cOczdV1OCxJk2toXm8COoF+9BrjS476dxm8U=" string key "secret" string I dette tilfælde er det et chatvindue, så teksten har en newline \n på hver linie. Ovenstående eksempel er for teksten "hej med dig"
12. juni 2012 - 12:47
#11
Proev lige med en key som er 16 tegn lang.
12. juni 2012 - 13:07
#12
Så hoppede den i hvert fald forbi dét punkt, men fejlede så ved: return utf.GetString(decrypt.TransformFinalBlock(b, 0, b.Length)); cipher: "sGTRB8lx9FnxL7JXUozUaS6L+EIBG2Zb" key: "hemmeligabcdefgh"
12. juni 2012 - 13:59
#13
Kan du poste den kode som du koerer?
12. juni 2012 - 14:35
#14
Undskyld, der hvor den fejler er ved: byte[] b = Convert.FromBase64String(cipher); {"Invalid character in a Base-64 string."} cipher er: "[14:29:39] Administrator: nick has joined us\n". Når klienten modtager tekst skal den vise det krypteret, så jeg gør: msg = Encrypt(msg + Environment.NewLine, "hemmeligabcdefgh"); txtLog.Clear(); txtLog.AppendText(msg); Og så har jeg en KeyDown og en KeyUp hvor man kan show/hide det cleartext/krypteret med henholdsvis: string txt = Decrypt2(txtLog.Text, "hemmeligabcdefgh"); this.txtLog.Clear(); this.txtLog.AppendText(txt); msg = Encrypt(msg + Environment.NewLine, "hemmeligabcdefgh"); txtLog.Clear(); txtLog.AppendText(msg);
12. juni 2012 - 15:30
#15
Hvad er Decrypt2? Indeholder txLog.Text det som den skal?
12. juni 2012 - 15:51
#16
using System; using System.Text; using System.Security.Cryptography; public class MainClass { private static Encoding utf = new UTF8Encoding(); private static Rijndael aes = new RijndaelManaged(); private static byte[] iv = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; public static string Encrypt(string plain, string key) { ICryptoTransform encrypt = aes.CreateEncryptor(utf.GetBytes(key), iv); return Convert.ToBase64String(encrypt.TransformFinalBlock(utf.GetBytes(plain), 0, utf.GetByteCount(plain))); } public static string Decrypt(string cipher, string key) { ICryptoTransform decrypt = aes.CreateDecryptor(utf.GetBytes(key), iv); byte[] b = Convert.FromBase64String(cipher); return utf.GetString(decrypt.TransformFinalBlock(b, 0, b.Length)); } public static void Main(string[] args) { string key = "hemmeligabcdefgh"; string s1 = "[14:29:39] Administrator: nick has joined us\n"; string s2 = Encrypt(s1, key); string s3 = Decrypt(s2, key); Console.WriteLine(s1); Console.WriteLine(s2); Console.WriteLine(s3); Console.ReadKey(); } } virker her
12. juni 2012 - 16:01
#17
Lidt bedre kode: using System; using System.Text; using System.Security.Cryptography; public class MainClass { private static Rijndael aes = new RijndaelManaged(); private static SHA256 sha = new SHA256Managed(); private static byte[] RealKey(string key) { byte[] b = Encoding.UTF8.GetBytes(key); return sha.TransformFinalBlock(b, 0, b.Length); } public static string Encrypt(string plain, string key, byte[] iv) { ICryptoTransform encrypt = aes.CreateEncryptor(RealKey(key), iv); return Convert.ToBase64String(encrypt.TransformFinalBlock(Encoding.UTF8.GetBytes(plain), 0, Encoding.UTF8.GetByteCount(plain))); } public static string Decrypt(string cipher, string key, byte[] iv) { ICryptoTransform decrypt = aes.CreateDecryptor(RealKey(key), iv); byte[] b = Convert.FromBase64String(cipher); return Encoding.UTF8.GetString(decrypt.TransformFinalBlock(b, 0, b.Length)); } public static void Main(string[] args) { byte[] iv = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; string key = "hemmelig"; string s1 = "[14:29:39] Administrator: nick has joined us\n"; string s2 = Encrypt(s1, key, iv); string s3 = Decrypt(s2, key, iv); Console.WriteLine(s1); Console.WriteLine(s2); Console.WriteLine(s3); Console.ReadKey(); } }
31. august 2012 - 10:44
#18
Tak for det, smider du et svar? :-)
31. august 2012 - 15:03
#19
svar
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.