Avatar billede stephanryer Nybegynder
08. marts 2007 - 19:09 Der er 21 kommentarer og
1 løsning

Alfanumerisk kryptering

Jeg har ledt herinde efter et eksempel på, hvordan man krypterer og dekrypterer en tekst string, så den krypterede streng kun indeholder tekst, der kan sendes med som query-variabel (GET-var) i en browsers adressevindue.

fx. http://domain.dk/minside.aspx?email=12dd1qwdwd3

hvor 12dd1qwdwd3 så kan dekrypteres til den originale tekst-streng igen.

På forhånd tak.
Avatar billede driis Nybegynder
08. marts 2007 - 19:25 #1
Krypter efter din foretrukne metode. Dernæst omdanner du blot dit resulterende byte array til en streng repræsentation; det kan du gøre på mange forskellige måder.

F.eks.:
byte [] secretStuff = DinKrypteringsRutine(DitHemmeligeData);
string secretString = HttpUtility.UrlEncode(Convert.ToBase64String(secretStuff));
Avatar billede driis Nybegynder
08. marts 2007 - 19:31 #2
Bemærk, jeg bruger UrlEncode, fordi en base 64 streng kan indeholde tegn der er ulovlige i en url (eks. = og /).

Du kunne også blot skrive hver byte til en streng i hexadecimalt. Det fylder lidt mere, men det er også super-simpelt at implementere.
Avatar billede stephanryer Nybegynder
08. marts 2007 - 20:04 #3
Well så findes der vel også en UrlDecode?
Avatar billede driis Nybegynder
08. marts 2007 - 20:19 #4
Naturligvis. For at gå tilbage til byte rep. kan du:
byte [] secretStuff = Convert.FromBase64String(HttpUtility.UrlDecode(secretString));
Avatar billede stephanryer Nybegynder
08. marts 2007 - 20:25 #5
Tak for tippet :) Har dog problemer med min kode, men har fået et test-eksempel til at virke, så det virker.

Tak for hjælpen.
Avatar billede stephanryer Nybegynder
08. marts 2007 - 20:38 #6
Hov vent. Kan ikke få det her til at virke. Det jeg gør er, at redirecte til siden selv med den krypterede var og derefter dekryptere den og aflæse den.

Min code behond til min test-fil:


private String qString
{
get {
  if (Request.QueryString["var"] == null)
  {
  return null;
  } else {
  return Request.QueryString["var"];
  }
}
}
public void Page_Load(Object o, EventArgs e)
{
  if (qString != null)
  {
  txtInput.Text = KrypteringsMetoder.DekrypterEmailAdresse(qString);
  }
}
protected void btnGo_Click(object sender, EventArgs e)
{
  Response.Redirect("Default.aspx?var=" + KrypteringsMetoder.KrypterEmailAdress(txtInput.Text));
}


Min html:


<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="test_Default" %>

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
</head>
<body>
    <form runat="server">
        <asp:TextBox runat="server" ID="txtInput"></asp:TextBox>
        <asp:Button runat="server" Text="Button" ID="btnGo" OnClick="btnGo_Click" />
        <asp:Label ID="lblOutput" runat="server" Text="Label"></asp:Label>
    </form>
</body>
</html>



Min krypteringsmetoder:

public static String KrypterEmailAdresse(String tekst)
        {
            if (tekst.Length > 0)
            {
                Encoding utf = new UTF8Encoding();
                DES des = new DESCryptoServiceProvider();
                byte[] key = utf.GetBytes("james007");//krypteringsnøglen
                byte[] iv = { 1, 2, 3, 4, 5, 6, 7, 8 };
                ICryptoTransform encrypt = des.CreateEncryptor(key, iv);
                byte[] cipher = encrypt.TransformFinalBlock(utf.GetBytes(tekst), 0, utf.GetByteCount(tekst));
                string krypteret = Convert.ToBase64String(cipher);
                //Omdan til kode, som kan sendes som URL
                krypteret = HttpUtility.HtmlEncode(krypteret);
                return krypteret;
            }
            else {
                return tekst;
            }
        }

        public static String DekrypterEmailAdresse(String krypteret)
        {
            if (krypteret.Length > 0)
            {
                krypteret = HttpUtility.HtmlDecode(krypteret);
                Encoding utf = new UTF8Encoding();
                DES des = new DESCryptoServiceProvider();
                byte[] key = utf.GetBytes("james007");//krypteringsnøglen
                byte[] iv = { 1, 2, 3, 4, 5, 6, 7, 8 };
                ICryptoTransform decrypt = des.CreateDecryptor(key, iv);
                byte[] cipher = Convert.FromBase64String(krypteret);
                String tekst = utf.GetString(decrypt.TransformFinalBlock(cipher, 0, cipher.Length));
                return tekst;
            }
            else {
                return "";
            }
        }
Avatar billede stephanryer Nybegynder
08. marts 2007 - 20:39 #7
Jeg får fejlen: "Ugyldig længde på et Base-64-tegnarray." og den kastes fra Dekrypteringsmetoden.
Avatar billede stephanryer Nybegynder
08. marts 2007 - 20:46 #8
Det er som om den kun fejler ved lange strenge (eller bestemte tegn, er ikke sikker) men jeg tror ihvertfald ikke det med UrlEncode/-Decode fungerer med alt
Avatar billede stephanryer Nybegynder
08. marts 2007 - 20:56 #9
Ok jeg har kogt problemet ned til følgende:

Denne queryvar:

default.aspx?var=eVN5RxuuorN9Xgf6+QRhuArz3A9dCnvu

er ikke gyldig, selvom den er blevet encoded. Problemet lader til at være det + der er i strengen.

VN5RxuuorN9Xgf6+QRhuArz3A9dCnvu

tolkes som

eVN5RxuuorN9Xgf6 QRhuArz3A9dCnvu

+ bliver altså til mellemrum. :(
Avatar billede stephanryer Nybegynder
08. marts 2007 - 21:19 #10
Har oprettet denne tråd til fortsættelse af mit problem:

http://www.eksperten.dk/spm/766934
Avatar billede arne_v Ekspert
09. marts 2007 - 09:32 #11
konverter til hex fremfor base64/url
Avatar billede stephanryer Nybegynder
09. marts 2007 - 10:43 #12
nååårh ja! - Hvor er der en metode til understøttelse af dette?
Avatar billede arne_v Ekspert
09. marts 2007 - 11:18 #13
jeg mener ikke at der er noget faerdigt

brug en for loekke !
Avatar billede stephanryer Nybegynder
09. marts 2007 - 11:54 #14
ohh altså bare selv lave en metode?
Avatar billede arne_v Ekspert
11. marts 2007 - 17:37 #15
ja

har du brug for et par code snippets ?
Avatar billede stephanryer Nybegynder
11. marts 2007 - 17:38 #16
meget gerne :) gerne til begge veje.
Avatar billede arne_v Ekspert
11. marts 2007 - 18:09 #17
public static string ToHex(byte[] ba)
        {
            StringBuilder sb = new StringBuilder(2 * ba.Length);
            for(int i = 0; i < ba.Length; i++)
            {
                sb.Append(ba[i].ToString("X2"));
            }
            return sb.ToString();
        }
        public static byte[] FromHex(string s)
        {
            byte[] ba = new byte[s.Length/2];
            for(int i = 0; i < ba.Length; i++)
            {
                ba[i] = byte.Parse(s.Substring(2 * i, 2), NumberStyles.HexNumber);
            }
            return ba;
        }
Avatar billede stephanryer Nybegynder
13. marts 2007 - 11:58 #18
Mange tak. Jeg tester det lige :)
Avatar billede stephanryer Nybegynder
13. marts 2007 - 12:18 #19
Jeg er lidt i tvivl om hvordan jeg håndterer det byte array. Skal jeg selv omregne hver byte til hex? Og hvis jeg skal, hvordan definerer man så en byte?

byte b = 1 ?
Avatar billede arne_v Ekspert
13. marts 2007 - 12:21 #20
jeg gik ud fra at du havde et byte array ??
Avatar billede stephanryer Nybegynder
13. marts 2007 - 12:44 #21
nej, jeg har en krypteret streng. Hov vent - gu har jeg da så :D

Hehe, jeg koger. Min fejl. Prøver lige igen.
Avatar billede stephanryer Nybegynder
13. marts 2007 - 13:00 #22
Det fungerer helt optimalt. Tusind tak. Jeg opretter lige en ny tråd med 30 point, for uden dit input var jeg ikke kommet videre :)
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