2012-05-28 212 views
1

我有一个解密之前加密的数据的问题。我正在使用三个不同密钥的顺序加密 - 解密 - 加密来获得三重des效果。加密功能正常工作(返回8字节数组),但解密函数返回空数组。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; 
    } 

我在做什么错?

+0

可能是finalization(Flush final block或类似的东西)或填充相关。 – CodesInChaos

+0

谢谢,“(Flush final block)and padding set to none but。 – user1421600

+1

btw你为什么要做这么奇怪的事情?.NET已经构建了3DES支持,ECB在大多数应用程序中也是错误的选择。 – CodesInChaos

回答

0

TripleDES已经存在于框架中,但我想你想为教育目的推出自己的实现。

您正在使事情变得比必要更复杂。由于使用的是流你为什么不把它们连所有,而不是:

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; 
} 

记下using块的使用和填充,还如何应用到不同的数据流。

框架TripleDES约比上述代码快2.5倍。

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; 
} 

如果要比较两个不同的加密方法的结果,那么你需要记住,TripleDES的24位密钥实际上是3个按键放在一个阵列:

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

只需要cryptoStream.FlushFinalBlock()。它的代码效果很好:

//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(); 
    }