信息安全技术与实施-第四章-习题(2)

2018-11-29 16:36

延伸阅读

柯克霍夫斯(Kerckhoffs)原则

即使密码系统中的算法为密码分析者所知,也难以从截获的密文推导出明文或密钥。

也就是说,密码体制的安全性仅应依赖于对密钥的保密,而不应依赖于对算法的保密。

只有在假设攻击者对密码算法有充分的研究,并且拥有足够的计算资源的情况下仍然安全的密码才是安全的密码系统。 一句话: “一切秘密寓于密钥之中”

对于商用密码系统而言,公开密码算法的优点包括: ①有利于对密码算法的安全性进行公开测试评估; ②防止密码算法设计者在算法中隐藏后门; ③易于实现密码算法的标准化;

④有利于使用密码算法产品的规模化生产,实现低成本和高性能。 但是必须要指出的是,密码设计的公开原则并不等于所有的密码在应用时都一定要公开密码算法。例如世界各国的军政核心密码就都不公开其加密算法。

综上,一个提供机密性服务的密码系统是实际可用的,必须满足的基本要求:

①系统的保密性不依赖于对加密体制或算法的保密,而仅依赖于密钥的安全性。 “一切秘密寓于密钥之中”是密码系统设计的一个重要原则。 ②满足实际安全性,使破译者取得密文后在有效时间和成本范围内,确定密钥或相应明文在计算上是不可行的。

③加密和解密算法应适用于明文空间、密钥空间中的所有元素。

④加密和解密算法能有效地计算,密码系统易于实现和使用。 2.对称密码技术中密钥有几个,能否通过一个密钥推导出另一个密钥?

对称密码体制和非对称密码体制根据密码算法所使用的加密密钥和解密密钥是否相同、能否由加密过程推导出解密过程(或者由 解密过程推导出加密过程),可将密码体制分为对称密码体制(也叫作单钥密码体制、秘密密钥密 码体制、对称密钥密码体制)和非对称密码体制(也叫作双钥密码体制、公开密钥密码体制、非对 称密钥密码体制)。 如果一个加密系统的加密密钥和解密密钥相同, 或者虽然不相同, 但是由其中的任意一个可以很 容易地推导出另一个, 则该系统所采用的就是对称密码体制。 对称密码体制的优点是具有很高的 保密强度, 可以达到经受较高级破译力量的分析和攻击。 但它的密钥必须通过安全可靠的途径传 递,密钥管理成为影响系统安全的关键性因素,使它难以满足系统的开放性要求。 如果一个加密系统把加密和解密的能力分开, 加密和解密分别用两个

不同的密钥实现, 并且不可 能由加密密钥推导出解密密钥(或者不可能由解密密钥推导出加密密钥), 则该系统所采用的就是 非对称密码体制。采用非对称密码体制的每个用户都有 一对选定的密钥,其中一个是可以公开的,另一个由用户自己秘密保存。非对称密码体制的主要 优点是可以适应开放性的使用环境,密钥管理问题相对简单,可以方便、安全地实现数字签名和 验证。 3.DES算法中,如何生成密钥,其依据的数学原理是什么? 1. 移位和循环移位:

移位就是将一段数码按照规定的位数整体性地左移或右移。循环右移就是当右移时,把数码的最后的位移到数码的最前头,循环左移正相反。例如,对十进制数码12345678循环右移1位(十进制位)的结果为81234567,而循环左移1位的结果则为23456781。

当时自己在这里栽过很大的跟头,这里的循环移位,指的是前后28位密码的位臵循环左移,比如

49 42 35 28 21 14 7 42 35 28 21 14 7 0 0 50 43 36 29 22 15 循环左移一位 50 43 36 29 22 15 8

8 1 51 44 37 30 23 ————————> 1 51 44 37 30 23 16

16 9 2 52 45 38 31 9 2 52 45 38 31 49 2. 臵换:

就是将数码中的某一位的值根据臵换表的规定,用另一位代替。它不像移位操作那样整齐有序,看上去杂乱无章。这正是加密所需,被经常应用。 DES密钥扩展算法:

for each round i = 1,2,3....n

LK = cyclically left shift LK by ri bits RK = cyclically left shift RK by ri bits

The left half of subkey Ki consists of bits of LP of LK The right half of subkey Ki consits of bits of RP of RK next i 具体的操作:

特别注意:这里讲的数字都是指密钥的具体位臵,而不是密钥的内容

1. 我们将DES的56位密钥从左到右从0开始编号。首先扩展DES密钥的前28位,并进行臵换,结果称为LK,DES密钥的LK是原始密钥的下列各位: 49 42 35 28 21 14 7 0 50 43 36 29 22 15 8 1 51 44 37 30 23 16 9 2 52 45 38 31

通俗讲,就是说第一位前面的28位密钥中,第一位放的元素就是原先56中的第49位,第二位就是原先的42位

2. 类似的,DES密钥的剩余28位称为RK,由原始密钥的下列各位构成 55 48 41 34 27 20 13 6 54 47 40 33 26 19 12 5 53 46 39 32 25 18 11 4 24 17 10 3

3. 在进行密钥扩张算法之前,还需要定义LP臵换: 13 16 10 23 0 4 2 27 14 5 20 9 22 18 11 3 25 7 15 6 26 19 12 1

这也是我刚开始百思不得其解的地方,其实也很简单,就是将经过移位之后的左边的28位密钥重现编号,再按下标放好 缺少8,17,21,24 4.RP臵换

12 23 2 8 18 26 1 11 22 16 4 19 15 20 10 27 5 24 17 13 21 7 0 3 缺少了6,9,14,25 具体实现的代码:

view plaincopy to clipboardprint? #include

int secretKey[56];//密钥

int subSecretKey[17][48];//16轮的子密钥1-16

int leftSecretKey[28]; int rightSecretKey[28]; int subLeftSecretKey[24]; int subRightSecretKey[24]; int sumOfk[56]; int LK[28] = {

49,42,35,28,21,14,7, 0,50,43,36,29,22,15, 8,1,51,44,37,30,23, 16,9,2,52,45,38,31 };

int RK[28] = {

55,48,41,34,27,20,13, 6,54,47,40,33,26,19, 12,5,53,46,39,32,25, 18,11,4,24,17,10,3 };

int LP[24] = { //缺少8,17,21,24 13,16,10,23,0,4,2,27,14,5,20,9, 22,18,11,3,25,7,15,6,26,19,12,1 };

int RP[24] = { //缺少6,9,14,25 12,23,2,8,18,26,1,11,22,16,4,19, 15,20,10,27,5,24,17,13,21,7,0,3 };

void leftshiftby1(); //循环左移一位 void leftshiftby2(); //循环左移两位

void leftLK(); //映射,形成leftSecretKey[28] void rightRK(); //映射,形成rightSecretKey[28] void leftLP(); //臵换,形成subLeftSecretKey[24] void rightRP(); //臵换,形成subRightSecretKey[24]; void printSubSecretKey(); //将16轮的子密钥全部打印出来 void computeSumOfk(); //计算机每个密钥位的使用次数 void printSumOfk(); //将每个密钥位的使用次数打印出来 int main(){ int i;

//密钥的初始化

for(i=0;i<56;i++){ secretKey[i] = i; }

//16轮的子密钥生成 for(i=1;i<=16;i++){

if(i==1 || i==2 ||i==9 ||i==16){//循环左移一位 leftshiftby1();

}

else{//循环左移两位 leftshiftby2(); }

//映射,形成leftSecretKey[28],rightSecretKey[28] leftLK(); rightRK();

//臵换,形成subLeftSecretKey[24],subRightSecretKey[24]; leftLP(); rightRP();

//生成第i轮的子密钥 for(int s=0;s<48;s++){ if(s<24){

subSecretKey[i][s] = subLeftSecretKey[s]; }

else{

subSecretKey[i][s] = subRightSecretKey[s-24]; } } }

//输出16轮的子密钥 printSubSecretKey(); computeSumOfk(); printSumOfk();

return 0; }

void leftshiftby1(){ int tempLeft = LK[0]; int tempRight = RK[0]; for(int i=0;i<27;i++){ LK[i] = LK[i+1]; RK[i] = RK[i+1]; }

LK[27] = tempLeft; RK[27] = tempRight; }

void leftshiftby2(){

int tempLeft1 = LK[0],tempLeft2 = LK[1]; int tempRight1 = RK[0],tempRight2 = RK[1]; for(int i=0;i<26;i++){ LK[i] = LK[i+2]; RK[i] = RK[i+2];


信息安全技术与实施-第四章-习题(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:《三级综合医院评审标准实施细则(2011 年版)》

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: