Как реализовать System.Security.Cryptography.DES - PullRequest
0 голосов
/ 05 декабря 2010

У меня есть следующий класс статического шифрования с методами расширения.

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 ]

1 голос
/ 05 декабря 2010

Ваша проблема в том, что у вас есть 2 "sa = DES.Create ();"в методе Encrypt () этот второй сбрасывает ключ, и iv также необходимо указать ключ и IV.Вы шифруете одним ключом, затем, когда вы расшифровываете, вы используете другой ключ, поэтому он не расшифровывается.

Надеюсь, это поможет.Расшифровка.

DES - очень слабый алгоритм, который вы можете подумать об AES / Rijndael.Даже TripleDES лучше, чем просто DES.

1 голос
/ 05 декабря 2010

Вы ошибочно полагаете, что длина зашифрованного текста будет такой же, как у открытого текста.

Любой приличный шифр (и даже DES, который не является приличным шифром) создаст зашифрованный текст, который значительно больше, чем открытый текст.

Вам нужно продолжать чтение из CipherStream до тех пор, пока у вас не закончатся данные.


Заметьте, кстати, что вы должны быть в состоянии сделать ваш код намного проще, сериализовав и десериализовав непосредственно с CipherStream.

0 голосов
/ 05 декабря 2010

Реализован класс RijndaelSimple из http://www.obviex.com/samples/Encryption.aspx

...