打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
《灰灰的密码学笔记》给新手的福利


花了一个星期的时间把最近学到密码学知识整理成比较条理的笔记,现在拿出来与大家共享,愿能给密码的初学者带来方便,也欢迎高手来补充和指正。 

P,s:从这里开始看,一直到MD5之前,差不多就能初步了解古典加密的相关概念还有加解密方式,再通过实践掌握,很快就能进阶了,当初我也是从什么都不懂开始,慢慢看懂得,这好比一门语言,乍一看没什么头绪,很枯燥的样子,其实懂一点之后就会发现其实密码的语言也是很和谐,很有规律的。祝大家能早早进阶~------某站长

【密码常识】 

字母表顺序-数字 
  加密的时候,经常要把A~Z这26个字母转换成数字,最常见的一种方法就是取字母表中的数字序号。A代表1,B代表2,C代表3... 

  字母 A B C D E F G H I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y  Z 
  数字 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 

进制转换密码 
  例如二进制:1110 10101 1101 10 101 10010 1111 1110 101 
  转为十进制:14 21 13 2 5 18 15 14 5 
  对应字母表:number 

Mod算法 
  我们可以对字母序号进行数学运算,然后把所得的结果作为密文。当运算结果大于26或小于1的时候,我们希望把这个数值转为1~26的范围,那么取这个数除以26的余数即可。 

  Mod就是求余数的运算符,有时也用“%”表示。例如 29 Mod 26 = 3,或写成 29 % 26 = 3,意思是29除以26的余数是3。 

倒序 
  加密时为经常要对字符进行倒序处理。如果让你按abcdef...的顺序背出字母表的每个字母会很容易,但是如果是zyxwvu...的顺序那就很难背出来了。一个很熟悉的单词,如果按相反的顺序拼写,可能就会感到很陌生。 

  例如“love”字母倒过来拼就是“evol”。 

  具体加密时倒序有很多种方案,需要灵活运用。例如: 

  每个单词的倒序:siht si a tset - this is a test 
  整句的倒序:tset a si siht - this is a test 
  数字的倒序:02 50 91 02 - 20 05 19 20(test) 

间隔 
  单词之间的间隔一般使用空格。在加密时常常要去掉空格,但有时某些字母或数字来替代空格也不失为一种好的加密方案。错误空格位置也会起到很强的误导作用。 

  例如:t hi sis at est - this is a test 

字母频率 
  频率分析法可以有效的破解单字母替换密码。 

  关于词频问题的密码,我在这里提供英文字母的出现频率给大家,其中数字全部是出现的百分比: 
  a  8.2    b  1.5    c  2.8    d  4.3 
  e 12.7    f  2.2    g  2.0    h  6.1 
  i  7.0    j  0.2    k  0.8    l  4.0 
  m  2.4    n  6.7    o  7.5    p  1.9 
  q  0.1    r  6.0    s  6.3    t  9.1 
  u  2.8    v  1.0    w  2.4    x  0.2 
  y  2.0    z  0.1 

  词频法其实就是计算各个字母在文章中的出现频率,然后大概猜测出明码表,最后验证自己的推算是否正确。这种方法由于要统计字母出现频率,需要花费时间较长。参考《跳舞的小人》和《金甲虫》。

【凯撒密码(Caesar Shifts, Simple Shift)】 

  也称凯撒移位,是最简单的加密方法之一,相传是古罗马恺撒大帝用来保护重要军情的加密系统,它是一种替代密码。 

  加密公式:密文 = (明文 + 位移数) Mod 26 
  解密公式:明文 = (密文 - 位移数) Mod 26 

  以《数字城堡》中的一组密码为例: 

  HL FKZC VD LDS 

  只需把每个字母都按字母表中的顺序依次后移一个字母即可——A变成B,B就成了C,依此类推。因此明文为: 

  IM GLAD WE MET 

  英文字母的移位以移25位为一个循环,移26位等于没有移位。所以可以用穷举法列出所有可能的组合。 

  例如:phhw ph diwhu wkh wrjd sduwb 

  利用电脑可以方便地列出所有组合,然后从中选出有意义的话: 

  qiix qi ejxiv xli xske tevxc 
  rjjy rj fkyjw ymj ytlf ufwyd 
  skkz sk glzkx znk zumg vgxze 
  tlla tl hmaly aol avnh whyaf 
  ummb um inbmz bpm bwoi xizbg 
  vnnc vn jocna cqn cxpj yjach 
  wood wo kpdob dro dyqk zkbdi 
  xppe xp lqepc esp ezrl alcej 
  yqqf yq mrfqd ftq fasm bmdfk 
  zrrg zr nsgre gur gbtn cnegl 
  assh as othsf hvs hcuo dofhm 
  btti bt puitg iwt idvp epgin 
  cuuj cu qvjuh jxu jewq fqhjo 
  dvvk dv rwkvi kyv kfxr grikp 
  ewwl ew sxlwj lzw lgys hsjlq 
  fxxm fx tymxk max mhzt itkmr 
  gyyn gy uznyl nby niau julns 
  hzzo hz vaozm ocz ojbv kvmot 
  iaap ia wbpan pda pkcw lwnpu 
  jbbq jb xcqbo qeb qldx mxoqv 
  kccr kc ydrcp rfc rmey nyprw 
  ldds ld zesdq sgd snfz ozqsx 
  meet me after the toga party <- 
  nffu nf bgufs uif uphb qbsuz 
  oggv og chvgt vjg vqic rctva 

  可知明文为:meet me after the toga party 

------------------------------------------------------------------------- 
【凯撒移位(中文版)】 

  就是按照中文字在Unicode编码表中的顺序进行移位,可以用来加密中文的信息。 

  例:[中文凯撒移位] 
  转换成Unicode编码:中文凯撒移位 
  移1位后成为:      丮斈凰撓秼低 
  转换成中文:[丮斈凰挠秼低]

【栅栏密码(The Rail-Fence Cipher)】 

  也称栅栏易位(Columnar Transposition),即把将要传递的信息中的字母交替排成上下两行,再将下面一行字母排在上面一行的后边,从而形成一段密码。栅栏密码是一种置换密码。 

  例如密文:TEOGSDYUTAENNHLNETAMSHVAED 

  解密过程:先将密文分为两行 

  T E O G S D Y U T A E N N 
  H L N E T A M S H V A E D 

  再按上下上下的顺序组合成一句话 

  THE LONGEST DAY MUST HAVE AN END. 

  ............................................................. 
  加密时不一定非用两栏,还是举《数字城堡》中的一个例子,密文为: 

  PFEE SESN RETM MFHA IRWE OOIG MEEN NRMA ENET SHAS DCNS IIAA IEER BRNK FBLE LODI 

  去掉空格:PFEESESNRETMMFHAIRWEOOIGMEENNRMAENETSHASDCNSIIAAIEERBRNKFBLELODI 

  共64个字符,以8个字符为一栏,排列成8*8的方阵(凯撒方阵): 

  P F E E S E S N 
  R E T M M F H A 
  I R W E O O I G 
  M E E N N R M A 
  E N E T S H A S 
  D C N S I I A A 
  I E E R B R N K 
  F B L E L O D I 

  从上向下竖着读:PRIMEDIFFERENCEBETWEENELEMENTSRESMONSIBLEFORHIROSHIMAANDNAGASAKI 

  插入空格:PRIME DIFFERENCE BETWEEN ELEMENTS RESMONSIBLE FOR HIROSHIMA AND NAGASAKI (广岛和长崎的原子弹轰炸的最主要区别) 

  ............................................................. 
  栅栏密码也可以用于中文,不过比较容易破解。 

  明文:         这是中文的栅栏密码 
  密文(3*3方阵):这文栏是的密中栅码 

  由于中文用规则的栅栏比较容易破解,所以产生了一些变体,例如道家心法密籍《天仙金丹心法》中的一段加密方法。密文如下: 

  ○ 茫 天 : 摹 然 月 终 为 鼎 半 是 真 灭 器 轮 假 不 但 伸 净 著 定 分 泥 万 ○ 无 ○ 光 人 经 法 一 从 尘 色 返 我 权 自 法 中 妙 大 空 照 生 屈 来 好 路 形 神 海 ○ 便 还 未 归 

  ○ 茫 
  天 : 摹 
  然 月 终 为 
  鼎 半 是 真 灭 
  器 轮 假 不 但 伸 
  净 著 定 分 泥 万 ○ 
  无 ○ 光 人 经 法 一 从 
  尘 色 返 我 权 自 法 中 妙 
  大 空 照 生 屈 来 好 路 形 神 
  海 ○ 便 还 未 归 

  明文(从上向下竖着读):天然鼎器净无尘,大海茫茫月半轮。著色空摹终是假,定光返照便为真。不分人我生还灭,但泥经权屈未伸。万法自来归一法,好从中路妙形神。 

  ............................................................. 
  利用电脑进行加密或解密,建议使用“列举加密”或“列举解密”,电脑会自动尝试一些正好匹配的栏位进行列举。 

  lyiroonevuclesey 

  4栏: 
  loveyousincerely 

  8栏: 
  lionvceeyroeulsy

【维吉尼亚密码(Vigenère Cipher)】 

  由于频率分析法可以有效的破解单表替换密码,法国密码学家维吉尼亚于1586年提出一种多表替换密码,即维吉尼亚密码,也称维热纳尔密码。维吉尼亚密码引入了“密钥”的概念,即根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计。 

  加密算法:例如密钥的字母为[d],明文对应的字母[b]。根据字母表的顺序[d]=4,[b]=2,那么密文就是[d]+[b]-1=4+2-1=5=[e],因此加密的结果为[e]。解密即做此逆运算。 

  加密公式:密文 = (明文 + 密钥) Mod 26 - 1 
  解密公式:明文 = [26 + (密文 - 密钥)] Mod 26 + 1 

  也可以用查表法来进行加密:例如密钥的字母为[d],明文对应的字母[b],在下图的表格第一行找到字母"d"(深蓝色),再在左边第一列找到字母"b"(绿色),两个字母的交叉点(b行d列)就是字母"E",所以对应的密文字母为[e]。 

  [-----------------图-----------------] 

    a b c d e f g h i j k l m n o p q r s t u v w x y z 
  a A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
  b B C D E F G H I J K L M N O P Q R S T U V W X Y Z A 
  c C D E F G H I J K L M N O P Q R S T U V W X Y Z A B 
  d D E F G H I J K L M N O P Q R S T U V W X Y Z A B C 
  e E F G H I J K L M N O P Q R S T U V W X Y Z A B C D 
  f F G H I J K L M N O P Q R S T U V W X Y Z A B C D E 
  g G H I J K L M N O P Q R S T U V W X Y Z A B C D E F 
  h H I J K L M N O P Q R S T U V W X Y Z A B C D E F G 
  i I J K L M N O P Q R S T U V W X Y Z A B C D E F G H 
  j J K L M N O P Q R S T U V W X Y Z A B C D E F G H I 
  k K L M N O P Q R S T U V W X Y Z A B C D E F G H I J 
  l L M N O P Q R S T U V W X Y Z A B C D E F G H I J K 
  m M N O P Q R S T U V W X Y Z A B C D E F G H I J K L 
  n N O P Q R S T U V W X Y Z A B C D E F G H I J K L M 
  o O P Q R S T U V W X Y Z A B C D E F G H I J K L M N 
  p P Q R S T U V W X Y Z A B C D E F G H I J K L M N O 
  q Q R S T U V W X Y Z A B C D E F G H I J K L M N O P 
  r R S T U V W X Y Z A B C D E F G H I J K L M N O P Q 
  s S T U V W X Y Z A B C D E F G H I J K L M N O P Q R 
  t T U V W X Y Z A B C D E F G H I J K L M N O P Q R S 
  u U V W X Y Z A B C D E F G H I J K L M N O P Q R S T 
  v V W X Y Z A B C D E F G H I J K L M N O P Q R S T U 
  w W X Y Z A B C D E F G H I J K L M N O P Q R S T U V 
  x X Y Z A B C D E F G H I J K L M N O P Q R S T U V W 
  y Y Z A B C D E F G H I J K L M N O P Q R S T U V W X 
  z Z A B C D E F G H I J K L M N O P Q R S T U V W X Y 

  假如对如下明文加密: 

  to be or not to be that is the question 

  当选定“have”作为密钥时,加密过程是:密钥第一个字母为[h],明文第一个为[t],因此可以找到在h行t列中的字母[a],依此类推,得出对应关系如下: 

  密钥:ha ve ha veh av eh aveh av eha vehaveha 
  明文:to be or not to be that is the question 
  密文:ao wi vr isa tj fl tcea in xoe lylsomvn

【Polybius密码(Polybius Cipher)】 

  也称棋盘密码,是利用波利比奥斯方阵(Polybius Square)进行加密的密码方式,产生于公元前两世纪的希腊,相传是世界上最早的一种密码。 

  假设我们需要发送明文讯息 “Attack at once”, 用一套秘密混杂的字母表填满波利比奥斯方阵,像是这样: 

    A D F G X 
  A b t a l p 
  D d h o z k 
  F q f v s n 
  G g j c u x 
  X m r e w y 

  i和j视为同一个字,使字母数量符合 5 × 5 格。之所以选择这五个字母,是因为它们译成摩斯密码时不容易混淆,可以降低传输错误的机率。使用这个方格,找出明文字母在这个方格的位置,再以那个字母所在的栏名称和列名称代替这个字母。可将该讯息转换成处理过的分解形式。 

  明文:A T T A C K A T O N C E 
  密文:AF AD AD AF GF DX AF AD DF FX GF XF 

  A,D,F,G,X也可以用数字1,2,3,4,5来代替,这样密文就成了: 

  13 12 12 13 43 25 13 12 23 35 43 53 

------------------------------------------------------------------------- 
【ADFGX/ADFGVX密码(ADFGX/ADFGVX Cipher)】 

ADFGX 
  1918年,第一次世界大战将要结束时,法军截获了一份德军电报,电文中的所有单词都由A、D、F、G、X五个字母拼成,因此被称为ADFGX密码。ADFGX密码是1918年3月由德军上校Fritz Nebel发明的,是结合了Polybius密码和置换密码的双重加密方案。A、D、F、G、X即Polybius方阵中的前5个字母。 

  明文:A T T A C K A T O N C E 
  经过Polybius变换:AF AD AD AF GF DX AF AD DF FX GF XF 

  下一步,利用一个移位密钥加密。假设密钥是“CARGO”,将之写在新格子的第一列。再将上一阶段的密码文一列一列写进新方格里。 

  C A R G O 
  _________ 
  A F A D A 
  D A F G F 
  D X A F A 
  D D F F X 
  G F X F X 

  最后,密钥按照字母表顺序“ACGOR”排序,再按照此顺序依次抄下每个字母下面的整列讯息,形成新密文。如下: 

  FAXDF ADDDG DGFFF AFAXX AFAFX 

  在实际应用中,移位密钥通常有两打字符那么长,且分解密钥和移位密钥都是每天更换的。 

ADFGVX 
  在1918年6月,再加入一个字V扩充。变成以6×6格共36个字符加密。这使得所有英文字母(不再将I和J视为同一个字)以及数字0到9都可混合使用。这次增改是因为以原来的加密法发送含有大量数字的简短信息有问题。

8楼

【乘法密码(Multiplication Cipher)】 

  乘法密码也是一种简单的替代密码,与凯撒密码相似,凯撒密码用的是加法,而乘法密码用的自然是乘法。这种方法形成的加密信息保密性比较低。 

  加密公式:密文 = (明文 * 乘数) Mod 26 

  对于乘数密码,只有当乘数与26互质时,加密之后才会有唯一的解,因此乘数只可能有如下11种的选择: 

  乘数 = 3,5,7,9,11,15,17,19,21,23,25 

  仿射密码和希尔密码因为都用到了乘法,所以乘数也受到相同的局限。 

------------------------------------------------------------------------- 
【仿射密码(Affine Shift)】 

  仿射密码就是凯撒密码和乘法密码的结合。 

  加密公式:密文 = (明文 * 乘数 + 位移数) Mod 26 

------------------------------------------------------------------------- 
【希尔密码(Hill Cipher)】 

  希尔密码就是矩阵乘法密码,运用基本矩阵论原理的替换密码。每个字母当作26进制数字:A=0, B=1, C=2... 一串字母当成n维向量,跟一个n×n的密钥矩阵相乘,再将得出的结果模26。希尔密码的优点是完全隐藏了字符的频率信息,弱点是容易被已知明文攻击击破。 

加密 
  例如:密钥矩阵 
  1 3 
  0 2 

  明文:HI THERE 

  去空格,2个字母一组,根据字母表顺序换成矩阵数值如下,末尾的E为填充字元: 

  HI TH ER EE 
  8  20 5  5 
  9  8  18 5 

  HI 经过矩阵运算转换为 IS,具体算法参考下面的说明: 

  |1 3| 8 e1*8+3*9=35 MOD26=9 =I 
  |0 2| 9 e0*8+2*9=18 MOD26=18=S 

  用同样的方法把“HI THERE”转换为密文“IS RPGJTJ”,注意明文中的两个E分别变为密文中的G和T。 

解密 
  解密时,必须先算出密钥的逆矩阵,然后再根据加密的过程做逆运算。 

  逆矩阵算法公式: 
  |A B| = 1/(AD-BC) * | D -B| 
  |C D|               |-C  A| 

  例如密钥矩阵= 
  |1 7| 
  |0 3| 
  AD-BC=1*3-0*7=3 3*X=1 mod26 所以 X=9 
  因此 
  |1 7| 的逆矩阵为: 9 * |3 -7| 
  |0 3|                |0  1| 

  假设密文为“FOAOESWO” 

  FO AO ES WO 
   6  1  5 23 
  15 15 19 15 

  9* |3 -7| | 6| = 9*(3*6-7*15)=-783 mod26 = 23=W 
     |0  1| |15| = 9*(0*6+1*15)= 135 mod26 = 5 =E 

  所以密文“FOAOESWO”的明文为“WEREDONE” 

------------------------------------------------------------------------- 
【Playfair密码(Playfair Cipher)】 

  Playfair将明文中的双字母组合作为一个单元对待,并将这些单元转换为双字母组合。加密后的字符出现的频率在一定程度上被均匀化。 

  5*5变换矩阵(I或J视为同一字符): 

  C I P H E 
  R A B D F 
  G K L M N 
  O Q S T U 
  V W X Y Z 

  加密规则:按成对字母加密 

  相同对中的字母加分隔符(如x) 
  ballon -> ba lx lo on 
  同行取右边:he->ec 
  同列取下边:dm->mt 
  其他取交叉:kt->mq  od->tr 

  例如:ballon -> ba lx lo on -> db sp gs ug

【摩斯电码】 

  摩斯电码(摩尔斯电码)是一种发报用的信号代码,是一种替代密码,用点(Dot)和划(Dash)的组合来表示各个英文字母或标点。 

  国际标准摩斯电码表 

  1 *----    A *-     N -*     [.] *-*-*- 
  2 **---    B -***   O ---    [,] --**-- 
  3 ***--    C -*-*   P *--*   [:] ---*** 
  4 ****-    D -**    Q --*-   ['] *----* 
  5 *****    E *      R *-*    [?] **--** 
  6 -****    F **-*   S ***    [-] -****- 
  7 --***    G --*    T -      [()] -*--*- 
  8 ---**    H ****   U **-    [@] *--*-* 
  9 ----*    I **     V ***-   [—] -***- 
  0 -----    J *---   W *--    分数线 -**-* 
         K -*-    X -**- 
         L *-**   Y -*--   终了[\r] ***-*- 
         M --     Z --**   始信[\n] -*-*- 


  例:Hello (斜线代表字母之间的间隔) 
  ****/*/*-**/*-**/---/

【百度/Google/网页字符】 

  下面解释一下在百度、Google搜索中文的关键词时,地址栏上出现的奇怪字符。 

百度字符(GB2312) 
  例如在百度搜索“你好”两个字,会转到一个地址为 http://www.baidu.com/s?wd=%C4%E3%BA%C3 的网页。 

  密文(GB码16进制):%C4%E3%BA%C3 
  密文(GB码十进制):50403 47811 
  明文:你好 

  百度用的是GB2312的中文编码,是16进制的。GB2312是标准的简体中文编码。“你”字的GB码为C4E3,“好”字的GB码为BAC3。“你好”转换成十进制为50403和47811。 

Google字符(URI) 
  例如在Google搜索“你好”两个字,会转到一个地址为 http://www.google.cn/search?q=%E4%BD%A0%E5%A5%BD 的网页。 

  密文(URI):%E4%BD%A0%E5%A5%BD 
  明文:你好 

  URI全称Uniform Resource Identifier(通用资源标识符)。Internet可用的每种资源 - HTML文档、图像、视频片段、程序等 - 由一个通过URI进行定位。 

网页编码(Unicode) 
  论坛里常玩的一个把戏,就是让你回帖时写一堆像天书一样的奇怪字符,而回帖之后就能看到相应的文字。 

  密文(Unicode16进制):楼主是个天才 
  密文(Unicode10进制):楼主是个天才 
  明文:楼主是个天才 

  这里使用的是Unicode编码(十进制),Unicode是一种全世界范围的文字编码,网页都支持这种编码。 

Alt+数字小键盘 
  按住Alt键,在任意文本框中,用键盘右边的数字小键盘输入55021,然后松开Alt键,这时你看到了什么? 

  用同样的方法分别输入“你好”两个字的GB代码(十进制)50403、47811,这时你将在文本框中看到这两个字。 

  注意在qq的对话框中,要使用Unicode代码(十进制)20320、22909。

====

【MD5】 

简介 
  MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由Ronald L. Rivest开发出来,经MD2、MD3和MD4发展而来。 

  MD5是一种散列(Hash)算法,散列算法的用途不是对明文加密,让别人看不懂,而是通过对信息摘要的比对,防止对原文的篡改。通常对散列算法而言,所谓的“破解”,就是找碰撞。 

  MD5是把一个任意长度的字节串加密成一个固定长度的大整数(通常是16位或32位),加密的过程中要筛选过滤掉一些原文的数据信息,因此想通过对加密的结果进行逆运算来得出原文是不可能的。 

  关于MD5的应用,举个具体的例子吧。例如你在一个论坛注册一个账号,密码设为“qiuyu21”。此密码经过MD5运算后,变成“287F1E255D930496EE01037339CD978D”,当你点“提交”按钮提交时,服务器的数据库中不记录你的真正密码“qiuyu21”,而是记录那个MD5的运算结果。然后,你在此论坛登录,登录时你用的密码是“qiuyu21”,电脑再次进行MD5运算,把“qiuyu21”转为“287F1E255D930496EE01037339CD978D”,然后传送到服务器那边。这时服务器就把你传过来的MD5运算结果与数据库中你注册时的MD5运算结果比较,如果相同则登录成功。 

  也就是说,服务器只是把MD5运算结果作比较。你也许会问,服务器为什么不用直接对你的密码“qiuyu21”进行校验呢?因为如果服务器的数据库里存的是你的真实密码,那么黑客只要破解了服务器的数据库,那么他也就得到了所有人的密码,他可以用里面的任意密码进行登录。但是如果数据库里面的密码都是MD5格式的,那么即使黑客得到了“287F1E255D930496EE01037339CD978D”这一串数字,他也不能以此作为密码来登录。 

  现在再来谈谈MD5的破解。假设你是攻击者,已经得到了“287F1E255D930496EE01037339CD978D”这一串数字,那么你怎么能得出我的密码是“qiuyu21”呢?因为MD5算法是不可逆的,你只能用暴力法(穷举法)来破解,就是列举所有可能的字母和数字的排列组合,然后一一进行MD5运算来验证运算结果是否为“287F1E255D930496EE01037339CD978D”,“qiuyu21”这个密码是7位英文字符和数字混合,这样的排列组合的数量是个天文数字,如果一一列举,那么在你有生之年是看不到了。所以只有使用黑客字典才是一种有效可行的方法,黑客字典可以根据一些规则自动生成。例如“qiuyu21”这个密码,就是一种常见的组合,规则是:拼音+拼音+数字,拼音总共大约400个,数字以2位数100个来算,这种规则总共约400*400*100=16,000,000种可能,使用优化的算法,估计用1秒就能破解吧。就算考虑到字母开头大写或全部大写的习惯,也只会花大约10几秒时间。如果是破解你熟悉的某个人的密码,那么你可以根据你对他的了解来缩小词典的范围,以便更快速的破解。这种破解方法在很大程度上依赖于你的运气。 

  最后谈谈MD5的碰撞。根据密码学的定义,如果内容不同的明文,通过散列算法得出的结果(密码学称为信息摘要)相同,就称为发生了“碰撞”。因为MD5值可以由任意长度的字符计算出来,所以可以把一篇文章或者一个软件的所有字节进行MD5运算得出一个数值,如果这篇文章或软件的数据改动了,那么再计算出的MD5值也会产生变化,这种方法常常用作数字签名校验。因为明文的长度可以大于MD5值的长度,所以可能会有多个明文具有相同的MD5值,如果你找到了两个相同MD5值的明文,那么你就是找到了MD5的“碰撞”。 

  散列算法的碰撞分为两种,强无碰撞和弱无碰撞。还是以前面那个密码为例:假如你已知“287F1E255D930496EE01037339CD978D”这个MD5值,然后找出了一个单词碰巧也能计算出和“qiuyu21”相同的MD5值,那么你就找到了MD5的“弱无碰撞”,其实这就意味着你已经破解了MD5。如果不给你指定的MD5值,让你随便去找任意两个相同MD5值的明文,即找“强无碰撞”,显然要相对容易些了,但对于好的散列算法来说,做到这一点也很不容易了。 

  值得一提的是,强无碰撞已经被中国的王小云老师给搞定了,她提出的算法可以在短时间内找到碰撞,在世界上引起了轰动,现在的电脑大约一两个小时就可以找到一对碰撞。遗憾的是,找到强无碰撞在实际破解中没有什么真正的用途,所以现在MD5仍然是很安全的。

MD5算法描述 
  对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。 

  在MD5算法中,首先需要对信息进行填充,使其字节长度对512求余的结果等于448。因此,信息的字节长度(Bits Length)将被扩展至N*512+448,即N*64+56个字节(Bytes),N为一个正整数。填充的方法如下,在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。然后,在在这个结果后面附加一个以64位二进制表示的填充前信息长度。经过这两步的处理,现在的信息字节长度=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。 

  MD5中有四个32位被称作链接变量(Chaining Variable)的整数参数,他们分别为:A=0x01234567,B=0x89abcdef,C=0xfedcba98,D=0x76543210。 

  当设置好这四个链接变量后,就开始进入算法的四轮循环运算。循环的次数是信息中512位信息分组的数目。 

  将上面四个链接变量复制到另外四个变量中:A到a,B到b,C到c,D到d。 

  主循环有四轮(MD4只有三轮),每轮循环都很相似。第一轮进行16次操作。每次操作对a、b、c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a、b、c或d中之一。最后用该结果取代a、b、c或d中之一。以一下是每次操作中用到的四个非线性函数(每轮一个)。 

    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)) 
    (&是与,|是或,~是非,^是异或) 

  这四个函数的说明:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。F是一个逐位运算的函数。即,如果X,那么Y,否则Z。函数H是逐位奇偶操作符。 

  假设Mj表示消息的第j个子分组(从0到15): 
  << FF(a,b,c,d,Mj,s,ti) 表示 a=b+((a+(F(b,c,d)+Mj+ti) 
  << GG(a,b,c,d,Mj,s,ti) 表示 a=b+((a+(G(b,c,d)+Mj+ti) 
  << HH(a,b,c,d,Mj,s,ti) 表示 a=b+((a+(H(b,c,d)+Mj+ti) 
  << II(a,b,c,d,Mj,s,ti) 表示 a=b+((a+(I(b,c,d)+Mj+ti)

这四轮(64步)是: 

  第一轮 
    FF(a,b,c,d,M0,7,0xd76aa478) 
    FF(d,a,b,c,M1,12,0xe8c7b756) 
    FF(c,d,a,b,M2,17,0x242070db) 
    FF(b,c,d,a,M3,22,0xc1bdceee) 
    FF(a,b,c,d,M4,7,0xf57c0faf) 
    FF(d,a,b,c,M5,12,0x4787c62a) 
    FF(c,d,a,b,M6,17,0xa8304613) 
    FF(b,c,d,a,M7,22,0xfd469501) 
    FF(a,b,c,d,M8,7,0x698098d8) 
    FF(d,a,b,c,M9,12,0x8b44f7af) 
    FF(c,d,a,b,M10,17,0xffff5bb1) 
    FF(b,c,d,a,M11,22,0x895cd7be) 
    FF(a,b,c,d,M12,7,0x6b901122) 
    FF(d,a,b,c,M13,12,0xfd987193) 
    FF(c,d,a,b,M14,17,0xa679438e) 
    FF(b,c,d,a,M15,22,0x49b40821) 

  第二轮 
    GG(a,b,c,d,M1,5,0xf61e2562) 
    GG(d,a,b,c,M6,9,0xc040b340) 
    GG(c,d,a,b,M11,14,0x265e5a51) 
    GG(b,c,d,a,M0,20,0xe9b6c7aa) 
    GG(a,b,c,d,M5,5,0xd62f105d) 
    GG(d,a,b,c,M10,9,0x02441453) 
    GG(c,d,a,b,M15,14,0xd8a1e681) 
    GG(b,c,d,a,M4,20,0xe7d3fbc8) 
    GG(a,b,c,d,M9,5,0x21e1cde6) 
    GG(d,a,b,c,M14,9,0xc33707d6) 
    GG(c,d,a,b,M3,14,0xf4d50d87) 
    GG(b,c,d,a,M8,20,0x455a14ed) 
    GG(a,b,c,d,M13,5,0xa9e3e905) 
    GG(d,a,b,c,M2,9,0xfcefa3f8) 
    GG(c,d,a,b,M7,14,0x676f02d9) 
    GG(b,c,d,a,M12,20,0x8d2a4c8a) 

  第三轮 
    HH(a,b,c,d,M5,4,0xfffa3942) 
    HH(d,a,b,c,M8,11,0x8771f681) 
    HH(c,d,a,b,M11,16,0x6d9d6122) 
    HH(b,c,d,a,M14,23,0xfde5380c) 
    HH(a,b,c,d,M1,4,0xa4beea44) 
    HH(d,a,b,c,M4,11,0x4bdecfa9) 
    HH(c,d,a,b,M7,16,0xf6bb4b60) 
    HH(b,c,d,a,M10,23,0xbebfbc70) 
    HH(a,b,c,d,M13,4,0x289b7ec6) 
    HH(d,a,b,c,M0,11,0xeaa127fa) 
    HH(c,d,a,b,M3,16,0xd4ef3085) 
    HH(b,c,d,a,M6,23,0x04881d05) 
    HH(a,b,c,d,M9,4,0xd9d4d039) 
    HH(d,a,b,c,M12,11,0xe6db99e5) 
    HH(c,d,a,b,M15,16,0x1fa27cf8) 
    HH(b,c,d,a,M2,23,0xc4ac5665) 

  第四轮 
    II(a,b,c,d,M0,6,0xf4292244) 
    II(d,a,b,c,M7,10,0x432aff97) 
    II(c,d,a,b,M14,15,0xab9423a7) 
    II(b,c,d,a,M5,21,0xfc93a039) 
    II(a,b,c,d,M12,6,0x655b59c3) 
    II(d,a,b,c,M3,10,0x8f0ccc92) 
    II(c,d,a,b,M10,15,0xffeff47d) 
    II(b,c,d,a,M1,21,0x85845dd1) 
    II(a,b,c,d,M8,6,0x6fa87e4f) 
    II(d,a,b,c,M15,10,0xfe2ce6e0) 
    II(c,d,a,b,M6,15,0xa3014314) 
    II(b,c,d,a,M13,21,0x4e0811a1) 
    II(a,b,c,d,M4,6,0xf7537e82) 
    II(d,a,b,c,M11,10,0xbd3af235) 
    II(c,d,a,b,M2,15,0x2ad7d2bb) 
    II(b,c,d,a,M9,21,0xeb86d391) 

  常数ti可以如下选择: 

  在第i步中,ti是4294967296*abs(sin(i))的整数部分,i的单位是弧度。(4294967296等于2的32次方)所有这些完成之后,将A、B、C、D分别加上a、b、c、d。然后用下一分组数据继续运行算法,最后的输出是A、B、C和D的级联。 

  当你按照我上面所说的方法实现MD5算法以后,你可以用以下几个信息对你做出来的程序作一个简单的测试,看看程序有没有错误。 

    MD5 ("") = d41d8cd98f00b204e9800998ecf8427e 
    MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661 
    MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72 
    MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0 
    MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b 
    MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = d174ab98d277d9f5a5611c2c9f419d9f 
    MD5 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = 57edf4a22be3c955ac49da2e2107b67a

MD5的安全性 
  MD5相对MD4所作的改进: 

  1. 增加了第四轮; 
  2. 每一步均有唯一的加法常数; 
  3. 为减弱第二轮中函数G的对称性从(X&Y)|(X&Z)|(Y&Z)变为(X&Z)|(Y&(~Z)); 
  4. 第一步加上了上一步的结果,这将引起更快的雪崩效应; 
  5. 改变了第二轮和第三轮中访问消息子分组的次序,使其更不相似; 
  6. 近似优化了每一轮中的循环左移位移量以实现更快的雪崩效应。各轮的位移量互不相同。

  转自 维密学者
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C语言实现MD5加密,竟如此简单!
md5加密算法c实现,七分注释
QQ农场外挂编程探索(good)
维吉尼亚密码在线加密解密
密码学教程
密码泄露事件频发,一篇文章把密码管理说清楚
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服