2014-07-23 46 views
5

Questa è una domanda principiante,Come restituire byte [] quando si utilizza decrypt CryptoStream (DESCryptoServiceProvider)

Ogni volta che cerco su internet, con la funzione di decriptare DESCryptoServiceProvider ritorno sempre una stringa.

Come possiamo ottenere il byte [] per il reso?

Questo è il codice. Grazie per tutto l'aiuto.

DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider(); 
cryptoProvider.Padding = PaddingMode.None; 
cryptoProvider.Mode = CipherMode.CBC; 

MemoryStream memoryStream = new MemoryStream(value); 
CryptoStream cryptoStream = new CryptoStream(memoryStream, 
cryptoProvider.CreateDecryptor(password, initVector), CryptoStreamMode.Read); 
StreamReader reader = new StreamReader(cryptoStream); 

return reader.ReadToEnd();    
//how to return byte[]; 

risposta

17

ho avuto anche questo problema, e ho creato un class con alcune funzioni di aiutarmi con questi problemi.

La funzione per eseguire la crittografia è:

private byte[] PerformCryptography(ICryptoTransform cryptoTransform, byte[] data) 
     { 
      using (var memoryStream = new MemoryStream()) 
      { 
       using (var cryptoStream = new CryptoStream(memoryStream, cryptoTransform, CryptoStreamMode.Write)) 
       { 
        cryptoStream.Write(data, 0, data.Length); 
        cryptoStream.FlushFinalBlock(); 
        return memoryStream.ToArray(); 
       } 
      } 
     } 

Il ICryptoTransform o è un cifratore spezific o decryptor.

Questo metodo funziona per di altorithm simmetrica

Solo per esempio, i metodi per la crittografia e la decrittografia aspetto simile:

public byte[] Encrypt(byte[] data) 
{ 
    if (CanPerformCryptography(data)) 
    { 
     using (var encryptor = _algorithm.CreateEncryptor(_key, _iv)) 
     { 
      return PerformCryptography(encryptor, data); 
     } 
    } 
    return data; 
} 

public byte[] Decrypt(byte[] data) 
{ 
    if (CanPerformCryptography(data)) 
    { 
     using (var decryptor = _algorithm.CreateDecryptor(_key, _iv)) 
     { 
      return PerformCryptography(decryptor, data); 
     } 
    } 
    return data; 
} 
+0

grazie per la soluzione di sir, funziona davvero. –

+0

ciao Tomtom, io uso try catch per fare PerformCryptography, se il _key utilizza 8 byte di 0 (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00) restituisce catch. Penso che il decryptor abbia rilevato che la chiave è null (in questo caso non null ma 8 byte di 0x00). come farlo bene? thx again –

+1

rilevo l'eccezione, non è la chiave null ma l'eccezione chiave debole. e ho trovato la soluzione [qui] (http://social.msdn.microsoft.com/Forums/en-US/8fdfcce7-3a8a-4271-8557-3df715c80df8/weak-key-cryptographic-exception) –