2010-11-04 139 views
3

我的主要方法运行时没有错误,但解密后的消息不正确。我几乎肯定我没有正确编码,但我无法确定这个问题。任何帮助将不胜感激。DES加密/解密中的C#编码

这是我的第一篇文章,所以如果我无意中违反了规则或者不遵守指南,请告诉我。

static void Main(string[] args) 
{ 
    string unencryptedString = "cat"; 
    string encryptedString; 
    string decryptedString; 

    string password = "password"; 

    System.Console.WriteLine("Unencrypted String: " + unencryptedString); 
    System.Console.WriteLine("Password: " + password); 

    encryptedString = StandardEncryptor.Encrypt(unencryptedString, password); 
    System.Console.WriteLine("Encrypted String: " + encryptedString); 

    decryptedString = StandardEncryptor.Decrypt(encryptedString, password); 
    System.Console.WriteLine("Decrypted String: " + decryptedString); 

    System.Console.ReadLine(); 
} 

public static string Encrypt(string message, string password) 
{ 
    // Encode message and password 
    byte[] messageBytes = ASCIIEncoding.ASCII.GetBytes(message); 
    byte[] passwordBytes = ASCIIEncoding.ASCII.GetBytes(password); 

    // Set encryption settings -- Use password for both key and init. vector 
    DESCryptoServiceProvider provider = new DESCryptoServiceProvider(); 
    ICryptoTransform transform = provider.CreateEncryptor(passwordBytes, passwordBytes); 
    CryptoStreamMode mode = CryptoStreamMode.Write; 

    // Set up streams and encrypt 
    MemoryStream memStream = new MemoryStream(); 
    CryptoStream cryptoStream = new CryptoStream(memStream, transform, mode); 
    cryptoStream.Write(messageBytes, 0, messageBytes.Length); 
    cryptoStream.FlushFinalBlock(); 

    // Read the encrypted message from the memory stream 
    byte[] encryptedMessageBytes = new byte[memStream.Length]; 
    memStream.Position = 0; 
    memStream.Read(encryptedMessageBytes, 0, encryptedMessageBytes.Length); 

    // Encode the encrypted message as base64 string 
    string encryptedMessage = Convert.ToBase64String(encryptedMessageBytes); 

    return encryptedMessage; 
} 

public static string Decrypt(string encryptedMessage, string password) 
{ 
    // Convert encrypted message and password to bytes 
    byte[] encryptedMessageBytes = Convert.FromBase64String(encryptedMessage); 
    byte[] passwordBytes = ASCIIEncoding.ASCII.GetBytes(password); 

    // Set encryption settings -- Use password for both key and init. vector 
    DESCryptoServiceProvider provider = new DESCryptoServiceProvider(); 
    ICryptoTransform transform = provider.CreateDecryptor(passwordBytes, passwordBytes); 
    CryptoStreamMode mode = CryptoStreamMode.Write; 

    // Set up streams and decrypt 
    MemoryStream memStream = new MemoryStream(); 
    CryptoStream cryptoStream = new CryptoStream(memStream, transform, mode); 
    cryptoStream.Write(encryptedMessageBytes, 0, encryptedMessageBytes.Length); 
    cryptoStream.FlushFinalBlock(); 

    // Read decrypted message from memory stream 
    byte[] decryptedMessageBytes = new byte[memStream.Length]; 
    memStream.Position = 0; 
    memStream.Read(decryptedMessageBytes, 0, decryptedMessageBytes.Length); 

    // Encode deencrypted binary data to base64 string 
    string message = Convert.ToBase64String(decryptedMessageBytes); 

    return message; 
} 
+2

快看看你的代码后,我看不到你所描述的问题,但我建议你不要使用密码初始化向量。每个加密消息的IV必须不同,否则您的加密将容易受到统计分析的影响。可以创建一个随机IV并将其附加(或前置)到密文。 IV并不是秘密,但它必须是一次性的。 – 2010-11-04 20:32:22

+1

此外,DES已损坏。我建议至少3DES,或理想的AES加密块。 AES正式破纪录。 – 2010-11-04 20:37:12

+0

感谢您的建议。 – Dave 2010-11-04 20:48:36

回答

3

问题在倒数第二行?

string message = Convert.ToBase64String(decryptedMessageBytes); 

我可能在这里偏离,但我不认为你打算将字符串字节转换回base64。你只需要将字节转换回字符串?

string message = ASCIIEncoding.ASCII.FromBytes(decryptedMessageBytes); 
+0

唉,我太慢:) – 2010-11-04 20:35:55

+0

这绝对是问题 - 谢谢! – Dave 2010-11-04 20:47:03

+0

我没有找到FromBytes方法。改用GetString。 – Thiago 2013-11-12 18:30:52

1

看起来问题出在解密:

// Encode deencrypted binary data to base64 string 
string message = Convert.ToBase64String(decryptedMessageBytes); 

我不认为你想这样做,以解密数据。解密的字节已经是ASCII。

1

我用解决问题只是这

//Encode deencrypted binary data to base64 string 
string message = ASCIIEncoding.ASCII.GetString(decryptedMessageBytes);