1.什么是三重加密?

对于三重加密,明文块通过加密算法进行加密;然后结果再次通过同一加密算法;第二次加密的结果第三次通过同一加密算法。通常,第二阶段使用解密算法而不是加密算法。

2.为什么3DES的中间部分是解密而不是加密?

第二阶段的解密使用没有任何加密意义。它的唯一优点是允许3DES用户通过重复密钥来解密由旧的单个DES用户加密的数据。

3.既然DES加密的信息利用现有的个人计算机1年就可以破解,为什么DES算法仍将允许在相当长的时间里继续使用?

(1)对算法本身的安全性分析
通过研究算法的性质而破译算法的可能性。这些年来,有很多尝试寻找和研究该算法的弱点,这使得DES是现存加密算法中被研究得最彻底的一个。
尽管进行了那么多尝试,迄今为止仍然没有人成功找到DES的致命缺陷
(2)使用56比特密钥的安全性分析
使用当前的技术,甚至不需要使用特殊的专用硬件即可破解DES。相反地,商业的速度和现成的处理器威胁DES的安全。
但128位或者更大的密钥,仅使用蛮力攻击方法不能有效的破解密钥。即便将攻击系统的速度提高1012倍,仍然需要花费100000年的时间去破解。
现存的最重要的3DES算法,实际上就是将DES重复使用达到增加密钥长度的目的。 3DES是一个强大的算法,因为底层密码算法是DEA。
DEA声称的对基于其算法的破译的抵抗能力,3DES同样也有。而且,由于168的密钥长度,穷举攻击更没有可能。

3DES是FIPS批准的可选对称加密算法。
●使用单个56比特密钥的原始DES,只在以往系统的标准下允许,新设计必须支持3DES。
●鼓励以往用DES系统的政府机构转换到3DES系统
●预计3DES与高级加密标准(AES)将作为FIPS批准的算法共存,并允许3DES逐步过渡到AES。

4.对一个密码体制的安全性分析一般从哪些方面进行分析?

•对算法本身的安全性分析
•密钥的安全性分析(穷举分析)

5.高级加密标准(AES)

有和3DES等同或者更高的安全强度,并且效率显著提高。是分组大小为128比特的分组密码,支持密钥长度为128,192和256比特。结构不是Feistel结构,而是在每轮替换和移位时都并行处理整个数据分组。输入的密钥被扩展成44个32比特字的数组,4个不同的字用作每轮的轮密钥。进行了4个不同的步骤,一个移位,三个替换:字节替换,行移位,列混合,轮密钥加。

6.分组密码

分组密码处理固定大小的明文输入分组,且对每个明文分组产生同等大小的密文分组。

7.三重DES (3DES)

3DES是FIPS批准的可选对称加密算法。使用单个56比特密钥的原始DES,只在以往系统的标准下允许,新设计必须支持3DES。鼓励使用以往DES系统的政府机构转换到3DES。允许3DES过度到AES。它是一个强大的算法,有对于基于其算法的破译的抵抗力,抗穷举攻击。
使用三个密钥并执行三次DES算法的算法,其组合过程依照加密-解密-加密(EDE)的顺序进行。通过三个不同的密钥,3DES的有效密钥长度为168比特。

8.考虑一个对称的加密算法如下式,用64比特密钥来加密明码文本(未加密文件)的32比特的加密块。

3des前后端加解密 3des为什么要解密一次_密钥长度


其中:C=密码文本,K=密钥,K0=K的最左边的64比特,K1=K的最右边的64比特,⊕按位异或,⊞=加法模264。(即:a⊞b=(a+b) mod 264。如果不考虑超过264。它的逆运算就是减法,但不能直接用减法符号,但可以用负号)。

a.写出解密方程式,写出以P为导函数的C、K0和K1的方程式。

b.假设敌人获得了两组明码文本和与它们相对应的密码文本,并且企图得到K。有以下两组等式:

3des前后端加解密 3des为什么要解密一次_加密算法_02


3des前后端加解密 3des为什么要解密一次_密钥长度_03


首先,推导一个未知量的方程(例如,K0),是否可能进一步确定K0?

答案:

a. 设-X是X的加法逆元,于是:-X⊞X =0。那么:
P= (C⊞-K1)⊕K0
b. 不大可能,因为这里的两个运算符无法使用算数法则(结合律或者分配律)。所以即使我们可以联立两个方程式,仍然无法消元。

9.最简单的“严格“对称块加密算法是微型加密算法(TEA)。TEA运用128比特的密钥来操作64比特的明码文本模块,这个明码文本被分为2个32比特块(L0,R0),并且密钥分别为4个32比特块(K0,K1,K2,K3)。加密需要重复应用一对轮(rounds),轮i和i+1如下定义:

3des前后端加解密 3des为什么要解密一次_加密算法_04


a.就运用常量序列的重要性和益处发表看法。

b. 运用加密码的结构图和流程图来阐明TEA的运作。

c. 如果仅有一对轮被使用,然后这个密码文本包括了64位块( L2,R2),在这个例子中,依据等式来解释这个解密算法。

d. 运用与b部分相似的说明来解释c部分。

a 常量确保每轮的加密/解密不同
b 前两轮是这样的

3des前后端加解密 3des为什么要解密一次_密钥长度_05


C 首先,让我们定义加密过程


3des前后端加解密 3des为什么要解密一次_加密算法_06

现在是解密过程。输入是密文(L2,R2),输出是明文(L0,R0)。解密本质上与加密相同,子密钥和增量值的应用顺序相反。还要注意,不必使用减法,因为每个方程中都有偶数个加法。

3des前后端加解密 3des为什么要解密一次_密钥长度_07


d.


3des前后端加解密 3des为什么要解密一次_密钥长度_08

10.说明Feistel解密是Feistel加密的逆过程。
正确答案:

为了确保具有相反密钥顺序的同一算法产生正确的结果,请考虑图2.2,图2.2显示了16轮算法的加密过程从左侧向下,解密过程从右侧向上(任何轮数的结果都相同)。为了清楚起见,对于通过加密算法传输的数据,我们使用符号LEi和REi;对于通过解密算法传输的数据,使用LDi和RDi。该图表明,在每一轮中,解密过程的中间值等于加密过程的相应值,并且值的两半被交换。换句话说,让第i个加密轮的输出为LEi
| | REi(Li与Ri连接)。然后,第(16–i)轮解密的对应输入是RDi | |LDi。让我们通过这个图来演示前面断言的有效性。为了简化图表,它被展开,而不是显示每次迭代结束时发生的交换。但请注意,加密过程第i阶段结束时的中间结果是通过连接LEi和REi形成的2w比特量,解密过程第i阶段结束时的中间结果是通过连接LDi和RDi形成的2w比特量。
在加密过程的最后一次迭代之后,输出的两半被交换,因此密文是RE16 | |LE16。那一轮的输出是密文。现在把这个密文作为同一算法的输入。第一轮的输入是RE16 | LE16,等于加密过程第十六轮输出的32位交换。
现在我们要证明,第一轮解密过程的输出等于第十六轮加密过程的输入的32位交换。首先,考虑加密过程。我们看到:

3des前后端加解密 3des为什么要解密一次_迭代_09

3des前后端加解密 3des为什么要解密一次_加密算法_10


因此,我们得到LD1=RE15和RD1=LE15。因此,第一轮解密过程的输出是LE15 | |RE15,即32-的位交换输入到第十六轮加密。如图所示,这种对应关系贯穿16次迭代。我们可以把这个过程概括起来。对于加密算法的第i次迭代:


因此,我们将第i次迭代的输入描述为输出的函数,这些方程证实了下图右侧所示的赋值。 最后,我们看到最后一轮解密过程的输出是RE0 | | LE0。32位交换恢复原始明文,证明了Feistel解密过程的有效性。

11.为什么2DES不安全?

2DES所用的密钥长度是112位,所以2DES所产生的安全性(破解2DES的时间复杂性)应该与相当。
之所以说2DES不安全,因为破解2DES的时间复杂性远远低于,约略大于。下面进行证明:
设小明用K1、K2执行2DES,给小红发送加密过的情书。我们已经截获了小明的给小红的情书原文p(plain text)和密文c(cipher
text)。我们相信小明也是用K1、K2给小琳发信息,我们严重怀疑他给小琳发的也是情书。故此进行破解! 破解代码如下

Dictionary<string, string> dic = new Dictionary<string, string>();
>                 foreach (var k1 in allKeys)
>                 {
>                     string middle = E(k1, p);
>                     dic.Add(middle, k1);
>                 }
>                 foreach (var k2 in allKeys)
>                 {
>                     string middle = D(k2, c);
>                     if (dic.ContainsKey(middle))
>                     {
>                         Console.WriteLine("密钥是" + dic[middle] + "和" + k2);
>                         break;
>                     }
>                 }

Dictionary是一个键值对的集合,dic[middle]是从dic里取得以middle为键的值,即第一次foreach时的k1。
应用算法复杂性理论,该算法的复杂度在于函数E、D、dic.Add、dic.ContainsKey。如果内存很大,Dictonary散列函数很少冲突,则dic的两个操作的时间可忽略不计。
于是,E函数要执行次,D函数也要执行次,总共次。远远低于预计的次。 证毕

12.设想一个16轮,128比特块长,128比特密钥长度的Feistel密码。如果一个k已经给出,前8个密钥调度算法决定值k1,k2,…K8,然后设定: K9=K8, K10=k7, K11=K6, … , K16=K1
假设有一个密码文本C,如果通过一个解密数据库来解密C并且运用单一数据库问题来确定m。这表明了对于一个选中的明码文本攻击,这个密码是很脆弱的(当给出一个明码文本,一个加密数据库能返回相对应的密码文本。设备的内部信息是未知的,你不能打开这个设备。你仅能够通过对它的质疑和关注它的反应来从数据库获得信息)。

由于关键时刻表,第9轮至第16轮中使用的圆函数是第1轮至第8轮中使用的圆函数的镜像。从这个事实我们可以看出加密和解密是相同的。我们得到一个密文c。设m’=c。要求oracle加密m’。oracle加密返回的密文将是c的解密。

13.任何块密码事实上是一个非线性函数,这对安全来说是至关重要的。这样看来,设想有一个线性的分组密码来把128比特的明码文本块加密到128比特的密码文本块,让EL(k,m)指出在密钥k下的128比特信息m的安全加密,因此,

3des前后端加解密 3des为什么要解密一次_加密算法_11


对所有128比特格式的m1,m2

描述用128个选中的密码文本,敌人怎样能在不知道秘钥后的情况下解密任何密码。

(一个“被选中的密码文本”意味着这个敌人有能力来选择密码文本然后对它进行解密。在这个情况中,拥有了128明码文本和密码文本对,你就有能力来选择密文的值)

答案:

对于1≤i≤128,取

3des前后端加解密 3des为什么要解密一次_3des前后端加解密_12

即{0000…0,0100…0,0010…0,…,0000…001}


(每个元素都是128位,其中位置i为1,其它位为0)。为获取这128个密文的明文,设m1,m2… .


,m128是相应的明文。现在,给定任何不包含全0的密文c,有一个唯一的ci的非空子集,可以一起异或得到,令I©表示此子集,显然I©⊆{1,2,3,…128}。观察到:


3des前后端加解密 3des为什么要解密一次_3des前后端加解密_13


因此,我们通过计算

3des前后端加解密 3des为什么要解密一次_迭代_14


得到c的明文,让0成为全部为零字符串。注意到E(0)=E(0⊕0)=E(0)⊕E(0)=0。因此,c=0的明文是m=0。因此,我们可以解密每个

3des前后端加解密 3des为什么要解密一次_3des前后端加解密_15

14.说明DES解密是DES加密的逆过程。
答案:

DES的解密过程和DES的加密过程算法相同,只不过将16轮的子密钥序列K1,K2……K16的顺序倒过来。即第一轮用第16个子密钥K16,第二轮用K15,其余类推。
①.X0’=YIP=(R16L16IP-1)*IP=R16L16
②解密第一轮:

3des前后端加解密 3des为什么要解密一次_3des前后端加解密_16

L1’=L16, 参考加密最后一轮:L1’=L16=R15 R1’=R16⊕f(L16,K16),参考加密最后一轮:
R1’=(L15⊕f(R15,K16))⊕f(R15,K16)=L15 即 解密第1轮输出为:R15L15
同理解密第2轮输出为:R14L14
第16轮输出为:R0 L0
③最后空交换一次后 R16’L16’IP-1=L0R0IP-1=(x*IP)*IP-1=x明文