首先你的问题不是很明确,你是问DES解密的步骤还是就想对某个已知是被DES加密的文件进行解密?如果是第一种:DES加解密的过程是可逆的,解密和加密唯一的不同是使用16个子密钥的顺序相反,具体过程不是一两句话就能说清的如果你想知道可以查看网上的源码或者hi我也行;如果你说的是第二种:可以在网上找DES加解密工具,不过解密的前提是你得知道密钥(当然用穷搜攻击也行不过时间就不划算了)。
你好,很高兴为你解答
请参考文章:
在main 方法里面,判断下不就行了嘛。
输入1的时候,执行加密算法;
输入2的时候执行解密算法。
#region DES加密过程
private string Encrypt(string text)
{
try
{
SymmetricAlgorithm DES = Rijndael.Create();
byte[] byteText = Encoding.Default.GetBytes(text);
DES.Key = ASCIIEncoding.ASCII.GetBytes(Key);
DES.IV = ASCIIEncoding.ASCII.GetBytes(Key);
byte[] cipherBytes = null;
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, DES.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(byteText, 0, byteText.Length);
cs.FlushFinalBlock();
cipherBytes = ms.ToArray();//得到加密后的字节数组
cs.Close();
ms.Close();
}
}
return Convert.ToBase64String(cipherBytes);
}
catch
{
return text;
}
}
#endregion
#region DES解密过程
private string Decrypt(string text)
{
try
{
byte[] cipherText = Convert.FromBase64String(text);
SymmetricAlgorithm DES = Rijndael.Create();
DES.Key = ASCIIEncoding.ASCII.GetBytes(Key);
DES.IV = ASCIIEncoding.ASCII.GetBytes(Key);
byte[] decryptBytes = new byte[cipherText.Length];
using (MemoryStream ms = new MemoryStream(cipherText))
{
using (CryptoStream cs = new CryptoStream(ms, DES.CreateDecryptor(), CryptoStreamMode.Read))
{
cs.Read(decryptBytes, 0, decryptBytes.Length);
cs.Close();
ms.Close();
}
}
return Encoding.UTF8.GetString(decryptBytes).Replace("\0", ""); ///将字符串后尾的'\0'去掉
}
catch
{
return text;
}
}
#endregion
Stringtest=Encrypt(text);//字符串text就加密了。
Stringtest=Decrypt(text);//字符串text就解密了。
再对字符串Stringtest进行其他操作就行了。
第一步是用密钥初始化des
初始化的过程主要是用传入的密钥生成16对长度为48的Kn 子密钥
生成48位子密钥Kn的函数主要是 __create_sub_keys , 主要设计两个换位表pc1和pc2
key = self.__permutate(des.__pc1, self.__String_to_BitList(self.getKey())) 开始先用换位表生成56位的初始key值(同pc1表的位数)
之后划分成两部分self.L和self.R各28位,然后是一个循环16此的左移操作,最后用pc2换位表生成第一个子密钥Kn[0]
我们传入数据调用encrypt函数即可, DES.encrypt('flag{isisisikey}') 我们先来看encrypt函数
encrypt函数主要调用了crypt函数,继续跟进crypt函数,开始一部分是cbc模式获取iv的过程,这里先暂时不考虑cbc,直接看关键部分
这里就设计到分组加密的核心了,为什么DES又叫分组加密,有一操作是 block = self.__String_to_BitList(data[i:i+8]) 把加密数据每八个字节分成一个block,然后调用 __String_to_BitList 会将八字节字符转换为64bit的二进制,每个block再调用 __des_crypt 函数加密
开始几步和子密钥生成函数类似,用一个ip换位表初始化block,然后划分成self,L和self.R 各32位。
之后又是一个16轮的计算,我们分析一下每轮操作
self.R = self.__permutate(des.__expansion_table, self.R) 利用一个扩展表将32bit扩展成48位,扩展表:
B = [self.R[:6], self.R[6:12], self.R[12:18], self.R[18:24], self.R[24:30], self.R[30:36], self.R[36:42], self.R[42:]] 将48位的self.R 分成6*8为,之后一个循环就是经典的是s-box的置换操作
s-box盒一个八个,m是前后2bit,n是中间6bit, v是s-box的(n,m)处的值
self.R = self.__permutate(des.__p, Bn) 是P-box置换盒。 最后返回64bit的processed_block, 经过BitList_to_String函数处理就变成8字节的字符流了,最后把每个block分组join一块就是最后的密文。
我们再来总结一下这个过程
子密钥生成算法
des 加密算法
附上完整版des加解密算法脚本
可能很长
,这是在我以前一个程序里摘出来的。
原理:用户输入创建密码,机器读取,并把每一位密码进行加密,这里就是把每一位的
ascii码加一(也可以有其他的加密方式),然后保存在文件里。解密时从文件中读取保存的乱码,然后把它每一位的asc