Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建使用2DES(doubleDES)加密文件的程序?_C#_.net_Encryption_Des - Fatal编程技术网

C# 如何创建使用2DES(doubleDES)加密文件的程序?

C# 如何创建使用2DES(doubleDES)加密文件的程序?,c#,.net,encryption,des,C#,.net,Encryption,Des,我知道doubleDES不是用于中间相遇攻击,但我需要创建一个进行这种加密的程序。我试过了,但我觉得我被卡住了,就是想不出我错过了什么 DESCryptoServiceProvider DES = new DESCryptoServiceProvider(); DES.Mode = CipherMode.ECB; DES.Padding = PaddingMode.Zeros; // *****ENKRIPTIMI***** DES.Key = utf8.GetBytes(textBox1.T

我知道doubleDES不是用于中间相遇攻击,但我需要创建一个进行这种加密的程序。我试过了,但我觉得我被卡住了,就是想不出我错过了什么

DESCryptoServiceProvider DES = new DESCryptoServiceProvider();

DES.Mode = CipherMode.ECB;
DES.Padding = PaddingMode.Zeros;
// *****ENKRIPTIMI*****
DES.Key = utf8.GetBytes(textBox1.Text.Substring(0, 8));
StreamReader sr = new StreamReader(textBox2.Text);
string permbajtja = sr.ReadToEnd();
sr.Close();
FileStream fs1 = new FileStream(textBox2.Text, FileMode.Create, FileAccess.Write);
CryptoStream cs = new CryptoStream(fs1, DES.CreateEncryptor(), CryptoStreamMode.Write);
StreamWriter sw = new StreamWriter(cs);
sw.Write(permbajtja); sw.Flush();
sw.Close();
StreamReader stream = new StreamReader(textBox2.Text);
string msg = stream.ReadToEnd();
stream.Close();
MessageBox.Show(msg);



//*****DEKRIPTIMI*****

DES.Key = utf8.GetBytes(textBox1.Text.Substring(8, 8));
FileStream fs2 = new FileStream(textBox2.Text, FileMode.Open, FileAccess.Read);
CryptoStream cs1 = new CryptoStream(fs2, DES.CreateDecryptor(), CryptoStreamMode.Read);
StreamReader sr1 = new StreamReader(cs1);
string permbajtja1 = sr1.ReadToEnd();
//    MessageBox.Show(permbajtja1);
sr1.Close();
fs2.Dispose();
fs2.Close();


StreamWriter sw1 = new StreamWriter(textBox2.Text);
sw1.Write(permbajtja1);
sw1.Flush();
sw1.Close();
****以上部分仅用于加密***** 解密部分

DESCryptoServiceProvider DES = new DESCryptoServiceProvider();

DES.Mode = CipherMode.ECB;
DES.Padding = PaddingMode.Zeros;
// *****ENKRIPTIMI*****
DES.Key = utf8.GetBytes(textBox1.Text.Substring(8,8));
StreamReader sr = new StreamReader(textBox2.Text);
string permbajtja = sr.ReadToEnd();
sr.Close();
FileStream fs1 = new FileStream(textBox2.Text, FileMode.Create, FileAccess.Write);
CryptoStream cs = new CryptoStream(fs1, DES.CreateEncryptor(), CryptoStreamMode.Write);
StreamWriter sw = new StreamWriter(cs);
sw.Write(permbajtja); sw.Flush();
sw.Close();
StreamReader lexo = new StreamReader(textBox2.Text);
MessageBox.Show(lexo.ReadToEnd());
lexo.Close();

////*****DEKRIPTIMI*****

DES.Key = utf8.GetBytes(textBox1.Text.Substring(0, 8));
FileStream fs2 = new FileStream(textBox2.Text, FileMode.Open, FileAccess.Read);
CryptoStream cs1 = new CryptoStream(fs2, DES.CreateDecryptor(), CryptoStreamMode.Read);
StreamReader sr1 = new StreamReader(cs1);
string permbajtja1 = sr1.ReadToEnd();
MessageBox.Show(permbajtja1);
sr1.Close();
fs2.Dispose();
fs2.Close();


StreamWriter sw1 = new StreamWriter(textBox2.Text);
sw1.Write(permbajtja1);
sw1.Flush();
sw1.Close();

首先,您应该编写加密和解密方法:

public static string Encrypt(string originalString, byte[] key)
{
    DESCryptoServiceProvider cryptoServiceProvider = new DESCryptoServiceProvider();
    MemoryStream memoryStream = new MemoryStream();
    CryptoStream cryptoStream = new CryptoStream(memoryStream,
        cryptoServiceProvider.CreateEncryptor(key, key),
        CryptoStreamMode.Write);

    using (StreamWriter streamWriter = new StreamWriter(cryptoStream))
    {
        streamWriter.Write(originalString);
        streamWriter.Flush();
        cryptoStream.FlushFinalBlock();
        streamWriter.Flush();

        return Convert.ToBase64String(memoryStream.GetBuffer(), 0, (int)memoryStream.Length);
    }
}

public static string Decrypt(string cryptedString, byte[] key)
{
    DESCryptoServiceProvider cryptoServiceProvider = new DESCryptoServiceProvider();
    MemoryStream memoryStream = new MemoryStream(Convert.FromBase64String(cryptedString));
    CryptoStream cryptoStream = new CryptoStream(memoryStream,
        cryptoServiceProvider.CreateDecryptor(key, key),
        CryptoStreamMode.Read);

    using (StreamReader streamReader = new StreamReader(cryptoStream))
    {
        return streamReader.ReadToEnd();
    }
}
现在,您可以对字符串应用两次加密方法(当然还有两次解密方法):

byte[] key1 = ASCIIEncoding.ASCII.GetBytes("12345678");
byte[] key2 = ASCIIEncoding.ASCII.GetBytes("abcdefgh");

string originalString = "A secret string";
string cryptedString = Encrypt(Encrypt(originalString, key1), key2);
Console.WriteLine("Encrypt message: {0}", cryptedString);
Console.WriteLine("Decrypt message: {0}", Decrypt(Decrypt(cryptedString, key2), key1));

请看一下我的代码,它可能会对您有所帮助。

您能解释一下您的问题出在哪里吗?你有例外吗?问题出在解密部分。。因为我用密钥的第一部分加密,用第二部分解密,在我开始解密后,我用密钥的第二部分加密文本,但我没有得到加密部分(用密钥的第一部分加密的部分)…而且我也没有得到一个例外,我没有得到明文。。。但是其他一些密文要获得ECB模式,只需加密两次(第二次不填充)。非常感谢您的回复,但我想我不太清楚。。2DES的原理是使用16个字符的密钥,这意味着密钥分为两部分,第一部分加密,第二部分解密,得到密文(因为我们用另一个密钥解密,文本仍然无法读取),这是加密部分。为了解密,我们做了一个反向函数,我们取密文,用第二部分密钥加密,然后用第一部分密钥解密,然后得到明文。我的问题是在解密部分,无论我怎么做,我都不需要明文。。再次感谢您的帮助,但请不要犹豫,尽可能多地帮助我。基本上,如果您使用您的代码字符串cryptedString=Decrypt(Encrypt(originalString,key1),key2)尝试此操作;string decryptedString=加密(Decrypt(cryptedString,key1),key2));这行不通。。为什么?@ermyab,我不确定你对2DES算法的看法是否正确。看一看。您可以在第6.4.5.1段中找到关于2DE的内容。它说“在双DES中,每个64位数据块用DES算法加密两次,先用一个密钥,然后用另一个密钥”。哦。。非常感谢你的解释。。你真的帮了我很多,但我还有最后一个问题。。我必须使用FileStream制作程序,你能检查一下我的代码吗?为什么它不能工作?