Avatar billede jackass- Nybegynder
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 :-)
Avatar billede Slettet bruger
11. juni 2012 - 15:02 #1
Prøv ar gå ind her og søg efter program.http://download.cnet.com/windows/
Avatar billede jackass- Nybegynder
11. juni 2012 - 15:16 #2
Det er da under "Programmering » C#" jeg har posted denne og ikke under "free trial software download sites", ikk'? :-)
Avatar billede arne_v Ekspert
11. juni 2012 - 15:25 #3
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.
Avatar billede jackass- Nybegynder
11. juni 2012 - 15:35 #4
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.?
Avatar billede arne_v Ekspert
12. juni 2012 - 05:28 #5
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.
Avatar billede jackass- Nybegynder
12. juni 2012 - 07:48 #6
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.
Avatar billede arne_v Ekspert
12. juni 2012 - 08:11 #7
Base64 er kun relevant for output ikke for input.
Avatar billede arne_v Ekspert
12. juni 2012 - 08:13 #8
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"));
    }
}
Avatar billede arne_v Ekspert
12. juni 2012 - 08:19 #9
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.
Avatar billede jackass- Nybegynder
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"
Avatar billede arne_v Ekspert
12. juni 2012 - 12:47 #11
Proev lige med en key som er 16 tegn lang.
Avatar billede jackass- Nybegynder
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"
Avatar billede arne_v Ekspert
12. juni 2012 - 13:59 #13
Kan du poste den kode som du koerer?
Avatar billede jackass- Nybegynder
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);
Avatar billede arne_v Ekspert
12. juni 2012 - 15:30 #15
Hvad er Decrypt2?

Indeholder txLog.Text det som den skal?
Avatar billede arne_v Ekspert
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
Avatar billede arne_v Ekspert
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();
    }
}
Avatar billede jackass- Nybegynder
31. august 2012 - 10:44 #18
Tak for det, smider du et svar? :-)
Avatar billede arne_v Ekspert
31. august 2012 - 15:03 #19
svar
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