Avatar billede simon.ulsnes Nybegynder
13. december 2002 - 17:02 Der er 11 kommentarer og
2 løsninger

Dekryptering

Hej eksperter,
Jeg sidder lidt og leger med noget kryptering/dekryptering med RSA-algoritmen.

Jeg har fået krypteringen til at virke ved at putte 16 bytes ad gangen ind i mit RSACryptoServiceProvider-objekt fra System.Security.Cryptography. However, jeg kan ikke få dekryptering til at virke - den siger hele tiden at den får forkerte data.

Jeg konverterer output/input til/fra Base64, da brugere skal kunne kopiere/indsætte krypteret tekst og nemt dekryptere det.

Dette er som min dekrypteringsfunktion ser ud nu, men jeg ved at den ikke holder, især ikke delen med byte[] c-arrayet...

        public string Decrypt(string keyfile, string data)
        {
            FileStream fs = new FileStream(keyfile, FileMode.Open, FileAccess.Read, FileShare.Read);
            StreamReader r = new StreamReader(fs, Encoding.UTF8, true);
            string key = r.ReadToEnd();
            r.Close();
            fs.Close();

            CspParameters csp = new CspParameters();
            rsa = new RSACryptoServiceProvider(keysize, csp);
            rsa.FromXmlString(key);

            string decrypted = "";
            int i = 0;
            byte[] input = Convert.FromBase64String(data);
            while (i <= input.Length)
            {
                byte[] c = {input[i], input[i+1], input[i+2], input[i+3], input[i+4], input[i+5], input[i+6], input[i+7], input[i+8], input[i+9], input[i+10], input[i+11], input[i+12], input[i+13], input[i+14], input[i+15]};
                MessageBox.Show(Encoding.ASCII.GetString(c));
                decrypted += Encoding.ASCII.GetString(rsa.Decrypt(c, false));
                i = i+16;
            }

            rsa.Clear();

            return decrypted;
        }

// Simon
Avatar billede ninakir Nybegynder
13. december 2002 - 19:58 #1
Kan dette give dig nogle idéer til løsning af problemet?
http://www.c-sharpcorner.com/Code/2002/Mar/XiteEncryption.asp
Avatar billede simon.ulsnes Nybegynder
13. december 2002 - 20:03 #2
Eksemplet duer ikke med data på mere end 64 byte... (det er af samme grund at jeg har lavet while-loops osv.)

// Simon
Avatar billede tuxic Nybegynder
10. januar 2003 - 18:52 #3
Hvad er problemet nærmere? Kan det oversætte?
Avatar billede simon.ulsnes Nybegynder
12. januar 2003 - 12:54 #4
Jeg kan sagtens få mit program til at kryptere/dekryptere små mængder data. Det er også lykkedes mig at kryptere en tekst ved at nøjes med at kryptere en del af den af gangen og så stykke det hele sammen til sidst, men det kan ikke dekrypteres igen.
Avatar billede tuxic Nybegynder
15. januar 2003 - 18:51 #5
okai jeg vil gå i tænkebox. Spændende problem. Bare som en side bemærkning, RSA benyttes i praksis ikke til at kryptere store datamængder. Fx. i SSL etc benyttes RSA til at udveksle nøgler hvorefter selv "payloaden" krypteres med en blockcipher.
Avatar billede simon.ulsnes Nybegynder
15. januar 2003 - 23:15 #6
OK - hvad bruges til at kryptere store datamængder? :-)
DES? TripleDES?
Avatar billede bechmann Nybegynder
19. januar 2003 - 22:17 #7
Du bruger en symetrisk algoritme - 3DES eller RijnDael (AES).
Avatar billede bechmann Nybegynder
19. januar 2003 - 22:35 #8
Her er noget kode, der vil hjælpe. Koden bruger RijnDael (AES). Du skal selv lave en key og en initialiseringsvektor (IV). Kig på RijndaelManaged.CreateEncryptor().
Encrypt returner en base64 encoded streng og decrypt forventer en base64 encode streng.

Jeg håber koden vil bringe dig videre!!

public string Encrypt(string plaintext, byte[] key, byte[] iv){
  byte[] buf = System.Text.Encoding.Unicode.GetBytes(plaintext);
  RijndaelManaged  rijn = new RijndaelManaged();
  ICryptoTransform crypto = rijn.CreateEncryptor(key, iv);
  System.IO.MemoryStream memoryStream = new System.IO.MemoryStream();
  CryptoStream cryptoStream = new CryptoStream(memoryStream, crypto, CryptoStreamMode.Write);
  cryptoStream.Write(buf, 0, buf.GetLength(0));
  cryptoStream.Close();
  return Convert.ToBase64String(memoryStream.ToArray());
}

public string Decrypt(string ciphertextBase64, byte[] key, byte[] iv){
  RijndaelManaged rijn = new RijndaelManaged();
  ICryptoTransform crypto = rijn.CreateDecryptor(key, iv);
  System.IO.MemoryStream memoryStream = new System.IO.MemoryStream();
  CryptoStream cryptoStream = new CryptoStream(memoryStream, crypto, CryptoStreamMode.Write);
  byte[] buf = Convert.FromBase64String(ciphertextBase64);
  cryptoStream.Write(buf, 0, buf.GetLength(0));
  cryptoStream.Close();
  return System.Text.Encoding.Unicode.GetString(memoryStream.ToArray());
}
Avatar billede simon.ulsnes Nybegynder
19. januar 2003 - 23:04 #9
bechmann >> Tusind tak for koden, men den er symmetrisk... Jeg kan nok godt bruge den i begrænset omfang, men der er ikke så meget pointe i det.
Desværre understøtter asymmetriske algoritmer ikke CryptoStream, det ville ellers gøre det en del nemmere...

// Simon
Avatar billede bechmann Nybegynder
20. januar 2003 - 14:37 #10
Hej Simon
Jeg forstår ikke, at du ikke kan bruge koden. Hvis jeg skulle bruge RSA ville det eneste jeg ville gøre med den være at udveksle nøgler til en symmetrisk algoritme, som så blev brugt til kryptering/dekryptering.
Kan du ikke fortælle, hvorfor du insisterer på at bruge en asymmetrisk algoritme?
Avatar billede simon.ulsnes Nybegynder
20. januar 2003 - 14:43 #11
Det behøver ikke nødvendigvis være en RSA algoritme, det jeg leder efter er et public/secret key system, a la PGP.
Avatar billede bechmann Nybegynder
20. januar 2003 - 21:18 #12
For at lave det bruger du RSA til at verificere, hvem det er i den anden ende. Når det er gjort udveksler du nøgler til symmetrisk algoritme. Det data du skal have overført krypterer du så med den symmetriske algoritme.
Kig på denne side: http://developer.netscape.com/tech/security/ssl/howitworks.html
Avatar billede simon.ulsnes Nybegynder
25. april 2004 - 21:47 #13
Lukker... spørgsmålet er ikke længere relevant.
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
Kurser inden for grundlæggende programmering

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

IT-JOB