diff --git a/Homework/8team/cccccxx/20180125-00.md b/Homework/8team/cccccxx/20180125-00.md new file mode 100644 index 0000000..119cd6a --- /dev/null +++ b/Homework/8team/cccccxx/20180125-00.md @@ -0,0 +1,97 @@ +### 密码学预热 +逻辑或 + +只要有一个为真即为真 + +1001或1100 结果为1101 + +逻辑与 + +需要两个都为真才是真 + +1001与1110 结果为1000 + +逻辑非 + +反着来 + +1110 非 0001 + +逻辑异或 + +如果两个位不相同则为1,相同则为0,可看为不进位的加法 + +1101 异或 1010 结果为0111 + +逻辑异 + +按位加(即不进位的加法) + +逻辑加 + +也就是或(两者同时为0方为0) + +明码:可以直接看到的 + +补码:原码为正时补码同原码一样,原码为负时,符号位不变,取反加1 + +反码:原码1变0,0变1 +明文:没有加密的文字 + +密文:加密的文字 + +公钥与私钥:公钥加密的内容只能用私钥解密,用私钥加密的内容只能 用公钥解密。 + + 比如说,我要给你发送一个加密的邮件。首先,我必须拥有你的公钥,你也必须拥有我的公钥。 + 首先,我用你的公钥给这个邮件加密,这样就保证这个邮件不被别人看到,而且保证这个邮件在传送过程中没有被修改。你收到邮件后,用你的私钥就可以解密,就能看到内容。 + 其次我用我的私钥给这个邮件加密,发送到你手里后,你可以用我的公钥解密。因为私钥只有我手里有,这样就保证了这个邮件是我发送的。 + 当A->B资料时,A会使用B的公钥加密,这样才能确保只有B能解开,否则普罗大众都能解开加密的讯息,就是去了资料的保密性。验证方面则是使用签 验章的机制,A传资料给大家时,会以自己的私钥做签章,如此所有收到讯息的人都可以用A的公钥进行验章,便可确认讯息是由 A 发出来的了。 + +http://blog.csdn.net/bberdong/article/details/41079739 +http://blog.csdn.net/tanyujing/article/details/17348321 + +密钥空间(密钥数量) +加密密钥大小的范围。通常以位为单位,即以位的多少来对独特密钥进行计数。密钥的位越长,其密钥空间也就越大。例如:当密钥长度为r时,密钥空间有2的r次方个元素。 + +凯撒密码 +基本思想是:通过把字母移动一定的位数来实现加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推X将变成A,Y变成B,Z变成C。由此可见,位数就是凯撒密码加密和解密的密钥。 +特定的当偏移量为3时才是凯撒密码。 +![image](./image/1516692243853.png) + + +简单替换密码 +采用字母表的任何排列组合作为密钥 +![image](./image/1516692260216.png) + + +换位密码 +与明文的字母保持相同,区别是顺序被打乱了。 + +分组密码 +分组密码是将明文消息编码表示后的数字(简称明文数字)序列,划分成长度为n的组(可看成长度为n的矢量),每组分别在密钥的控制下变换成等长的输出数字(简称密文数字)序列。 + +对称密码 +采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。对称密码术通常需要在一个受限组内共享密钥并同时维护其保密性。 + +公钥密码 +公钥密码又称为非对称密码,拥有公钥密码的用户分别拥有加密密钥和解密密钥。通过加密密钥不能得到解密密钥。并且加密密钥是公开的。 +与对称密码相反 + +单向散列函数 +单向散列函数,又称单向Hash函数、杂凑函数,就是把任意长的输入消息串变化成固定长的输出串且由输出串难以得到输入串的一种函数。这个输出串称为该消息的散列值。一般用于产生消息摘要,密钥加密等. + +消息验证码 +密码学中,通信实体双方使用的一种验证机制,保证消息数据完整性的一种工具。构造方法由M.Bellare提出,安全性依赖于Hash函数,故也称带密钥的Hash函数。消息认证码是基于密钥和消息摘要所获得的一个值,可用于数据源发认证和完整性校验。 +在发送数据之前,发送方首先使用通信双方协商好的散列函数计算其摘要值。在双方共享的会话密钥作用下,由摘要值获得消息验证码。之后,它和数据一起被发送。接收方收到报文后,首先利用会话密钥还原摘要值,同时利用散列函数在本地计算所收到数据的摘要值,并将这两个数据进行比对。若两者相等,则报文通过认证。 + +数字签名 +数字签名(又称公钥数字签名、电子签章)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。 +数字签名,就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。 +数字签名技术是将摘要信息用发送者的私钥加密,与原文一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的摘要信息,然后用HASH函数对收到的原文产生一个摘要信息,与解密的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的完整性。 + + 数字证书 +数字证书就是互联网通讯中标志通讯各方身份信息的一串数字,提供了一种在Internet上验证通信实体身份的方式,数字证书不是数字身份证,而是身份认证机构盖在数字身份证上的一个章或印(或者说加在数字身份证上的一个签名)。它是由权威机构——CA机构,又称为证书授权(Certificate Authority)中心发行的,人们可以在网上用它来识别对方的身份。 + +伪随机数发生器 +伪随机数发生器用于在系统需要随机数的时候,通过一系列种子值计算出来的伪随机数。因为生成一个真正意义上的“随机数”对于计算机来说是不可能的,伪随机数也只是尽可能地接近其应具有的随机性,但是因为有“种子值”,所以伪随机数在一定程度上是可控可预测的 + diff --git a/Homework/8team/cccccxx/20180125-01.md b/Homework/8team/cccccxx/20180125-01.md new file mode 100644 index 0000000..21f0080 --- /dev/null +++ b/Homework/8team/cccccxx/20180125-01.md @@ -0,0 +1,13 @@ +### 密码学基础(一) +小测验 +1.时钟用的是什么进制? +时钟用的是六十进制,每过六十分钟进一 + +2.将二进制数1111000010.01101分别转换为八进制、十进制和十六进制数 +八进制:1702.32 +十进制:962.40625 +十六进制:3c2.68 + +3.将十进制数137.5分别转换成二进制、八进制。 +二进制:10001001.1 +八进制:211.4 diff --git a/Homework/8team/cccccxx/20180125-02.md b/Homework/8team/cccccxx/20180125-02.md new file mode 100644 index 0000000..326efab --- /dev/null +++ b/Homework/8team/cccccxx/20180125-02.md @@ -0,0 +1,140 @@ +### 密码学基础(二) +凯撒密码的偏移量不一定为3,其偏移量可以为0~25 + +简单替换密码与简单置换密码的区别在于字母本身是否改变:简单替换密码为每个字母都替换成另一个字母,其替换成的字母不一定在明文中;简单置换密码则将明文重新排列 + + +简单替换密码: +![image](./image/1516765704875.png) + +简单置换密码: +置换只不过是一个简单的换位,每个置换都可以用一个置换矩阵Ek来表示。每个置换都有一个与之对应的逆置换Dk。置换密码的特点是仅有一个发送方和接受方知道的加密置换(用于加密)及对应的逆置换(用于解密)。它是对明文L长字母组中的字母位置进行重新排列,而每个字母本身并不改变。 +![image](./image/1516766581651.png) + + + +---------- + + +小测验 + +1.获取下面凯撒密码中的KEY值: +CQN ZDRLT KAXFW OXG SDVYB XENA CQN UJIH MXP XO LJNBJA JWM HXDA DWRZDN BXUDCRXW RB YAVBYOPVAKRA + +答:使用c语言解码 +//#include +//#include +//#include +//加密 +int kaisa_encrypt(const char *str1,char *str2,const int len) +{ + int i; + if(str1 == NULL || str2 == NULL || len <= 0){ + return -1; + } + int m = strlen(str1); + if(m <= 0){ + return -1; + } + for(i=0;i='a'&&str1[i]<='z') + str2[i]='a'+(str1[i]-'a'+len)%26; + else + str2[i]=str1[i]; + } + return 0; +} +//解密 +int kaisa_decrypt(char *str2,char *str3, int len) +{ + int i; + char all_letter[26]="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + if(str3 == NULL || str2 == NULL || len <=0){ + return -1; + } + int m = strlen(str2); + if(m <= 0){ + return -1; + } + for(i=0;i=all_letter[len]&&str2[i]<='Z') + str3[i]=str2[i]-len; + else if(str2[i]>='A'&&str2[i]<=all_letter[len-1]) + str3[i]=str2[i]+(26-len); + else + str3[i]=str2[i]; + } + return 0; +} + +int main() +{ int a; + char str1[20]="binbin"; + char str2_encrypt[200]="CQN ZDRLT KAXFW OXG SDVYB XENA CQN UJIH MXP XO LJNBJA JWM HXDA DWRZDN BXUDCRXW RB YAVBYOPVAKRA"; + char str3_decrypt[200]; + //加密 + kaisa_encrypt(str1,str2_encrypt,3); + printf("原文%s-->密文%s\n",str1,str2_encrypt); + /***解密****/ + for(a=0;a<=25;a++) + {kaisa_decrypt(str2_encrypt,str3_decrypt,a); + printf("偏移值为%d\n",a); + printf("密文%s\n",str2_encrypt); + printf("原文%s\n",str3_decrypt); + printf("-------------------------------------------");} + return 0; +} + + +![image](./image/1.jpg) +解得偏移量为9 + +2.获取下面简单替换码中的KEY值: +DA RZY LVPWMZRA MEX AEG JLT SYLX RZWB PA QSWYTX W LP WPNSYBBYX FYSA KYVV XETY AEGS BEVGRWET UYA WB BZSYZBVPXQZQ RZWB + +答:使用字频分析网站:https://quipqiup.com/ +得KEY值为BY THE ALMIGHTY GOD YOU CAN READ THIS MY FRIEND I AM IMPRESSED VERY WELL DONE YOUR SOLUTION ?EY IS SHREHSLMDFHF THIS LITTLE CHALLENGE WAS NOT TOO HARD WAS IT + +3.获取下面简单置换码中的KEY值 +oWdnreuf.lY uoc nar ae dht eemssga eaw yebttrew eh nht eelttre sra enic roertco drre . Ihtni koy uowlu dilekt oes eoyrup sawsro don:wf nsedergmam.r + +答:观察可看出两个字母间交换了顺序,编写C语言代码实现调整顺序 +//#include +//#include + +int main() { + char a[]="oWdnreuf.lY uoc nar ae dht eemssga eaw yebttrew eh nht eelttre sra enic roertco drre . Ihtni koy uowlu dilekt oes eoyrup sawsro don:wf nsedergmam.r"; + int b=sizeof(a)/sizeof(char); + int c,i,f,g; + f=0,g=0; + c=b/2; + char d[c],e[c]; + for(i=0;i +### 一次性密码本 +一次性密码本是以随机的密钥(key)组成明文,且只使用一次。 +一次性密码本的原理是:将明文和一串随机的比特序列进行XOR运算。
+**举个栗子** +- 将明文midnight的字符通过ASCII进行编码,产生一串比特序列。 +产生明文如下:
+``` +m->01101101 +i->01101001 +d->01100100 +n->01101110 +i->01101001 +g->01100111 +h->01101000 +t->01110100 +``` +- 产生一段与明文长度相同的随机比特序列。可以用投硬币的方式产生。
+01101011 11111010 01001000 11011000 01100101 11010101 10101111 00011100 密钥 +- 将明文与密钥进行XOR运算并得到新的比特序列。
+``` +01101101 01101001 01100100 01101110 01101001 01100111 01101000 01110100 明文 + XOR +01101011 11111010 01001000 11011000 01100101 11010101 10101111 00011100 密钥 +00000110 10010011 00101100 10110110 00001100 10110010 11000111 01101000 密文 +``` + +- 一次性密码本的解密,其实就是加密的反向运算,也就是说,用密文和密钥进行XOR运算,就可以得到明文。各位同学自己尝试一下解密吧!
+>**CTF长征一小步**
+为什么一次性密码本是无法破译的?
+因为其密钥是随机的且该密码只使用一次。
+**CTF长征小半步**
+bit、byte、word的概念和关系。
+ +•bit、byte、word的概念和关系。
+字 word :2个字节组成一个字。
+字节 byte :“字节”是通过网络传输信息(或在硬盘或内存中存储信息)的单位。
+位 bit: “位”或“比特”,是计算机运算的基础;
+字长是指字的长度(字的位数)
+1字=2字节(1 word = 2 byte)
+1字节=8位(1 byte = 8bit)
+Bit 和Byte的区别:
+比如:USB2.0标准接口传输速率480Mbps,就有人误解为480兆/秒,同样网络带宽2MB,就易误解为2兆/秒。实际上,480Mbps应为480兆比特/秒或480兆位/秒,它等于“60兆字节/秒”;同样,2MB,就应该是256兆字节/秒。
+ +### DES +DES是将64比特明文加密成64比特密文的`对称密码算法`,它的`密钥长度`为56比特,在密钥中每隔7比特就会插入一个用于错误检查的比特,所以一共64比特。
+DES是以64比特明文为一个单位来进行加密的,这64比特的一个单位成为一个分组,所以DES也是分组密码的一种。DES每次只能加密64比特的数据,如果加密的明文比较长就需要对DES加密过程进行迭代,迭代的加密方式称为*模式*,详见分组密码。
+ +### DES结构(Feistel网络) +DES结构也叫Feistel网络,在Feistel网络中,加密的各个步骤成为`轮`,整个加密过程,就是若干次轮的循环。下图展示Feistel网络的一轮计算,DES是16轮循环的Feistel网络
+ +![image](./image/1511924443498.png) +
+ 中间的子密钥指本轮加密的密钥,Feistel网络每轮使用不同的子密钥。`轮函数`可以根据“右侧”和子密钥生成对“左侧”进行加密的比特序列。然后,我们用XOR将轮函数的输出与“左侧”进行合并。
+ 每一轮的具体计算过程如下:
+ - 输入数据等分成左右两分。 + - 输入的右侧直接发送到输出的左侧。 + - 输入的右侧发送到轮函数。 + - 轮函数根据右侧数据和子密钥,计算出一串看上去随机的比特序列 + - 上一步的比特序列与左侧数据进行XOR运算,并把结果作为加密的左侧。 + 通过上述过程,可以看到,右侧并没有被加密,所以我们需要用不同的子密钥对一轮的处理多次,并在每两轮处理之间将左右数据对调。就像下面的模型图
+![image](./image/1511924512167.png) +
+ +### DES解密 +DES的解密可以使用和加密完全相同的结构,只需要按照相反的顺序来使用子密钥就可以了。也就是说,用相同的子密钥运行两次Feistel网络,就可以实现“明文->密文->明文”的过程。同理,多轮的Feistel网络,只需要按照n->1的顺序使用子密钥就可以实现解密。
+ +![image](./image/1511924666655.png) + +### 三重DES +三重DES(3DES)就是将DES重复三次得到的一种密码算法。明文经三次DES处理才会变成密文,由于DES的密钥是56比特,所以3DES的密钥长度是168比特。三重DES的加密过程是“加密->**解密**->加密”。
+三重DES的解密过程,刚好和加密过程相反,是执行“解密->加密->解密”的操作。
+关于三重DES加密有四种不同的模式,罗列如下: +1. DES-EEE3模式。使用三个不同密钥(k1,k2,k3),采用三次加密算法。
+2. DES-EDE3模式。使用三个不同密钥(k1,k2,k3),采用加密-解密-加密算法。
+3. DES-EEE2模式。使用两个不同密钥(k1 = k3,k2),采用三次加密算法。
+4. DES-EDE2模式。使用两个不同密钥(k1 = k3,k2),采用加密-解密-加密算法。
+ +两个密钥的三重DES
+由于DES密钥只有56bit,易于遭受穷举时攻击。作为一种替代加密方案,Tuchman提出使用两个密钥的三重DES加密方法,并在1985年成为美国的一个商用加密标准。该方法使用两个密钥(K1=K2),执行三次DES算法,如图2所示。加密的过程是加密-解密-加密,解密的过程是解密-加密-解密。
+### AES +Rijndael分组密码算法于2000年被选为新一代AES。Rijndael分组长度为128比特,密钥长度以32item为单位,在128比特到256比特范围内选择。该算法由多个*轮*组成,使用SPN结构。
+Rijndael输入分组128比特,Rijindael的加密过程分四步:
+- 首先SubBytes处理,逐字节的对16字节的输入进行处理。以每个字节的值为索引,从一张替换表中找到对应得值。也就是将一个字节的值换成另一个字节的值。
+- 其次ShiftRows处理:将上一步输出以字节为单位进行打乱处理。 +- MixColumns处理,对四字节的值进行比特运算,把他变成另一个4字节的值。 +- AddRoundKey处理,将MixColumns的输出与轮密钥进行XOR。
+在Rijndael中,需要进行10~14轮上述运算。每轮计算模型如下图所示
+ +![image](./image/1511924752979.png) +
+Rijindael不能像Feistel一样用同一结构实现加解密,而是通过每一步都进行反向运算来实现解密。
+ +![image](./image/1511924849906.png) +
+ + + +## 分组密码 +`分组密码`是一种对称密钥算法。它将明文分成多个等长的`块`,使用确定的算法和对称密钥对每组分别加密解密。典型的分组大小是64位或128位。 + +![image](./image/1511431425340.png) + + +分组密码算法只能加密固定长度的分组,若要加密超过分组密码长度的明文,就需要对分组密码进行迭代,迭代后的最后一块数据需要使用合适的填充方式将数据扩展到与分组长度相等的长度。这种迭代的方法我们称为分组密码的模式
+分组密码的模式主要有下列5种:
+ECB(Electronic CodeBook mode):电子密码本模式
+CBC(Cipher Block Chaining mode):密码分组链接模式
+CFB(Cipher FeedBack mode):密文反馈模式
+OFB(Output FeedBack mode):输出反馈模式
+CTR(CounTeR mode):计数器模式
+ +### ECB模式 +ECB模式是需要加密的消息按照块密码的块大小被分为数个块,并对每个块进行独立加密。由于在此模式中,明文块与密文块是一一对应的关系,所以如果明文中存在多个相同的明文块,则这些明文块会被加密成相同的密文块,这是ECB模式的缺点。 + +![image](./image/1511835304025.png) + +在破译时,只要观察密文,就能知道明文中存在怎样的重复组合,并以此为线索进行破译。由此可见,ECB模式不能很好的隐藏数据模式,不能提供严格的数据保密性,因此不会在实际中使用。 + +![image](./image/1511854943463.png) + +- ECB攻击实例: +[利用ECB加密缺陷突破cookie加密](http://www.freebuf.com/news/topnews/56506.html) + +### CBC模式 +CBC模式是将前一个密文分组与当前明文分组的内容进行XOR运算,再进行加密。当加密第一个明文分组时,用一个事先准备好的比特序列来代替“前一个密文分组”,这个比特序列称为“初始化向量”。通常,每次加密的初始化向量都是随机的。
+目前,互联网安全的通信协议SSL/TLS就是使用CBC加密模式。
+找一个比特序列充当“初始化向量”,与第一组明文进行XOR,运算,得出第一组密文,接下来将第一组密文与第二组明文进行XOR运算,得第二组密文,并重复。
+![image](./image/1511859648992.png) + +![image](./image/1511861577790.png) + +CBC模式的主要缺点在于加密过程是串行的,无法被并行化,而且消息必须被填充到块大小的整数倍。也因为串行的特点,明文中的微小改变会导致其后的全部密文块发生改变。而在解密时,从两个邻接的密文块中即可得到一个明文块。因此,解密过程可以被并行化,而解密时,密文中一位的改变只会导致其对应的明文块完全改变和下一个明文块中对应位发生改变,不会影响到其它明文的内容。 +- CBC攻击实例: +[CBC字节翻转攻击](http://sec.chinabyte.com/228/13511728.shtml) + +### CFB模式 +在CFB模式中,“前一个密文分组”经过密码算法生成的比特序列称为密钥流。我们注意到,CFB的明文分组和密文分组之间没有通过密码算法进行加密,仅有一个XOR运算,事实上,明文分组与密钥流进行XOR,得到的结果就是随机的密文分组,XOR充当了加密的角色。
+找一个比特序列充当“初始化向量”,与第一组明文进行XOR,运算,得出第一组密文,将第一组密文加密,接下来将加密过后的第一组密文与第二组明文进行XOR运算,得第二组密文,并重复。
+![image](./image/1511862786250.png) + +![image](./image/1511862858104.png) +![image](./image/1516872789988.png) +![image](./image/1516872805709.png) + +### OFB模式 +OFB模式可以将密码分组变成同步的密钥流,然后将其与明文分组进行XOR,得到密文。这一点OFB与CFB非常相似。
+OFB与CFB不同的地方:OFB为对前一次初始化向量加密,而CFB对前一组密文加密。
+![image](./image/1511865893404.png) + +![image](./image/1511866093369.png) +![image](./image/1516872997883.png) +![image](./image/1516873008914.png) + +### CTR模式 +CTR模式是一种通过将逐次累加的计数器进行加密来生成密钥流的流密码。它可以以任意顺序对分组进行加密和解密,这意味着能够实现并行计算。 + +![image](./image/1511866747703.png) +![image](./image/1516873255167.png) +![image](./image/1516873267528.png) + +### 分组密码模式比较 +![image](./image/1511867144781.png) + +## 公钥密码 +公钥密码中,密钥分为*加密密钥*和*解密秘钥*两种。加密密钥一般是公开的,称为公钥。解密秘钥由自己保存绝不公开,称为私钥。公钥和私钥统称为密钥对
+公钥密码又称为非对称密码,拥有公钥密码的用户分别拥有加密密钥和解密密钥。通过加密密钥不能得到解密密钥。并且加密密钥是公开的。
+### RSA +RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
+- 加密:密文=明文^E mod N +- 解密:明文=密文^D mod N +(a^c表示a的c次方)。
+公钥:(E,N); 私钥:(D,N)
+**如何生成密钥对呢???**
+``` +1. 生成N + N=p* q(p,q是两个非常大的质数) +2. 生成L(L是生成秘钥对过程中使用的数) + L=lcm(p-1,q-1) (L是p-1和q-1的最小公倍数) +3. 生成E + 1 +4. 生成D + 1 + +## 单向散列函数 +`单向散列函数`也叫`哈希函数`,它有一个输入和一个输出,输入称为消息,输出称为散列值,也叫信息摘要或者指纹
+单向散列函数是一种采集文件指纹的技术,单向散列函数产生的散列值,相当于消息的指纹。可以用来检测软件是否被篡改。
+单向散列函数可以根据任意长度的消息计算出固定长度的散列值,能够跨苏计算出散列值,消息不统计算出来的散列值也不一样,并且具备单向性。
+- 应用
+1. 根据单向散列函数计算出的散列值(哈希值)可以检测软件是否被篡改。
+2. 单向散列函数可用于基于口令的加密。 +3. 单向散列函数可以构造消息认证码。 +4. 数字签名也会用到单向散列函数。 +5. 使用单向散列函数可以构造伪随机数生成器。 +6. 利用单相思浓烈函数可以构造一次性口令。 + +### SHA-1 +`SHA-1`是哈希函数的一种。它能够从最大2^64比特的消息中计算出160比特的散列值。
+ +![image](./image/1511925105996.png) +
+*SHA-1函数的运行总共有四个步骤* + +##### 1.填充 +sha-1函数的消息长度在0~ 2^64比特之间。每512比特为一个输入分组,若长度不是512比特的整数倍就需要对sha-1信息进行填充。
+填充方法是:在消息末尾添加1比特的“1”,在“1”后面联系添加“0”,直到消息长度为512比特的整数倍。但是最后一个分组的最后64比特空出来保存原始信息长度。
+ +##### 2.计算W0~ W79 +SHA-1的计算是以输入分组为单位计算的。每个输入分组计算出80个32比特。这些值用到第四步的计算中。首先,一个输入分组分成16组32比特信息,命名为`W0~W15`。
+剩余的`W16~W79`的计算方法:Wt=Wt-16 XOR Wt-14 XOR Wt-8 XOR Wt-3循环左移1比特。
+ +##### 3.分组处理 +分组处理是为了将输入分组的512比特数据和SHA-1保持的160比特的内部状态(五个缓冲区)进行混合,SHA-1最终输出的160比特散列值,就是处理结束后的内部状态。下图展示的就是输入分组与五个缓冲区是怎么混合的! + +![image](./image/1511925192533.png) + + +##### 4.单步处理 +分组处理的80个步骤中的每一步的详细过程都是如下图所示。主要是为了使内部状态(缓冲区A,B,C,D,E)产生变化。 + +![image](./image/1511925231246.png) + +## [MD5](http://blog.csdn.net/xiaofengcanyuexj/article/details/37698801) +MD5即信息摘要算法第五版。是一种有广泛应用的哈希函数。用来提供消息的完整性保护。他能够对消息产生128比特的散列值。
+MD5是一种不可逆的算法,通过信息摘要算法得到的信息是不完整的,所以也不能得到原始数据。
+MD5以512比特信息分组来处理输入的信息,每一个分组又被划分成16组32比特分组。经一系列的算法变化得到4个32比特分组,这个四个32比特分组生成128比特的散列值。
+在网上经常会看到32位和16位的MD5值,两者是有部分相同的,32位的MD5值去掉前八位和后八位就是16位了。
+**MD5算法流程** +1. 填充 +- 参考SHA-1。 +2. 设置4个初始参数
+- 第一组输入分组需要设置4个32位的链接变量:A=0x01234567;B=0x89abcdef;C=0xfedcba98;D=0x76543210;用来计算信息摘要。 +- 四个链接变量复制到a,b,c,d。 +- 第二组及后面的输入分组的初始变量是上一组的运算结果。 +3. 对输入数据做变换
+主循环是4轮操作,每轮操作有16次操作,每次操作是对A,B,C,D中的3个做非线性操作,所得结果加上第4个变量。 +- F(X,Y,Z)=(X&Y)|((~X)&Z) +- G(X,Y,Z)=(X&Z)|(Y&(~Z)) +- H(X,Y,Z)=X^Y^Z +- I(X,Y,Z)=Y^(X|(~Z)) +(&代表与,~代表反,^代表异或,|代表或)
+ +### 应用 ### +1. 防止被篡改 +2. 防治直接看到明文 +3. 防止抵赖 + +### 最后一段话!! +CTF密码学部分通常会涉及到逆向,web,代码的知识,各位同学要拓展自己的知识面,以便可以在看到题目的时候想到相应的密码模型。
+这里有CTF可能用到的密码的形试和工具,大家自行体验一把。
+- [CTF中那些脑洞大开的编码和加密](http://www.360doc.com/content/16/0906/21/27425026_588911412.shtml) +- [CTFtools](https://www.ctftools.com/) + + diff --git a/Homework/8team/cccccxx/20180125-04.md b/Homework/8team/cccccxx/20180125-04.md new file mode 100644 index 0000000..1ca2aed --- /dev/null +++ b/Homework/8team/cccccxx/20180125-04.md @@ -0,0 +1,101 @@ +### 密码学基础(四) +### 消息认证码 +消息的认证指的是“消息来自正确的发送者”这一属性。也就是确认消息不是由其他人伪装成发送者发出的
+ +它可以接受任意长度的消息和一个发送者与接受者之间的共享秘钥,并输出固定长度的数据,这个数据称为MAC值。也称为:带密钥的Hash函数。
+ +### HMAC + +1.填充密钥
+如果密钥比单向散列函数单的分组长度短,就需要在末尾填充0,直到密钥长度和单向散列函数分组长度一致;
+2.密钥与ipad进行XOR
+ipad是将00110110这一序列不断循环知道达到分组长度形成的比特序列。用填充后的密钥跟ipad进行XOR运算。XOR得到的值称为ipadkey。
+3.与消息结合
+把ipadkey的比特序列附加在消息开头。
+4.计算散列值
+将ipadkey与消息组合后得到的比特序列输入单向散列函数,并计算散列值。
+5.填充后的秘钥与opad进行XOR计算。
+opad是将01011100这一比特序列不断循环直到长度达到分组长度所形成的比特序列。用填充后的密钥和opad进行XOR运算,得到的结果称为opadkey。
+6.组合
+把上述4得到的散列值拼在opadkey后面。
+7.计算散列值
+把上述6得到的序列输入单向散列函数,并计算散列值,这个散列值就是最终的消息认证码(MAC)。
+ +### 重放攻击 +重放攻击是指攻击者发送一个目的主机已接收过的包,特别是在认证的过程中,用于认证用户身份所接收的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的安全性 +例子:小王向某个不能有效识别付款(这里指不能判断是哪一笔付款)的包子铺买包子,当他把用支付宝成功付款的付款信息出示给服务员后, 服务员把包子给他。 然后小王又再把上次的付款信息出示给另一个服务员, 服务员又给他一份包子。 只要小王不断重复出示他的付款信息,就可以源源不断骗得包子, 这对于包子铺来说就是被重放攻击了, 损失了无数包子。
+用Burp Suite实现重放攻击:https://www.cnblogs.com/jmjm/p/7875607.html
+ +### 预防重放攻击 +1、序号 约定每一次都发送的消息赋予一个递增的编号(序号)。
+2、时间戳 约定在发送时包含当前的时间,如果收到以前的信息,即使MAC值正确也当做错误信息处理。
+3、nonce 在通信之前,接受者先向发送者发送一个一次性的随机数,这个随机数称为nonce,发送者在消息中包含这个nonce并计算MAC值,有一每次发送的nonce不同,所以也就不能进行重放攻击
+ +### HMAC的缺陷 +1、接受者B接收到来自发送者A的消息之后,不能向第三方证明消息来自发送者A。 +2、接受者B收到包含MAC的消息,可以利用发送者A和接受者B的密钥计算出来,从而接受者B能够确定消息来自发送者A,但是发送者A可以否认消息来自它。因为没有人可以证实消息确实来自发送者A。也就是消息认证码无法防止否认 + +### 数字签名 +数字签名的作用就是防止抵赖。数字签名不具有机密性,它生成的密文仅用于代表只有持有该密钥的人才能够生产的信息,所以数字签名可以直接发送消息明文,用于对比。
+ +### 数字签名的生成和验证 +数签名对签名密钥和验证密钥进行了区分,签名密钥只有签名的人才持有,验证密钥任何人都可以拥有。 数字签名对签名密钥和验证密钥进行区分,使用验证密钥无法生成密钥。 可以直接对消息签名,也可以对消息的散列值签名。
+ +### 数字签名的方法 +直接对消息进行签名 +1、发送者A用自己的私钥对消息进行加密,加密的结果就是生成的数字签名
+2、发送者A将消息和生成的数字签名发送出去
+3、接受者B用发送者A的公钥对数字签名进行解密 +4、接受者B将签名解密后的消息和发送者A发送的消息进行对比
+ +对消息的散列值签名
+1.发送者A用单项散列函数计算消息的散列值
+2.发送者A用自己的私钥对消息进行加密,加密的结果就是生成的数字签名
+3.发送者A将消息和生成的数字签名发送出去
+4.接受者B用发送者A的公钥对数字签名进行解密
+5.接受者B将签名解密后的消息和发送者A发送的消息进行对比
+ +### 证书 +公钥证书简称证书,是记载了个人信息和属于个人的公钥。并由认证机构施加数字签名。证书的作用是对公钥的合法性提供证明。只要有证书,我们就知道有认证机构确认该公钥的确属于此人。认证机构就是明确公钥属于此人并生成数字签名的个人或组织
+ +![image](./image/1517457498608.png) + +### 公钥基础设施 +公钥基础设施(PKI)是为了能够更有效地运用公钥制定的一些列规范和规格的总称。并非指某一种规范或规格。公钥基础设施(PKI)是为了能够更有效地运用公钥制定的一些列规范和规格的总称。并非指某一种规范或规格。
+PKI组成要素: +用户:使用PKI的人;
+认证机构:颁发证书的人;
+仓库:保存证书的数据库。 认证机构的工作:
+ +生成密钥对:生成密钥对有两种方法:一种是PKI自己生成;另一种是认证机构生成。
+注册证书。 当用户自行生成密钥对时,用户会请求认证机构来生成证书。生成那个证书时,会使用认证机构的私钥来进行数字签名。
+作废证书和CRL 当用户的私钥丢失,被盗时,认证机构需要对证书进行作废。要作废证书,认证机构先要制作一份作废证书清单(CRL)。总的来说,当我们手上有一份证书时,仅凭证书上的认证机构签名和有效期,并不能确定证书是否有效,还需要查询认证机构最新的CRL,看证书是否有效。
+ + +### 对证书的攻击 +在公钥注册之前进行攻击
+在施加数字签名前对公钥进行攻击,比如把用来数字签名的公钥替换成主动攻击者的公钥
+注册相似人名进行攻击、窃取认证机构的私钥进行攻击。
+攻击者伪装成认证机构进行攻击
+钻CRL空子进行攻击,从公钥失效到收到CRL需要经过一段时间,可以利用这个时间差发动攻击。
+ +### Diffie-Hellman密钥交换 +Diffie-Hellman密钥交换可以使通信双方仅通过交换一些可以公开的信息就能够生成共享的秘密数字。这种方法虽然叫密钥交换,但实际上方并没有真的交换密钥,而是通过计算生成一个相同的共享密钥。
+Diffie-Hellman密钥交换的步骤
+发送者向接受者发送两个质数P和G,P是一个非常大的质数,G是一个与P相关的数。
+发送者生成一个随机数A,A是1到P-2之间的一个整数。这个数只有发送者知道。
+接受者生成一个随机数B,B也是1到P-2之间的整数。这个数只有接受者知道。
+发送者将G^A mod P这个数发送给接受者。
+接受者将G^B mod P这个数发送给发送者。
+发送者将接受者发来的数计算A次方并求mod P.
+接受者用发送者发过来的数计算B次方并求mod P
+ +# 基于口令的密码(PBE) + +基于口令的密码是一种根据口令生成密钥并用该密钥进行加密的方法。加密解密使用同一个密钥。 PBE加密包含三个步骤:
+1.生成KEK。使用伪随机数生成器生成一个成为盐的随机数,把盐和发送者输入的口令一起输入单向散列函数,得到的散列值就是用来加密密钥的密钥(KEK)。
+2.生成会话密钥并加密。使用伪随机数生成器生成会话秘钥,会话秘钥用来解密消息。会话秘钥使用KEK加密,并和盐一起保存在安全的地方。会话秘钥加密后KEK会被丢弃。
+3.加密消息。用会话密钥对消息进行加密。 +4.重建KEK。用之前保存的盐和发送者输入的口令一起输入单向散列函数,生成KEK。
+5.解密会话密钥。获取之前保存的“用KEK加密的会话秘钥”,用重建的KEK解密,获取会话密钥
+6.解密消息。用重建的会话秘钥对加密信息进行解密。
diff --git a/Homework/8team/cccccxx/cccccxx b/Homework/8team/cccccxx/cccccxx new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/Homework/8team/cccccxx/cccccxx @@ -0,0 +1 @@ + diff --git a/Homework/8team/cccccxx/image/1.jpg b/Homework/8team/cccccxx/image/1.jpg new file mode 100644 index 0000000..1fa05bc Binary files /dev/null and b/Homework/8team/cccccxx/image/1.jpg differ diff --git a/Homework/8team/cccccxx/image/1511431425340.png b/Homework/8team/cccccxx/image/1511431425340.png new file mode 100644 index 0000000..e1e6092 Binary files /dev/null and b/Homework/8team/cccccxx/image/1511431425340.png differ diff --git a/Homework/8team/cccccxx/image/1511835304025.png b/Homework/8team/cccccxx/image/1511835304025.png new file mode 100644 index 0000000..8b8b496 Binary files /dev/null and b/Homework/8team/cccccxx/image/1511835304025.png differ diff --git a/Homework/8team/cccccxx/image/1511854943463.png b/Homework/8team/cccccxx/image/1511854943463.png new file mode 100644 index 0000000..d713bc1 Binary files /dev/null and b/Homework/8team/cccccxx/image/1511854943463.png differ diff --git a/Homework/8team/cccccxx/image/1511859648992.png b/Homework/8team/cccccxx/image/1511859648992.png new file mode 100644 index 0000000..b936439 Binary files /dev/null and b/Homework/8team/cccccxx/image/1511859648992.png differ diff --git a/Homework/8team/cccccxx/image/1511861577790.png b/Homework/8team/cccccxx/image/1511861577790.png new file mode 100644 index 0000000..acaf79e Binary files /dev/null and b/Homework/8team/cccccxx/image/1511861577790.png differ diff --git a/Homework/8team/cccccxx/image/1511862786250.png b/Homework/8team/cccccxx/image/1511862786250.png new file mode 100644 index 0000000..cbd513b Binary files /dev/null and b/Homework/8team/cccccxx/image/1511862786250.png differ diff --git a/Homework/8team/cccccxx/image/1511862858104.png b/Homework/8team/cccccxx/image/1511862858104.png new file mode 100644 index 0000000..65e4121 Binary files /dev/null and b/Homework/8team/cccccxx/image/1511862858104.png differ diff --git a/Homework/8team/cccccxx/image/1511865893404.png b/Homework/8team/cccccxx/image/1511865893404.png new file mode 100644 index 0000000..8750b2c Binary files /dev/null and b/Homework/8team/cccccxx/image/1511865893404.png differ diff --git a/Homework/8team/cccccxx/image/1511866093369.png b/Homework/8team/cccccxx/image/1511866093369.png new file mode 100644 index 0000000..454d463 Binary files /dev/null and b/Homework/8team/cccccxx/image/1511866093369.png differ diff --git a/Homework/8team/cccccxx/image/1511866747703.png b/Homework/8team/cccccxx/image/1511866747703.png new file mode 100644 index 0000000..5e6a5a4 Binary files /dev/null and b/Homework/8team/cccccxx/image/1511866747703.png differ diff --git a/Homework/8team/cccccxx/image/1511867144781.png b/Homework/8team/cccccxx/image/1511867144781.png new file mode 100644 index 0000000..ad1211f Binary files /dev/null and b/Homework/8team/cccccxx/image/1511867144781.png differ diff --git a/Homework/8team/cccccxx/image/1511924443498.png b/Homework/8team/cccccxx/image/1511924443498.png new file mode 100644 index 0000000..cf7a8e2 Binary files /dev/null and b/Homework/8team/cccccxx/image/1511924443498.png differ diff --git a/Homework/8team/cccccxx/image/1511924512167.png b/Homework/8team/cccccxx/image/1511924512167.png new file mode 100644 index 0000000..117b71a Binary files /dev/null and b/Homework/8team/cccccxx/image/1511924512167.png differ diff --git a/Homework/8team/cccccxx/image/1511924666655.png b/Homework/8team/cccccxx/image/1511924666655.png new file mode 100644 index 0000000..9c0ff2b Binary files /dev/null and b/Homework/8team/cccccxx/image/1511924666655.png differ diff --git a/Homework/8team/cccccxx/image/1511924752979.png b/Homework/8team/cccccxx/image/1511924752979.png new file mode 100644 index 0000000..b49a8c5 Binary files /dev/null and b/Homework/8team/cccccxx/image/1511924752979.png differ diff --git a/Homework/8team/cccccxx/image/1511924849906.png b/Homework/8team/cccccxx/image/1511924849906.png new file mode 100644 index 0000000..04bc716 Binary files /dev/null and b/Homework/8team/cccccxx/image/1511924849906.png differ diff --git a/Homework/8team/cccccxx/image/1511925105996.png b/Homework/8team/cccccxx/image/1511925105996.png new file mode 100644 index 0000000..a696f5e Binary files /dev/null and b/Homework/8team/cccccxx/image/1511925105996.png differ diff --git a/Homework/8team/cccccxx/image/1511925192533.png b/Homework/8team/cccccxx/image/1511925192533.png new file mode 100644 index 0000000..8ad294d Binary files /dev/null and b/Homework/8team/cccccxx/image/1511925192533.png differ diff --git a/Homework/8team/cccccxx/image/1511925231246.png b/Homework/8team/cccccxx/image/1511925231246.png new file mode 100644 index 0000000..e149d52 Binary files /dev/null and b/Homework/8team/cccccxx/image/1511925231246.png differ diff --git a/Homework/8team/cccccxx/image/1516692243853.png b/Homework/8team/cccccxx/image/1516692243853.png new file mode 100644 index 0000000..6d8c73d Binary files /dev/null and b/Homework/8team/cccccxx/image/1516692243853.png differ diff --git a/Homework/8team/cccccxx/image/1516692260216.png b/Homework/8team/cccccxx/image/1516692260216.png new file mode 100644 index 0000000..29057d6 Binary files /dev/null and b/Homework/8team/cccccxx/image/1516692260216.png differ diff --git a/Homework/8team/cccccxx/image/1516765704875.png b/Homework/8team/cccccxx/image/1516765704875.png new file mode 100644 index 0000000..7408ed3 Binary files /dev/null and b/Homework/8team/cccccxx/image/1516765704875.png differ diff --git a/Homework/8team/cccccxx/image/1516766581651.png b/Homework/8team/cccccxx/image/1516766581651.png new file mode 100644 index 0000000..b87c5fe Binary files /dev/null and b/Homework/8team/cccccxx/image/1516766581651.png differ diff --git a/Homework/8team/cccccxx/image/1516872789988.png b/Homework/8team/cccccxx/image/1516872789988.png new file mode 100644 index 0000000..c871c80 Binary files /dev/null and b/Homework/8team/cccccxx/image/1516872789988.png differ diff --git a/Homework/8team/cccccxx/image/1516872805709.png b/Homework/8team/cccccxx/image/1516872805709.png new file mode 100644 index 0000000..c871c80 Binary files /dev/null and b/Homework/8team/cccccxx/image/1516872805709.png differ diff --git a/Homework/8team/cccccxx/image/1516872997883.png b/Homework/8team/cccccxx/image/1516872997883.png new file mode 100644 index 0000000..fd971f6 Binary files /dev/null and b/Homework/8team/cccccxx/image/1516872997883.png differ diff --git a/Homework/8team/cccccxx/image/1516873008914.png b/Homework/8team/cccccxx/image/1516873008914.png new file mode 100644 index 0000000..fd971f6 Binary files /dev/null and b/Homework/8team/cccccxx/image/1516873008914.png differ diff --git a/Homework/8team/cccccxx/image/1516873255167.png b/Homework/8team/cccccxx/image/1516873255167.png new file mode 100644 index 0000000..a7f269a Binary files /dev/null and b/Homework/8team/cccccxx/image/1516873255167.png differ diff --git a/Homework/8team/cccccxx/image/1516873267528.png b/Homework/8team/cccccxx/image/1516873267528.png new file mode 100644 index 0000000..96854e6 Binary files /dev/null and b/Homework/8team/cccccxx/image/1516873267528.png differ diff --git a/Homework/8team/cccccxx/image/1517457498608.png b/Homework/8team/cccccxx/image/1517457498608.png new file mode 100644 index 0000000..bc0362e Binary files /dev/null and b/Homework/8team/cccccxx/image/1517457498608.png differ diff --git a/Homework/8team/cccccxx/image/2.jpg b/Homework/8team/cccccxx/image/2.jpg new file mode 100644 index 0000000..86feb71 Binary files /dev/null and b/Homework/8team/cccccxx/image/2.jpg differ