2010-12-05 59 views
0

J'ai la classe de chiffrement statique suivante avec des méthodes d'extension.Comment implémenter System.Security.Cryptography.DES

public static class Encryptor { 
    public static byte[] Encrypt(this object obj) { 
     SymmetricAlgorithm sa = DES.Create(); 
     BinaryFormatter bf = new BinaryFormatter(); 

     MemoryStream ms = new MemoryStream(); 
     bf.Serialize(ms, obj); 
     byte[] plaintextBytes = new byte[ms.Length]; 
     plaintextBytes = ms.ToArray(); 

     sa = DES.Create(); 
     MemoryStream msEncrypt = new MemoryStream(); 
     CryptoStream csEncrypt = new CryptoStream(msEncrypt, sa.CreateEncryptor(), CryptoStreamMode.Write); 
     csEncrypt.Write(plaintextBytes, 0, plaintextBytes.Length); 
     csEncrypt.Close(); 
     byte[] encryptedTextBytes = msEncrypt.ToArray(); 
     msEncrypt.Close(); 

     return encryptedTextBytes; 
    } 

    public static T Decrypt<T>(this byte[] bytes) { 
     SymmetricAlgorithm sa = DES.Create(); 
     MemoryStream msDecrypt = new MemoryStream(bytes); 
     CryptoStream csDecrypt = new CryptoStream(msDecrypt, sa.CreateDecryptor(), CryptoStreamMode.Read); 
     byte[] decryptedTextBytes = new Byte[bytes.Length]; 
     csDecrypt.Read(decryptedTextBytes, 0, bytes.Length); 
     csDecrypt.Close(); 
     msDecrypt.Close(); 

     BinaryFormatter bf = new BinaryFormatter(); 

     MemoryStream ms = new MemoryStream(decryptedTextBytes); 
     return (T)bf.Deserialize(ms); 
    } 
} 

Malheureusement, la méthode de déchiffrement jette toujours une erreur: Bad Data

La seule façon que j'ai eu l'occasion de c'est en faisant le même statique objet SymmetricAlgorithm, mais cela ne suffit pas à travers des sessions et recycle

Ai-je raté quelque chose?

STACK TRACE

[CryptographicException: Bad Data.] 
System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr) +33 
System.Security.Cryptography.Utils._DecryptData(SafeKeyHandle hKey, Byte[] data, Int32 ib, Int32 cb, Byte[]& outputBuffer, Int32 outputOffset, PaddingMode PaddingMode, Boolean fDone) +0 
System.Security.Cryptography.CryptoAPITransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount) +313 
System.Security.Cryptography.CryptoStream.Read(Byte[] buffer, Int32 offset, Int32 count) +649 
LinkSubmitter.Encryptor.Decrypt(Byte[] bytes) in C:\Users\Jeremy\Documents\Visual Studio 2010\Projects\LinkSubmitter\LinkSubmitter\Encryptor.cs:102 
+0

Vous ne devriez pas utiliser DES. Au lieu de cela, utilisez Rijndael. – SLaks

+0

Quelle est la trace de la pile? – SLaks

Répondre

1

Votre problème est que vous avez 2 "sa = DES.Create();" dans la méthode Encrypt(), cette seconde réinitialise la clé et iv vous devez également spécifier la clé et IV. Vous cryptez avec une clé, puis lorsque vous décryptez, vous utilisez une autre clé, donc il ne va pas décrypter.

Espérons que ça aide.

SymmetricAlgorithm sa = DES.Create(); 
sa.Key = new [] {0x38, 0x4B, 0x1A, 0x0A, 0x0F, 0x1D, 0xFA, 0x0D}; 
sa.IV = new [] {0x30, 0x40, 0x10, 0x00, 0x00, 0x10, 0xF0, 0x00}; 

Vous avez besoin de la même clé et Iv pour Encrypt et Decrypt.

DES est un algorithme très faible que vous pourriez vouloir penser à AES/Rijndael. Même TripleDES est meilleur que simplement DES.

1

Vous assumez à tort que le texte chiffré sera la même longueur que le texte en clair.

Tout chiffrement décent (et même DES, qui n'est pas un chiffrement décent) créera un texte chiffré qui est sensiblement plus grand que le texte en clair.

Vous devez continuer à lire depuis CipherStream jusqu'à ce que vous manquiez de données.


note, par ailleurs, que vous devriez être en mesure de rendre votre code beaucoup plus simple par sérialisation et désérialisation directement contre le CipherStream.

+0

L'exception 'Bad Data' est lancée à l'initialisation de l'objet' CryptoStream' –

+0

@Jeremy: C'est parce que vous essayez de lire trop d'octets. – SLaks