2012-05-28 7 views
1

J'ai un problème avec le décryptage des données précédemment cryptées. J'utilise le chiffrement séquentiel encrypt-decrypt-encrypt avec trois clés différentes pour obtenir le triple effet. La fonction de chiffrement fonctionne correctement (renvoie un tableau de 8 octets), mais la fonction de déchiffrement renvoie un tableau vide.Cryptage/décryptage DES ECB C#

public static byte[] EncryptDES(byte[] clearData, byte[] key) 
    { 
     DES desEncrypt = new DESCryptoServiceProvider(); 
     desEncrypt.Mode = CipherMode.ECB; 
     desEncrypt.Key = key; 
     ICryptoTransform transForm = desEncrypt.CreateEncryptor(); 
     MemoryStream encryptedStream = new MemoryStream(); 
     CryptoStream cryptoStream = new CryptoStream(encryptedStream, transForm, CryptoStreamMode.Write); 
     cryptoStream.Write(clearData, 0, clearData.Length); 
     byte [] encryptedData = encryptedStream.ToArray(); 
     return encryptedData; 
    } 

    public static byte[] DecryptDES(byte[] clearData, byte[] key) 
    { 
     DES desDecrypt = new DESCryptoServiceProvider(); 
     desDecrypt.Mode = CipherMode.ECB; 
     desDecrypt.Key = key; 
     ICryptoTransform transForm = desDecrypt.CreateDecryptor(); 
     MemoryStream decryptedStream = new MemoryStream(); 
     CryptoStream cryptoStream = new CryptoStream(decryptedStream, transForm, CryptoStreamMode.Write); 
     cryptoStream.Write(clearData, 0, clearData.Length); 
     byte[] encryptedData = decryptedStream.ToArray(); 
     return encryptedData; 
    } 

    public static byte[] Encrypt3DES(byte[] clearData, byte[] key0, byte[] key1, byte[] key2) 
    { 
     byte[] encryptedData1 = new byte[clearData.Length]; 
     byte[] encryptedData2 = new byte[clearData.Length]; 
     byte[] encryptedData3 = new byte[clearData.Length]; 
     encryptedData1 = DESCrypto.EncryptDES(clearData , key0); 
     encryptedData2 = DESCrypto.DecryptDES(encryptedData1, key1); 
     encryptedData3 = DESCrypto.EncryptDES(encryptedData2, key2); 
     return encryptedData3; 
    } 

Qu'est-ce que je fais mal?

+0

Probablement la finalisation (Vider le bloc final ou quelque chose comme ça) ou le padding lié. – CodesInChaos

+0

Merci, le "(Flush final block" et rembourrage mis à – user1421600

+1

btw pourquoi fais-tu quelque chose d'aussi étrange en premier lieu? .NET a construit en 3DES soutien, et ECB est le mauvais choix dans la plupart des applications aussi. – CodesInChaos

Répondre

0

TripleDES existe déjà dans le cadre mais je suppose que vous voulez rouler votre propre implémentation à des fins éducatives.

Vous rendez les choses plus compliquées que nécessaire. Puisque vous utilisez les flux pourquoi ne pas vous les enchaînez tout lieu:

public static byte[] TripleDESEncrypt(byte[] plainText, byte[] key1, byte[] key2, byte[] key3) 
{ 
    var des = DES.Create(); 
    des.Mode = CipherMode.ECB; 

    des.Padding = PaddingMode.None; 
    des.Key = key3; 
    var encryptor1 = des.CreateEncryptor(); 

    des.Key = key2; 
    var decryptor = des.CreateDecryptor(); 

    des.Padding = PaddingMode.PKCS7; 
    des.Key = key1; 
    var encryptor2 = des.CreateEncryptor(); 

    byte[] result; 
    using (var ms = new MemoryStream()) 
    { 
    using (var cs1 = new CryptoStream(ms, encryptor1, CryptoStreamMode.Write)) 
    using (var cs2 = new CryptoStream(cs1, decryptor, CryptoStreamMode.Write)) 
    using (var cs3 = new CryptoStream(cs2, encryptor2, CryptoStreamMode.Write)) 
     cs3.Write(plainText, 0, plainText.Length); 

    result = ms.ToArray(); 
    } 


    return result; 
} 

public static byte[] TripleDESDecrypt(byte[] cipherText, byte[] key1, byte[] key2, byte[] key3) 
{ 
    var des = DES.Create(); 
    des.Mode = CipherMode.ECB; 

    des.Padding = PaddingMode.PKCS7; 
    des.Key = key1; 
    var decryptor1 = des.CreateDecryptor(); 

    des.Padding = PaddingMode.None; 
    des.Key = key2; 
    var encryptor = des.CreateEncryptor(); 

    des.Key = key3; 
    var decryptor2 = des.CreateDecryptor(); 

    byte[] result; 
    using (var ms = new MemoryStream()) 
    { 
    using (var cs1 = new CryptoStream(ms, decryptor1, CryptoStreamMode.Write)) 
    using (var cs2 = new CryptoStream(cs1, encryptor, CryptoStreamMode.Write)) 
    using (var cs3 = new CryptoStream(cs2, decryptor2, CryptoStreamMode.Write)) 
     cs3.Write(cipherText, 0, cipherText.Length); 

    result = ms.ToArray(); 
    } 


    return result; 
} 

Prenez note de l'utilisation des blocs using et aussi comment le rembourrage est appliqué sur les différents cours d'eau.

Le cadre TripleDES est environ 2,5 fois plus rapide que le code ci-dessus.

public static byte[] TripleDESEncryptFramework(byte[] plainText, byte[] key) 
{ 
    var tdes = TripleDES.Create(); 
    tdes.Mode = CipherMode.ECB; 
    tdes.Padding = PaddingMode.PKCS7; 
    tdes.Key = key; 

    var encryptor = tdes.CreateEncryptor(); 

    byte[] result; 
    using (var ms = new MemoryStream()) 
    { 
    using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)) 
     cs.Write(plainText, 0, plainText.Length); 

    result = ms.ToArray(); 
    } 

    return result; 
} 

Si vous voulez comparer les résultats des deux méthodes de chiffrement différents, alors vous devez vous rappeler que la clé 24 bits pour TripleDES est en fait les 3 clés mises en un tableau:

[ key1 ][ key2 ][ key3 ] 
============================== 
[   key    ] 
0

Juste besoin de cryptoStream.FlushFinalBlock(). Son code fonctionne très bien:

//ENCRYPT 
    public static byte[] EncryptDES(byte[] clearData, byte[] key) 
    { 
     DES desEncrypt = new DESCryptoServiceProvider(); 
     desEncrypt.Mode = CipherMode.ECB; 
     desEncrypt.Key = key; 
     ICryptoTransform transForm = desEncrypt.CreateEncryptor(); 
     MemoryStream encryptedStream = new MemoryStream(); 
     CryptoStream cryptoStream = new CryptoStream(encryptedStream, transForm, CryptoStreamMode.Write); 
     cryptoStream.Write(clearData, 0, clearData.Length); 
     cryptoStream.FlushFinalBlock(); 
     return encryptedStream.ToArray(); 
    } 

    //DECRYPT 
    public static byte[] DecryptDES(byte[] clearData, byte[] key) 
    { 
     DES desDecrypt = new DESCryptoServiceProvider(); 
     desDecrypt.Mode = CipherMode.ECB; 
     desDecrypt.Key = key; 
     ICryptoTransform transForm = desDecrypt.CreateDecryptor(); 
     MemoryStream decryptedStream = new MemoryStream(); 
     CryptoStream cryptoStream = new CryptoStream(decryptedStream, transForm, CryptoStreamMode.Write); 
     cryptoStream.Write(clearData, 0, clearData.Length); 
     cryptoStream.FlushFinalBlock(); 
     return decryptedStream.ToArray(); 
    } 
Questions connexes