import{_ as r,c as a,a as l,b as Q,d as m,o as t}from"./app-DZszAu6D.js";const n="/images/2015/05/dh_01.png",o="/images/2015/05/dh_02.png",H="/images/2015/05/dh_03.png",p="/images/2015/05/dh_01_add_02.png",s="/images/2015/05/dh_04.png",d="/images/2015/05/dh_05.png",i="/images/2015/05/dh_01_add_03.png",g="/images/2015/05/dh_07.png",h="/images/2015/05/dh_05_add_02.png",V="/images/2015/05/dh_04_add_03.png",e="/images/2015/05/dh_08.png",L={},c={class:"MathJax",jax:"SVG",style:{position:"relative"}},M={style:{"vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.514ex",height:"1.717ex",role:"img",focusable:"false",viewBox:"0 -677 3321 759","aria-hidden":"true"},u={class:"MathJax",jax:"SVG",style:{position:"relative"}},Z={style:{"vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"14.56ex",height:"2.034ex",role:"img",focusable:"false",viewBox:"0 -694 6435.7 899","aria-hidden":"true"},f={class:"MathJax",jax:"SVG",display:"true",style:{position:"relative"}},x={style:{"vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"14.176ex",height:"1.827ex",role:"img",focusable:"false",viewBox:"0 -725.5 6265.6 807.5","aria-hidden":"true"},w={class:"MathJax",jax:"SVG",display:"true",style:{position:"relative"}},D={style:{"vertical-align":"-3.681ex"},xmlns:"http://www.w3.org/2000/svg",width:"45.323ex",height:"8.493ex",role:"img",focusable:"false",viewBox:"0 -2126.9 20032.7 3753.7","aria-hidden":"true"},k={class:"MathJax",jax:"SVG",display:"true",style:{position:"relative"}},v={style:{"vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"59.135ex",height:"2.61ex",role:"img",focusable:"false",viewBox:"0 -903.7 26137.7 1153.7","aria-hidden":"true"},y={class:"gridtable",style:{width:"100%","text-align":"center","border-collapse":"collapse"}},b={class:"MathJax",jax:"SVG",style:{position:"relative"}},j={style:{"vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.223ex",height:"1.464ex",role:"img",focusable:"false",viewBox:"0 -442 1424.7 647","aria-hidden":"true"},C={class:"MathJax",jax:"SVG",style:{position:"relative"}},B={style:{"vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.223ex",height:"1.464ex",role:"img",focusable:"false",viewBox:"0 -442 1424.7 647","aria-hidden":"true"},F={class:"MathJax",jax:"SVG",style:{position:"relative"}},A={style:{"vertical-align":"-0.023ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.197ex",height:"1.02ex",role:"img",focusable:"false",viewBox:"0 -441 529 451","aria-hidden":"true"},S={class:"MathJax",jax:"SVG",style:{position:"relative"}},G={style:{"vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"0.971ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 429 705","aria-hidden":"true"},J={class:"MathJax",jax:"SVG",style:{position:"relative"}},E={style:{"vertical-align":"-0.394ex"},xmlns:"http://www.w3.org/2000/svg",width:"11.471ex",height:"1.771ex",role:"img",focusable:"false",viewBox:"0 -608.6 5070.4 782.8","aria-hidden":"true"},O={class:"MathJax",jax:"SVG",style:{position:"relative"}},R={style:{"vertical-align":"-0.394ex"},xmlns:"http://www.w3.org/2000/svg",width:"11.353ex",height:"2.036ex",role:"img",focusable:"false",viewBox:"0 -725.7 5017.9 899.9","aria-hidden":"true"},P={class:"MathJax",jax:"SVG",style:{position:"relative"}},X={style:{"vertical-align":"-0.394ex"},xmlns:"http://www.w3.org/2000/svg",width:"11.353ex",height:"2.036ex",role:"img",focusable:"false",viewBox:"0 -725.7 5017.9 899.9","aria-hidden":"true"},z={class:"MathJax",jax:"SVG",style:{position:"relative"}},N={style:{"vertical-align":"-0.394ex"},xmlns:"http://www.w3.org/2000/svg",width:"11.471ex",height:"1.771ex",role:"img",focusable:"false",viewBox:"0 -608.6 5070.4 782.8","aria-hidden":"true"},K={class:"MathJax",jax:"SVG",display:"true",style:{position:"relative"}},Y={style:{"vertical-align":"-3.276ex"},xmlns:"http://www.w3.org/2000/svg",width:"19.994ex",height:"7.514ex",role:"img",focusable:"false",viewBox:"0 -1873.2 8837.6 3321.3","aria-hidden":"true"},W={class:"MathJax",jax:"SVG",display:"true",style:{position:"relative"}},q={style:{"vertical-align":"-3.424ex"},xmlns:"http://www.w3.org/2000/svg",width:"19.859ex",height:"7.81ex",role:"img",focusable:"false",viewBox:"0 -1938.5 8777.5 3452","aria-hidden":"true"},I={class:"MathJax",jax:"SVG",style:{position:"relative"}},U={style:{"vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"9.468ex",height:"2.395ex",role:"img",focusable:"false",viewBox:"0 -853.7 4185 1058.7","aria-hidden":"true"},$={class:"MathJax",jax:"SVG",style:{position:"relative"}},_={style:{"vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"8.649ex",height:"2.084ex",role:"img",focusable:"false",viewBox:"0 -716 3823 921","aria-hidden":"true"},Q3={class:"MathJax",jax:"SVG",display:"true",style:{position:"relative"}},T3={style:{"vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"12.651ex",height:"1.971ex",role:"img",focusable:"false",viewBox:"0 -666 5591.8 871","aria-hidden":"true"},a3={class:"MathJax",jax:"SVG",style:{position:"relative"}},t3={style:{"vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.345ex",height:"1.692ex",role:"img",focusable:"false",viewBox:"0 -666 2362.6 748","aria-hidden":"true"},l3={class:"MathJax",jax:"SVG",display:"true",style:{position:"relative"}},m3={style:{"vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"18.774ex",height:"2.185ex",role:"img",focusable:"false",viewBox:"0 -883.9 8298.2 965.9","aria-hidden":"true"},n3={class:"MathJax",jax:"SVG",style:{position:"relative"}},s3={style:{"vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.262ex",height:"1.557ex",role:"img",focusable:"false",viewBox:"0 -666 1000 688","aria-hidden":"true"},d3={class:"MathJax",jax:"SVG",display:"true",style:{position:"relative"}},e3={style:{"vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"20.726ex",height:"2.185ex",role:"img",focusable:"false",viewBox:"0 -883.9 9160.8 965.9","aria-hidden":"true"},r3={class:"MathJax",jax:"SVG",style:{position:"relative"}},o3={style:{"vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.697ex",height:"1.62ex",role:"img",focusable:"false",viewBox:"0 -716 750 716","aria-hidden":"true"},H3={class:"MathJax",jax:"SVG",style:{position:"relative"}},p3={style:{"vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.717ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 759 683","aria-hidden":"true"},i3={class:"MathJax",jax:"SVG",display:"true",style:{position:"relative"}},g3={style:{"vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"19.668ex",height:"2.185ex",role:"img",focusable:"false",viewBox:"0 -883.9 8693.2 965.9","aria-hidden":"true"},h3={class:"MathJax",jax:"SVG",display:"true",style:{position:"relative"}},V3={style:{"vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"19.337ex",height:"2.185ex",role:"img",focusable:"false",viewBox:"0 -883.9 8546.8 965.9","aria-hidden":"true"},L3={class:"MathJax",jax:"SVG",style:{position:"relative"}},c3={style:{"vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.138ex",height:"1.439ex",role:"img",focusable:"false",viewBox:"0 -442 503 636","aria-hidden":"true"},M3={class:"MathJax",jax:"SVG",style:{position:"relative"}},u3={style:{"vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.138ex",height:"1.439ex",role:"img",focusable:"false",viewBox:"0 -442 503 636","aria-hidden":"true"},Z3={class:"MathJax",jax:"SVG",style:{position:"relative"}},f3={style:{"vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.079ex",height:"1.464ex",role:"img",focusable:"false",viewBox:"0 -442 477 647","aria-hidden":"true"};function x3(w3,T){return t(),a("div",null,[T[105]||(T[105]=l('

一个简单的DH密钥协商算法的实现

密码的管理可以说是加密体系中最为性命攸关的问题,在计算机发明之前,加密方法只能使用简单的移位、查表等简单的方法,这种级别的加密算法,基本上都无法逃脱被破解的命运,比如二战中德国发明的“英格玛”可以说是前计算机时代人类所发明的最为复杂的加密方法了,但以图灵为首的盟军科学家们,仍然可以用粗暴的暴力破解法硬生生从密文中破解出原文出来。
进入计算机时代后,加密算法的复杂度有了质的飞跃,相对应的破解难度也不断加大,到了如今,像AES这样变态的加密算法,已经比英格玛不知复杂了多少个数量级,在没有密码的情况下,想直接从密文中破解出明文,即使图灵重生也全无可能了。于是,密钥本身的管理变成了加密环节中最脆弱的环节,“如何安全的把密码告诉别人”成了一个难题,比如,如果你需要发给同事一封包含加密附件的邮件,一般都会把密码放在另外一封邮件中发送,或者用其他方式告诉他,尽管这样做也并不安全,但总比那种傻乎乎的把密码和加密附件直接放在一起强多了。
1976年,美国的两位数学家Whitfield Diffie和Martin Hellman率先发表了一种解决该密钥传输的方法,因此这种方法被大家称为Diffie–Hellman key exchange算法,这种算法提出这么一个做法:“在加密通讯之前双方各自生成密码的一部分,然后互换后合成起来,作为最终的密码”。这就是密钥协商,维基百科上使用了一个很有趣的比喻,就是颜料的混合:
设想这样一个场景,Alice(A)和Bob(B),他们想在不见面的情况下秘密约定出一种颜色,但他们互相沟通的信息都会被公开,应该怎么办呢?

AliceBob
私密信息公开信息公开信息私密信息
A和B首先约定好公开的一种颜色,比如黄色
A,B各自挑选出一种私密的颜色,比如橙色和兰色
A,B各自将两种颜色混合起来
双方交换混合后的颜色
A,B各自将自己的私密颜色再次混入得到的颜色中
现在A,B得到了一种相同的颜色,这种颜色是由一份黄色、一份橙色、一份兰色混合而来,但外界无法得知
',3)),Q("p",null,[T[4]||(T[4]=m("秘密在于,颜色混合是一种“不可逆”的操作,当双方交换颜色时,尽管我们知道他们交换的颜色都是由一份黄色和另一份其他颜色混合得到的,但我们还是无法或者很难得到他们的私密颜色。而DH秘钥交换的原理非常相似,也是利用了数学上的一个“不可逆”的运算,就是离散对数(Discrete logarithm)")),T[5]||(T[5]=Q("br",null,null,-1)),T[6]||(T[6]=m(" 乘方得逆运算称为对数运算,比如已知")),Q("mjx-container",c,[(t(),a("svg",M,T[0]||(T[0]=[l('',1)]))),T[1]||(T[1]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msup",null,[Q("mn",null,"7"),Q("mi",null,"x")]),Q("mo",null,"="),Q("mn",null,"49")])],-1))]),T[7]||(T[7]=m(",那么可知")),Q("mjx-container",u,[(t(),a("svg",Z,T[2]||(T[2]=[l('',1)]))),T[3]||(T[3]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"x"),Q("mo",null,"="),Q("mi",null,"l"),Q("mi",null,"o"),Q("msub",null,[Q("mi",null,"g"),Q("mn",null,"7")]),Q("mn",null,"49"),Q("mo",null,"="),Q("mn",null,"2")])],-1))]),T[8]||(T[8]=m(", 对数运算非常容易,即使在数字很大的时候是,但如果是下面的情况"))]),Q("mjx-container",f,[(t(),a("svg",x,T[9]||(T[9]=[l('',1)]))),T[10]||(T[10]=Q("mjx-assistive-mml",{unselectable:"on",display:"block"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("msup",null,[Q("mn",null,"7"),Q("mi",null,"x")]),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mn",null,"13"),Q("mo",null,"="),Q("mn",null,"8")])],-1))]),T[106]||(T[106]=Q("p",null,"求X的过程称为“离散对数”,就不那么容易了,在数字很大时几乎是一个不可能的运算,而DH秘钥交换就是利用了这种离散对数计算非常困难的特性来设计的。公式里的mod是取模运算,取模运算有几条基本的定律如下",-1)),Q("mjx-container",w,[(t(),a("svg",D,T[11]||(T[11]=[l('',1)]))),T[12]||(T[12]=Q("mjx-assistive-mml",{unselectable:"on",display:"block"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[Q("mtr",null,[Q("mtd",null,[Q("mo",{stretchy:"false"},"("),Q("mi",null,"a"),Q("mo",null,"+"),Q("mi",null,"b"),Q("mo",{stretchy:"false"},")"),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mi",null,"P")]),Q("mtd",null,[Q("mi"),Q("mo",null,"="),Q("mo",{stretchy:"false"},"("),Q("mi",null,"a"),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mi",null,"P"),Q("mo",null,"+"),Q("mi",null,"b"),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mi",null,"P"),Q("mo",{stretchy:"false"},")"),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mi",null,"P")])]),Q("mtr",null,[Q("mtd",null,[Q("mo",{stretchy:"false"},"("),Q("mi",null,"a"),Q("mo",null,"∗"),Q("mi",null,"b"),Q("mo",{stretchy:"false"},")"),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mi",null,"P")]),Q("mtd",null,[Q("mi"),Q("mo",null,"="),Q("mo",{stretchy:"false"},"("),Q("mi",null,"a"),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mi",null,"P"),Q("mo",null,"∗"),Q("mi",null,"b"),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mi",null,"P"),Q("mo",{stretchy:"false"},")"),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mi",null,"P")])]),Q("mtr",null,[Q("mtd",null,[Q("mo",{stretchy:"false"},"("),Q("msup",null,[Q("mi",null,"a"),Q("mi",null,"b")]),Q("mo",{stretchy:"false"},")"),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mi",null,"P")]),Q("mtd",null,[Q("mi"),Q("mo",null,"="),Q("mo",{stretchy:"false"},"("),Q("mo",{stretchy:"false"},"("),Q("mi",null,"a"),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mi",null,"P"),Q("msup",null,[Q("mo",{stretchy:"false"},")"),Q("mi",null,"b")]),Q("mo",{stretchy:"false"},")"),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mi",null,"P")])])])])],-1))]),T[107]||(T[107]=Q("p",null,"根据上面的公式,可以推导出一个非常重要的公式",-1)),Q("mjx-container",k,[(t(),a("svg",v,T[13]||(T[13]=[l('',1)]))),T[14]||(T[14]=Q("mjx-assistive-mml",{unselectable:"on",display:"block"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mo",{stretchy:"false"},"("),Q("msup",null,[Q("mi",null,"G"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"a"),Q("mo",null,"∗"),Q("mi",null,"b")])]),Q("mo",{stretchy:"false"},")"),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mi",null,"P"),Q("mo",null,"="),Q("mo",{stretchy:"false"},"("),Q("msup",null,[Q("mi",null,"G"),Q("mi",null,"a")]),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mi",null,"P"),Q("msup",null,[Q("mo",{stretchy:"false"},")"),Q("mi",null,"b")]),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mi",null,"P"),Q("mo",null,"="),Q("mo",{stretchy:"false"},"("),Q("msup",null,[Q("mi",null,"G"),Q("mi",null,"b")]),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mi",null,"P"),Q("msup",null,[Q("mo",{stretchy:"false"},")"),Q("mi",null,"a")]),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mi",null,"P")])],-1))]),T[108]||(T[108]=Q("p",null,"根据这个公式,我们可以向上面交换颜色那样设计出一个秘密交换数字的流程出来",-1)),Q("table",y,[Q("tbody",null,[T[55]||(T[55]=Q("tr",null,[Q("th",{rowspan:"2",width:"40%"}),Q("th",{colspan:"2",style:{"text-align":"center"}},"Alice"),Q("th",{rowspan:"2"}),Q("th",{colspan:"2",style:{"text-align":"center"}},"Bob")],-1)),T[56]||(T[56]=Q("tr",null,[Q("th",{style:{"text-align":"center"}},"私密信息"),Q("th",{style:{"text-align":"center"}},"公开信息"),Q("th",{style:{"text-align":"center"}},"公开信息"),Q("th",{style:{"text-align":"center"}},"私密信息")],-1)),Q("tr",null,[T[19]||(T[19]=Q("td",{style:{"vertical-align":"middle"}},"A和B首先约定两个公开的质数p和g",-1)),T[20]||(T[20]=Q("td",null,null,-1)),Q("td",null,[Q("p",null,[Q("mjx-container",b,[(t(),a("svg",j,T[15]||(T[15]=[l('',1)]))),T[16]||(T[16]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"p"),Q("mo",null,","),Q("mi",null,"g")])],-1))])])]),T[21]||(T[21]=Q("td",null,null,-1)),Q("td",null,[Q("p",null,[Q("mjx-container",C,[(t(),a("svg",B,T[17]||(T[17]=[l('',1)]))),T[18]||(T[18]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"p"),Q("mo",null,","),Q("mi",null,"g")])],-1))])])]),T[22]||(T[22]=Q("td",null,null,-1))]),Q("tr",null,[T[27]||(T[27]=Q("td",{style:{"vertical-align":"middle"}},"A和B各自随机产生两个数a,b,作为自己的私钥",-1)),Q("td",null,[Q("p",null,[Q("mjx-container",F,[(t(),a("svg",A,T[23]||(T[23]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D44E",d:"M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z"})])])],-1)]))),T[24]||(T[24]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"a")])],-1))])])]),T[28]||(T[28]=Q("td",null,null,-1)),T[29]||(T[29]=Q("td",null,null,-1)),T[30]||(T[30]=Q("td",null,null,-1)),Q("td",null,[Q("p",null,[Q("mjx-container",S,[(t(),a("svg",G,T[25]||(T[25]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D44F",d:"M73 647Q73 657 77 670T89 683Q90 683 161 688T234 694Q246 694 246 685T212 542Q204 508 195 472T180 418L176 399Q176 396 182 402Q231 442 283 442Q345 442 383 396T422 280Q422 169 343 79T173 -11Q123 -11 82 27T40 150V159Q40 180 48 217T97 414Q147 611 147 623T109 637Q104 637 101 637H96Q86 637 83 637T76 640T73 647ZM336 325V331Q336 405 275 405Q258 405 240 397T207 376T181 352T163 330L157 322L136 236Q114 150 114 114Q114 66 138 42Q154 26 178 26Q211 26 245 58Q270 81 285 114T318 219Q336 291 336 325Z"})])])],-1)]))),T[26]||(T[26]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"b")])],-1))])])])]),Q("tr",null,[T[35]||(T[35]=Q("td",{style:{"vertical-align":"middle"}},"各自计算出自己的公钥A,B",-1)),T[36]||(T[36]=Q("td",null,null,-1)),Q("td",null,[Q("p",null,[Q("mjx-container",J,[(t(),a("svg",E,T[31]||(T[31]=[l('',1)]))),T[32]||(T[32]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mstyle",{mathsize:"0.85em"},[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"A"),Q("mo",null,"="),Q("msup",null,[Q("mi",null,"g"),Q("mi",null,"a")]),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mi",null,"p")])])])],-1))])])]),T[37]||(T[37]=Q("td",null,null,-1)),Q("td",null,[Q("p",null,[Q("mjx-container",O,[(t(),a("svg",R,T[33]||(T[33]=[l('',1)]))),T[34]||(T[34]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mstyle",{mathsize:"0.85em"},[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"B"),Q("mo",null,"="),Q("msup",null,[Q("mi",null,"g"),Q("mi",null,"b")]),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mi",null,"p")])])])],-1))])])]),T[38]||(T[38]=Q("td",null,null,-1))]),Q("tr",null,[T[43]||(T[43]=Q("td",{style:{"vertical-align":"middle"}},"交换公钥A,B",-1)),T[44]||(T[44]=Q("td",null,null,-1)),Q("td",null,[Q("p",null,[Q("mjx-container",P,[(t(),a("svg",X,T[39]||(T[39]=[l('',1)]))),T[40]||(T[40]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mstyle",{mathsize:"0.85em"},[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"B"),Q("mo",null,"="),Q("msup",null,[Q("mi",null,"g"),Q("mi",null,"b")]),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mi",null,"p")])])])],-1))])])]),T[45]||(T[45]=Q("td",null,null,-1)),Q("td",null,[Q("p",null,[Q("mjx-container",z,[(t(),a("svg",N,T[41]||(T[41]=[l('',1)]))),T[42]||(T[42]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mstyle",{mathsize:"0.85em"},[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"A"),Q("mo",null,"="),Q("msup",null,[Q("mi",null,"g"),Q("mi",null,"a")]),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mi",null,"p")])])])],-1))])])]),T[46]||(T[46]=Q("td",null,null,-1))]),Q("tr",null,[T[51]||(T[51]=Q("td",{style:{"vertical-align":"middle"}},"计算出加密用的密钥S",-1)),Q("td",null,[Q("mjx-container",K,[(t(),a("svg",Y,T[47]||(T[47]=[l('',1)]))),T[48]||(T[48]=Q("mjx-assistive-mml",{unselectable:"on",display:"block"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mstyle",{mathsize:"0.85em"},[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[Q("mtr",null,[Q("mtd",null,[Q("msub",null,[Q("mi",null,"S"),Q("mi",null,"a")])]),Q("mtd",null,[Q("mi"),Q("mo",null,"="),Q("msup",null,[Q("mi",null,"B"),Q("mi",null,"a")]),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mi",null,"p")])]),Q("mtr",null,[Q("mtd"),Q("mtd",null,[Q("mi"),Q("mo",null,"="),Q("mo",{stretchy:"false"},"("),Q("msup",null,[Q("mi",null,"g"),Q("mi",null,"b")]),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mi",null,"p"),Q("msup",null,[Q("mo",{stretchy:"false"},")"),Q("mi",null,"a")]),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mi",null,"p")])]),Q("mtr",null,[Q("mtd"),Q("mtd",null,[Q("mi"),Q("mo",null,"="),Q("msup",null,[Q("mi",null,"g"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"a"),Q("mi",null,"b")])]),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mi",null,"p")])])])])])])],-1))])]),T[52]||(T[52]=Q("td",null,null,-1)),T[53]||(T[53]=Q("td",null,null,-1)),T[54]||(T[54]=Q("td",null,null,-1)),Q("td",null,[Q("mjx-container",W,[(t(),a("svg",q,T[49]||(T[49]=[l('',1)]))),T[50]||(T[50]=Q("mjx-assistive-mml",{unselectable:"on",display:"block"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mstyle",{mathsize:"0.85em"},[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[Q("mtr",null,[Q("mtd",null,[Q("msub",null,[Q("mi",null,"S"),Q("mi",null,"b")])]),Q("mtd",null,[Q("mi"),Q("mo",null,"="),Q("msup",null,[Q("mi",null,"A"),Q("mi",null,"b")]),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mi",null,"p")])]),Q("mtr",null,[Q("mtd"),Q("mtd",null,[Q("mi"),Q("mo",null,"="),Q("mo",{stretchy:"false"},"("),Q("msup",null,[Q("mi",null,"g"),Q("mi",null,"a")]),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mi",null,"p"),Q("msup",null,[Q("mo",{stretchy:"false"},")"),Q("mi",null,"b")]),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mi",null,"p")])]),Q("mtr",null,[Q("mtd"),Q("mtd",null,[Q("mi"),Q("mo",null,"="),Q("msup",null,[Q("mi",null,"g"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"a"),Q("mi",null,"b")])]),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mi",null,"p")])])])])])])],-1))])])])])]),Q("p",null,[T[61]||(T[61]=m("最终两个人得到的秘密数字都是")),Q("mjx-container",I,[(t(),a("svg",U,T[57]||(T[57]=[l('',1)]))),T[58]||(T[58]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msup",null,[Q("mi",null,"g"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"a"),Q("mi",null,"b")])]),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mi",null,"p")])],-1))]),T[62]||(T[62]=m(",而窃听者仅从")),Q("mjx-container",$,[(t(),a("svg",_,T[59]||(T[59]=[l('',1)]))),T[60]||(T[60]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"p"),Q("mo",null,","),Q("mi",null,"g"),Q("mo",null,","),Q("mi",null,"A"),Q("mo",null,","),Q("mi",null,"B")])],-1))]),T[63]||(T[63]=m("四个公开信息,是无法得到这个秘密数字的。")),T[64]||(T[64]=Q("br",null,null,-1)),T[65]||(T[65]=m(" 举个例子,假如"))]),Q("mjx-container",Q3,[(t(),a("svg",T3,T[66]||(T[66]=[l('',1)]))),T[67]||(T[67]=Q("mjx-assistive-mml",{unselectable:"on",display:"block"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mi",null,"p"),Q("mo",null,"="),Q("mn",null,"23"),Q("mo",null,","),Q("mi",null,"g"),Q("mo",null,"="),Q("mn",null,"5")])],-1))]),Q("p",null,[T[70]||(T[70]=m("Alice选取的秘密数字")),Q("mjx-container",a3,[(t(),a("svg",t3,T[68]||(T[68]=[l('',1)]))),T[69]||(T[69]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"a"),Q("mo",null,"="),Q("mn",null,"6")])],-1))]),T[71]||(T[71]=m(", 那么"))]),Q("mjx-container",l3,[(t(),a("svg",m3,T[72]||(T[72]=[l('',1)]))),T[73]||(T[73]=Q("mjx-assistive-mml",{unselectable:"on",display:"block"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mi",null,"A"),Q("mo",null,"="),Q("msup",null,[Q("mn",null,"5"),Q("mn",null,"6")]),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mn",null,"23"),Q("mo",null,"="),Q("mn",null,"8")])],-1))]),Q("p",null,[T[76]||(T[76]=m("Bob选取的秘密数字是")),Q("mjx-container",n3,[(t(),a("svg",s3,T[74]||(T[74]=[l('',1)]))),T[75]||(T[75]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mn",null,"15")])],-1))]),T[77]||(T[77]=m(", 那么"))]),Q("mjx-container",d3,[(t(),a("svg",e3,T[78]||(T[78]=[l('',1)]))),T[79]||(T[79]=Q("mjx-assistive-mml",{unselectable:"on",display:"block"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mi",null,"B"),Q("mo",null,"="),Q("msup",null,[Q("mn",null,"5"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mn",null,"15")])]),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mn",null,"23"),Q("mo",null,"="),Q("mn",null,"19")])],-1))]),Q("p",null,[T[84]||(T[84]=m("交换")),Q("mjx-container",r3,[(t(),a("svg",o3,T[80]||(T[80]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D434",d:"M208 74Q208 50 254 46Q272 46 272 35Q272 34 270 22Q267 8 264 4T251 0Q249 0 239 0T205 1T141 2Q70 2 50 0H42Q35 7 35 11Q37 38 48 46H62Q132 49 164 96Q170 102 345 401T523 704Q530 716 547 716H555H572Q578 707 578 706L606 383Q634 60 636 57Q641 46 701 46Q726 46 726 36Q726 34 723 22Q720 7 718 4T704 0Q701 0 690 0T651 1T578 2Q484 2 455 0H443Q437 6 437 9T439 27Q443 40 445 43L449 46H469Q523 49 533 63L521 213H283L249 155Q208 86 208 74ZM516 260Q516 271 504 416T490 562L463 519Q447 492 400 412L310 260L413 259Q516 259 516 260Z"})])])],-1)]))),T[81]||(T[81]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"A")])],-1))]),T[85]||(T[85]=m("和")),Q("mjx-container",H3,[(t(),a("svg",p3,T[82]||(T[82]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D435",d:"M231 637Q204 637 199 638T194 649Q194 676 205 682Q206 683 335 683Q594 683 608 681Q671 671 713 636T756 544Q756 480 698 429T565 360L555 357Q619 348 660 311T702 219Q702 146 630 78T453 1Q446 0 242 0Q42 0 39 2Q35 5 35 10Q35 17 37 24Q42 43 47 45Q51 46 62 46H68Q95 46 128 49Q142 52 147 61Q150 65 219 339T288 628Q288 635 231 637ZM649 544Q649 574 634 600T585 634Q578 636 493 637Q473 637 451 637T416 636H403Q388 635 384 626Q382 622 352 506Q352 503 351 500L320 374H401Q482 374 494 376Q554 386 601 434T649 544ZM595 229Q595 273 572 302T512 336Q506 337 429 337Q311 337 310 336Q310 334 293 263T258 122L240 52Q240 48 252 48T333 46Q422 46 429 47Q491 54 543 105T595 229Z"})])])],-1)]))),T[83]||(T[83]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"B")])],-1))]),T[86]||(T[86]=m("后,Alice计算出的密钥"))]),Q("mjx-container",i3,[(t(),a("svg",g3,T[87]||(T[87]=[l('',1)]))),T[88]||(T[88]=Q("mjx-assistive-mml",{unselectable:"on",display:"block"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mi",null,"S"),Q("mo",null,"="),Q("msup",null,[Q("mn",null,"19"),Q("mn",null,"6")]),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mn",null,"23"),Q("mo",null,"="),Q("mn",null,"2")])],-1))]),T[109]||(T[109]=Q("p",null,"Bob计算出的密钥",-1)),Q("mjx-container",h3,[(t(),a("svg",V3,T[89]||(T[89]=[l('',1)]))),T[90]||(T[90]=Q("mjx-assistive-mml",{unselectable:"on",display:"block"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mi",null,"S"),Q("mo",null,"="),Q("msup",null,[Q("mn",null,"8"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mn",null,"15")])]),Q("mo",{lspace:"thickmathspace",rspace:"thickmathspace"},"mod"),Q("mn",null,"23"),Q("mo",null,"="),Q("mn",null,"2")])],-1))]),Q("p",null,[T[97]||(T[97]=m("当然,实际运算中不可能取这么小的数值,比如如果需要128bit长度的密钥,那么p值需要是128bit长度的质数,由于有模运算,所获得的密钥不会大于")),Q("mjx-container",L3,[(t(),a("svg",c3,T[91]||(T[91]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D45D",d:"M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z"})])])],-1)]))),T[92]||(T[92]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"p")])],-1))]),T[98]||(T[98]=m(",所以")),Q("mjx-container",M3,[(t(),a("svg",u3,T[93]||(T[93]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D45D",d:"M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z"})])])],-1)]))),T[94]||(T[94]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"p")])],-1))]),T[99]||(T[99]=m("值可以是128bit数字中最大的一个质数,")),Q("mjx-container",Z3,[(t(),a("svg",f3,T[95]||(T[95]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D454",d:"M311 43Q296 30 267 15T206 0Q143 0 105 45T66 160Q66 265 143 353T314 442Q361 442 401 394L404 398Q406 401 409 404T418 412T431 419T447 422Q461 422 470 413T480 394Q480 379 423 152T363 -80Q345 -134 286 -169T151 -205Q10 -205 10 -137Q10 -111 28 -91T74 -71Q89 -71 102 -80T116 -111Q116 -121 114 -130T107 -144T99 -154T92 -162L90 -164H91Q101 -167 151 -167Q189 -167 211 -155Q234 -144 254 -122T282 -75Q288 -56 298 -13Q311 35 311 43ZM384 328L380 339Q377 350 375 354T369 368T359 382T346 393T328 402T306 405Q262 405 221 352Q191 313 171 233T151 117Q151 38 213 38Q269 38 323 108L331 118L384 328Z"})])])],-1)]))),T[96]||(T[96]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline"},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"g")])],-1))]),T[100]||(T[100]=m("可以随便设置一个小的质数即可。")),T[101]||(T[101]=Q("br",null,null,-1)),T[102]||(T[102]=m(" 我在")),T[103]||(T[103]=Q("a",{href:"https://github.com/thejinchao/dhexchange",target:"_blank",rel:"noopener noreferrer"},"github",-1)),T[104]||(T[104]=m("上写了一个DH密钥交换算法,支持128bit长度密钥运算,纯C完成,没有引用其他库,只有两个接口,用法如下"))]),T[110]||(T[110]=l(`
//Alice获得随机私钥a并计算出对应的公钥A
DH_KEY alice_private, alice_public;
DH_generate_key_pair(alice_public, alice_private);
//Bob获得随机私钥b并计算出对应的公钥B
DH_KEY bob_private, bob_public;
DH_generate_key_pair(bob_public, bob_private);
//交换公钥后Alice计算出加密用密钥s
DH_KEY alice_secret;
DH_generate_key_secret(alice_secret, alice_private, bob_public);
//Bob计算出加密用密钥s
DH_KEY bob_secret;
DH_generate_key_secret(bob_secret, bob_private, alice_public);
`,1))])}const k3=r(L,[["render",x3],["__file","DH.html.vue"]]),v3=JSON.parse('{"path":"/blog/2025/02/DH.html","title":"一个简单的DH密钥协商算法的实现","lang":"zh-CN","frontmatter":{"title":"一个简单的DH密钥协商算法的实现","tags":"加密 程序 算法"},"headers":[],"git":{},"filePathRelative":"blog/2025/02/DH.md"}');export{k3 as comp,v3 as data};