[ EmptyBlog @ 29.06.2005. 17:49 ] @
imam sledeći problem:
Kada kriptujem 8 bajta DES-om, dobijem rezultat od 16 bajta. Koristim CryptoStream, pa pretpostavljam da to on pretvara u karaktere. Kako ovo da riješim?
Evo koda(MSDN)key-8 bajta,IV-8bajta, i 8 bajta za kriptovanje:
Code:

private static void EncryptData(String inName, String outName, byte[] desKey, byte[] desIV)
 {    
     //Create the file streams to handle the input and output files.
     FileStream fin = new FileStream(inName, FileMode.Open, FileAccess.Read);
     FileStream fout = new FileStream(outName, FileMode.OpenOrCreate, FileAccess.Write);
     fout.SetLength(0);
       
     //Create variables to help with read and write.
     byte[] bin = new byte[100]; //This is intermediate storage for the encryption.
     long rdlen = 0;              //This is the total number of bytes written.
     long totlen = fin.Length;    //This is the total length of the input file.
     int len;                     //This is the number of bytes to be written at a time.
 
     DES des = new DESCryptoServiceProvider();          
     CryptoStream encStream = new CryptoStream(fout, des.CreateEncryptor(desKey, desIV), CryptoStreamMode.Write);
                
     Console.WriteLine("Encrypting...");
 
     //Read from the input file, then encrypt and write to the output file.
     while(rdlen < totlen)
     {
         len = fin.Read(bin, 0, 100);
         encStream.Write(bin, 0, len);
         rdlen = rdlen + len;
         Console.WriteLine("{0} bytes processed", rdlen);
     }
 
     encStream.Close();  
     fout.Close();
     fin.Close();                   
 }


I kad koristim MemoryStream rezultat je 16 bajta. Pretpostavljam da CryptoStream to pretvara u karaktere, ali kao da ja tu vratim u 8 bajta?
Da li ima neko C .dll biblioteku sa DES, pa da napišem wrapper u C#.
[ havramm @ 29.06.2005. 18:22 ] @
To je sasvim OK ponasanje. DES je simetricni blok sifarski kriptografski algoritam koji radi sa blokovima duzine 8 bajta pa prema tome moze da kriptuje samo blokove te duzine. E sad da bi znao kada je kraj, nad poslednjim blokom mora da se izvrsi padding (PKCS#5) i to na taj nacin da se uvek dobije celi broj blokova, tj. ukoliko mu prosledis 5 bajta on ce izvrsiti padding sa 3 bajta da bi dobio blok duzine 8 bajta, a ukoliko mu prosledis blok cija je duzina jednaka celobrojnom umnosku duzine bloka on ce izvrsiti padding tako sto ce dodati jedan ceo blok za padding, tj. u tvom slucaju posto si mu prosledio plain text duzine 8 bajta on mora da izvrsi padding a to ce izvrsiti tako sto ce dodati jos jedan blok za padding, konkretno u tvom slucaju ce to biti blok koji izgleda ovako:
Code:
0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08
Zbog cega 0x08? Zbog toga sto je dodato 8 bajtova za padding, logicno zar ne (pogledaj PKCS#5, sekcija 6.1.1) ? Ukoliko bi imao plain text duzine 5, tvoj padding text bi izgledao ovako
Code:
0x03, 0x03, 0x03
Na taj nacin rade svi simetricni blok sifarski kriptografski algoritmi (DES, 3DES, AES) u modovima ECB i CBC.
Nadam se da sam bio od pomoci i da sam bar malo pojasnio...

[Ovu poruku je menjao havramm dana 29.06.2005. u 19:26 GMT+1]
[ EmptyBlog @ 29.06.2005. 18:31 ] @
Da li to znači da je prvih 8 bajta, dobijenog kriptograma, ustvari moj željeni kriptogram?
[ havramm @ 29.06.2005. 18:35 ] @
Ne, bice da nisi procitao moj post - tvoj cipher je duzine 16. Znaci
Code:
cipher_length = ((plain_length / block_length) + 1) * block_length


OK?

'/' je celobrojno deljenje!!

[Ovu poruku je menjao havramm dana 29.06.2005. u 19:37 GMT+1]
[ EmptyBlog @ 29.06.2005. 18:43 ] @
Šefe, nov sam u kriptografiji...
Hajde ti meni objasni kako da kriptujem 8 bajta, a da dobijem kriptogram od ,takođe, 8 bajta, u DES naravno.

P.S. Može li se kriptovati bajt za bajtom, a ne po blokovima?
[ havramm @ 29.06.2005. 18:53 ] @
Naravno da moze , sto odma' nisi pitao?! To sto tebi treba se zove(u) CFB (Cipher Feedback Mode) i OFB (Output Feedback Mode) i predstavlja prakticno stream encryption sa blok sifarskim algoritmima, a u .NET-u se postavlja sa
Code:
SymmetricAlgorithm.Mode = CipherMode.CFB; // ili CBC, ECB, OFB...

SymmetricAlgorithm je bazna klasa svih simetricnih algoritama i DESCryptServiceProvider je izveden iz nje. Pogledaj CipherMode Enumeration
[ EmptyBlog @ 29.06.2005. 18:57 ] @
E, ziv bio.
Nemoj nigdje da bježiš, možda mi zatrebaš ovih dana. :)))
Hvala puno.