Decrypt返回空值

时间:2016-09-29 10:46:30

标签: c# encryption

现在我知道这个问题之前已被问过,我已尝试在我的代码中实现这些解决方案,但它们似乎不起作用,因为它仍然返回空值或者它给了我各种错误。

解密方法

public string DecryptString (string encryptText) 
{  
 byte[] key {}; 
 byte[] IV = { 12, 21, 43, 17, 57, 35, 67, 27};
 string encryptKey = "aX#%710p";
 key  = Encoding.UTF8.GetBytes(encryptKey);
 byte[] byteInput = new byte[encryptText.Length];
 DESCryptoServiceProvider provider = new DESCryptoServiceProvider(); 
 MemoryStream ms = new MemoryStream();
 ICryptoTransform transform = provider.CreateDecryptor( key, IV);
 CryptoStream cs = new CryptoStream(ms, transform, CryptoStreamMode.Write);
 cs.Write( byteInput, 0, byteInput.Length);
 return Encoding.UTF8.GetString(ms.ToArray());
}

这是加密方法,但它工作正常

public string EnryptString (string encryptText) 
{ 
 byte[] key {}; 
 byte[] IV = { 12, 21, 43, 17, 57, 35, 67, 27};
 string encryptKey = "aX#%710p";
 key  = Encoding.UTF8.GetBytes(encryptKey);
 byte[] byteInput = Encoding.UTF8.GetBytes(encryptText);
 DESCryptoServiceProvider provider = new DESCryptoServiceProvider(); 
 MemoryStream ms = new MemoryStream();
 ICryptoTransform transform = provider.CreateEncryptor( key, IV);
 CryptoStream cs = new CryptoStream(ms, transform, CryptoStreamMode.Write);
 cs.Write(byteInput, 0, byteInput.Length);
 return Encoding.UTF8.GetString(ms.ToArray());
}

提前谢谢

2 个答案:

答案 0 :(得分:1)

试试这个

加密

 public static string Encrypt(string clearText)
    {
        string EncryptionKey = "aX#%710p";
        byte[] clearBytes = Encoding.Unicode.GetBytes(clearText);
        using (Aes encryptor = Aes.Create())
        {
            Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
            encryptor.Key = pdb.GetBytes(32);
            encryptor.IV = pdb.GetBytes(16);
            using (MemoryStream ms = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(clearBytes, 0, clearBytes.Length);
                    cs.Close();
                }
                clearText = Convert.ToBase64String(ms.ToArray());
            }
        }
        return clearText;
    }

解密

public static string Decrypt(string cipherText)
    {
        string EncryptionKey = "aX#%710p";
        byte[] cipherBytes = Convert.FromBase64String(cipherText);
        using (Aes encryptor = Aes.Create())
        {
            Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
            encryptor.Key = pdb.GetBytes(32);
            encryptor.IV = pdb.GetBytes(16);
            using (MemoryStream ms = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(cipherBytes, 0, cipherBytes.Length);
                    cs.Close();
                }
                cipherText = Encoding.Unicode.GetString(ms.ToArray());
            }
        }
        return cipherText;
    }

答案 1 :(得分:0)

加密方法至少存在两个问题:

  • 默认mode of operation是CBC模式,需要填充才能工作。读取完整的纯文本后应用填充(或根据您的查看方式编写)。您需要在致电ms.ToArray()之前致电CryptoStream#FlushFinalBlock或使用using语句让语言本身处理正确的关闭流,因为shown是由siby sunny。

  • 绝不将二进制数据存储在字符串中。某些任意字节通常不会产生像UTF-8这样的有效字符编码。您需要使用不同类别的编码,例如Hex或Base64(再次由siby sunny显示)。

解密具有相同的问题,但形式略有不同。

安全问题

现在不要使用DES。它只提供56位安全性。 AES会更好,因为它的最低密钥大小为128位更安全。使用DES的最大密文大小也存在实际限制。请参阅Security comparison of 3DES and AES

对于CBC模式,IV必须是不可预测的(读取:随机)。不要使用静态IV,因为这会使密码具有确定性,因此在语义上不安全。观察密文的攻击者可以确定何时发送相同的消息前缀。 IV不是秘密,因此您可以将其与密文一起发送。通常,它只是在密文之前预先填写并在解密之前切掉。

最好对您的密文进行身份验证,以便像padding oracle attack这样的攻击是不可能的。这可以通过GCM或EAX等经过身份验证的模式完成,也可以使用像HMAC-SHA256这样具有强MAC的encrypt-then-MAC方案来完成。