[C#] Encrypten en decrypten klopt niet

Pagina: 1
Acties:

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

Topicstarter
Ik gebruik de DESCryptoServiceProvider om een tekstje te encrypten en vervolgens weer te decrypten. Probleem is dat het tekstje precies 6 tekens afgekapt wordt. Is dit een bekend probleem, of doe ik iets fout?
C#:
1
2
3
4
5
6
7
8
//Decryption
MemoryStream Output = new MemoryStream();
DES Provider = new DESCryptoServiceProvider();
CryptoStream DecStream = new CryptoStream(Output,
   Provider.CreateDecryptor(EncryptionKey, EncryptionIV),
   CryptoStreamMode.Write);
DecStream.Write(InputBytes, 0, InputBytes.Length);
string ClearText = new UnicodeEncoding().GetString(Output.ToArray());

EncryptionKey en EncryptionIV zijn twee arrays van bytes, die ieder 8 willekeurige waardes hebben, maar wel constant (dus bij encryption worden dezelfde waardes gebruikt). InputBytes is ook een array van bytes, dat is de ouput van m'n encryption methode:
C#:
1
2
3
4
5
6
7
8
9
//Encryption
MemoryStream Output = new MemoryStream();
DES Provider = new DESCryptoServiceProvider();
CryptoStream EncStream = new CryptoStream(Output, 
   Provider.CreateEncryptor(EncryptionKey, EncryptionIV), 
   CryptoStreamMode.Write);
byte[] InputBytes = new UnicodeEncoding().GetBytes(Input);
EncStream.Write(InputBytes, 0, InputBytes.Length);
return Output.ToArray();

De bedoeling is uiteindelijk dus dat de variabele Input, van het type string, hetzelfde is als wat uiteindelijk bij de decryption in de variabele ClearText terecht komt. Maar daar mis ik dus 6 tekens...

日本!🎌


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ik gebruik de volgende code en die werkt gewoon goed

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public static byte[] encrypt( byte[] data, out byte[] key, out byte[] iv )
{
    TripleDESCryptoServiceProvider provider = new TripleDESCryptoServiceProvider();
    provider.GenerateIV();
    provider.GenerateKey();
    key = provider.Key;
    iv = provider.IV;

    ICryptoTransform crypto = provider.CreateEncryptor( key, iv );

    MemoryStream stream = new MemoryStream();
    CryptoStream cryptStream = new CryptoStream( stream, crypto, CryptoStreamMode.Write);
    cryptStream.Write(data, 0, data.Length);
    cryptStream.FlushFinalBlock();
    stream.Position = 0;
    byte[] result = new byte[ stream.Length ];
    stream.Read(result, 0, (int)stream.Length);
    cryptStream.Close();
    return result;
}

public static byte[] decrypt( byte[] inputInBytes, byte[] key, byte[] iv )
{
    TripleDESCryptoServiceProvider tdesProvider = new TripleDESCryptoServiceProvider();
    ICryptoTransform cryptoTransform  = tdesProvider.CreateDecryptor( key, iv );
    MemoryStream decryptedStream = new MemoryStream();
    CryptoStream cryptStream = new CryptoStream( decryptedStream, cryptoTransform, CryptoStreamMode.Write);
    cryptStream.Write(inputInBytes, 0, inputInBytes.Length);
    cryptStream.FlushFinalBlock();
    decryptedStream.Position = 0;
    byte[] result = new byte[ decryptedStream.Length ];
    decryptedStream.Read(result, 0, (int)decryptedStream.Length);
    cryptStream.Close();
    return result;
}

Dat is wel TripleDes maar zou hetzelfde moeten werken.

[offtopic]
Ik zie nou trouwens ook dat ik beter de ToArray() methode kan gebruiken ipv Read met een nieuw array.

[ Voor 4% gewijzigd door Woy op 26-08-2004 12:10 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

Topicstarter
FlushFinalBlock() deed het hem. Ik wist niet dat je die na het schrijven moest aanroepen... Je zou verwachten dat dat wel automatisch gaat, maar niet dus. Bedankt iig :)

日本!🎌


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
_Thanatos_ schreef op 26 augustus 2004 @ 12:15:
FlushFinalBlock() deed het hem. Ik wist niet dat je die na het schrijven moest aanroepen... Je zou verwachten dat dat wel automatisch gaat, maar niet dus. Bedankt iig :)
Een Close() zal waarschijnlijk hetzelfde doen. Athans ik neem aan dat als je Close aanroept dat hij Vanzelf FlushFinalBlock() aanroept.

In principe moet je bij alle Streams Flushen op het moment dat je klaar bent, ookal heeft het niet bij alle streams nut aangezien er direct geschreven wordt. Maar DES is afhankelijk van het vorige blok met Encrypten daarom moet je nog even aangeven dat je klaar bent.

[ Voor 26% gewijzigd door Woy op 26-08-2004 12:20 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”