如何实现System.Security.Cryptography.DES

时间:2010-12-05 14:26:44

标签: c# cryptography extension-methods encryption

我有以下带扩展方法的静态加密类。

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

不幸的是,但解密方法总是会抛出错误:Bad Data

我解决这个问题的唯一方法是将SymmetricAlgorithm对象设置为静态,但这对于会话和回收都没有帮助。

我错过了什么吗?

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

3 个答案:

答案 0 :(得分:1)

您错误地认为密文与明文的长度相同。

任何体面的密码(甚至DES,这都不是一个合适的密码)都会产生明显大于明文的密文。

您需要继续读取CipherStream,直到数据用完为止。


顺便说一句,请注意,通过直接针对CipherStream进行序列化和反序列化,您应该能够使代码更多更简单。

答案 1 :(得分:1)

你的问题是你有2“sa = DES.Create();”在Encrypt()方法中,第二个重置密钥,iv也需要指定密钥和IV。您使用一个密钥加密,然后在解密时使用另一个密钥,因此它不会解密。

希望它有所帮助。

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

您需要相同的密钥和Iv才能进行加密和解密。

DES是一个非常弱的算法,你可能想要考虑AES / Rijndael。甚至TripleDES也比普通DES更好。

答案 2 :(得分:0)

http://www.obviex.com/samples/Encryption.aspx

实施Rijndael Simple类