diffie - hellman
的<年代trong>diffie - hellman协议年代trong>是一种通过公共通道交换信息的方案。如果两个人(在密码学文献中通常被称为Alice和Bob)希望安全地通信,他们需要一种方法来交换一些只有他们自己知道的信息。实际上,Alice和Bob正在进行远程通信(例如通过互联网),没有预先安排的方式来交换信息。
gydF4y2Ba其主要思想是,他们每个人都有一些只有他们自己知道的秘密信息,他们将这些信息组合成合适的密钥或密码,然后他们可以使用这些密钥或密码来建立一个安全的通信平台。Diffie-Hellman协议允许他们完成这一点,即使对手正在监视他们的消息,只要他们的秘密信息保持秘密。协议的安全性是建立在人们普遍认为的某种计算性的基础上的<一个href="//www.parkandroid.com/wiki/number-theory/" class="wiki_link" title="数论gydF4y2Ba" target="_blank">数论一个>问题被称为<年代trong>离散对数问题年代trong>足够努力。
算法描述
Alice和Bob一起选择一个较大的质数<年代p一个nclass="katex"> p年代p一个n>年代p一个n>和一些<年代p一个nclass="katex"> g年代p一个n>年代p一个n>这样<年代p一个nclass="katex"> 1年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;"><年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">g年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;"><年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">p年代p一个n><年代p一个nclass="mord">.年代p一个n>年代p一个n>(通常是<年代p一个nclass="katex"> g年代p一个n>年代p一个n>为便于计算,选择了相当小的。)这些数字不需要保密,因此可以通过公共渠道自由交流。爱丽丝秘密地选择了一个整数<年代p一个nclass="katex"> n年代p一个n><年代p一个nclass="mpunct">,年代p一个n>年代p一个n>鲍勃秘密地选择了一个整数<年代p一个nclass="katex"> 米年代p一个n><年代p一个nclass="mord">.年代p一个n>年代p一个n>
现在爱丽丝把号码发给鲍勃<年代p一个nclass="katex"> g年代p一个n><年代p一个nclass="msupsub">n年代p一个n>年代p一个n>(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>p年代p一个n><年代p一个nclass="mclose">)年代p一个n><年代p一个nclass="mpunct">,年代p一个n>年代p一个n>鲍勃让爱丽丝<年代p一个nclass="katex"> g年代p一个n><年代p一个nclass="msupsub">米年代p一个n>年代p一个n>(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>p年代p一个n><年代p一个nclass="mclose">)年代p一个n><年代p一个nclass="mord">.年代p一个n>年代p一个n>
使用她的秘密<年代p一个nclass="katex"> n年代p一个n><年代p一个nclass="mpunct">,年代p一个n>年代p一个n>爱丽丝计算<年代p一个nclass="katex"> 年代年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">≡年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">(年代p一个n><年代p一个nclass="mord">g年代p一个n><年代p一个nclass="msupsub">米年代p一个n>年代p一个n>)年代p一个n><年代p一个nclass="msupsub">n年代p一个n>年代p一个n>≡年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">g年代p一个n><年代p一个nclass="msupsub">米年代p一个n><年代p一个nclass="mord mathdefault mtight">n年代p一个n>年代p一个n>(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>p年代p一个n><年代p一个nclass="mclose">)年代p一个n><年代p一个nclass="mord">.年代p一个n>年代p一个n>使用他的秘密<年代p一个nclass="katex"> 米年代p一个n><年代p一个nclass="mpunct">,年代p一个n>年代p一个n>鲍勃计算<年代p一个nclass="katex"> 年代年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">≡年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">(年代p一个n><年代p一个nclass="mord">g年代p一个n><年代p一个nclass="msupsub">n年代p一个n>年代p一个n>)年代p一个n><年代p一个nclass="msupsub">米年代p一个n>年代p一个n>≡年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">g年代p一个n><年代p一个nclass="msupsub">米年代p一个n><年代p一个nclass="mord mathdefault mtight">n年代p一个n>年代p一个n>(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>p年代p一个n><年代p一个nclass="mclose">)年代p一个n><年代p一个nclass="mord">.年代p一个n>年代p一个n>现在爱丽丝和鲍勃有一把秘密钥匙<年代p一个nclass="katex"> 年代年代p一个n>年代p一个n>只有他们知道,这可以用来通过任何数量的安全私有密钥密码系统发送消息。
让<年代p一个nclass="katex"> p年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">=年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">1年代p一个n><年代p一个nclass="mord">9年代p一个n><年代p一个nclass="mord">1年代p一个n>年代p一个n>而且<年代p一个nclass="katex"> g年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">=年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">2年代p一个n><年代p一个nclass="mord">.年代p一个n>年代p一个n>假设爱丽丝选<年代p一个nclass="katex"> 4年代p一个n><年代p一个nclass="mord">2年代p一个n>年代p一个n>和鲍勃选择<年代p一个nclass="katex"> 3.年代p一个n><年代p一个nclass="mord">3.年代p一个n><年代p一个nclass="mord">.年代p一个n>年代p一个n>然后爱丽丝计算<年代p一个nclass="katex"> 2年代p一个n><年代p一个nclass="msupsub">4年代p一个n><年代p一个nclass="mord mtight">2年代p一个n>年代p一个n>≡年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">2年代p一个n><年代p一个nclass="mord">0年代p一个n><年代p一个nclass="mspace allowbreak">(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>1年代p一个n><年代p一个nclass="mord">9年代p一个n><年代p一个nclass="mord">1年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>和鲍勃计算<年代p一个nclass="katex"> 2年代p一个n><年代p一个nclass="msupsub">3.年代p一个n><年代p一个nclass="mord mtight">3.年代p一个n>年代p一个n>≡年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">1年代p一个n><年代p一个nclass="mord">0年代p一个n><年代p一个nclass="mord">3.年代p一个n><年代p一个nclass="mspace allowbreak">(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>1年代p一个n><年代p一个nclass="mord">9年代p一个n><年代p一个nclass="mord">1年代p一个n><年代p一个nclass="mclose">)年代p一个n><年代p一个nclass="mord">.年代p一个n>年代p一个n>他们将这些计算的结果发送给对方。在接收<年代p一个nclass="katex"> 1年代p一个n><年代p一个nclass="mord">0年代p一个n><年代p一个nclass="mord">3.年代p一个n><年代p一个nclass="mpunct">,年代p一个n>年代p一个n>爱丽丝计算<年代p一个nclass="katex"> 1年代p一个n><年代p一个nclass="mord">0年代p一个n><年代p一个nclass="mord">3.年代p一个n><年代p一个nclass="msupsub">4年代p一个n><年代p一个nclass="mord mtight">2年代p一个n>年代p一个n>≡年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">1年代p一个n><年代p一个nclass="mord">1年代p一个n><年代p一个nclass="mord">5年代p一个n><年代p一个nclass="mspace allowbreak">(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>1年代p一个n><年代p一个nclass="mord">9年代p一个n><年代p一个nclass="mord">1年代p一个n><年代p一个nclass="mclose">)年代p一个n><年代p一个nclass="mpunct">,年代p一个n>年代p一个n>和鲍勃计算<年代p一个nclass="katex"> 2年代p一个n><年代p一个nclass="mord">0年代p一个n><年代p一个nclass="msupsub">3.年代p一个n><年代p一个nclass="mord mtight">3.年代p一个n>年代p一个n>≡年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">1年代p一个n><年代p一个nclass="mord">1年代p一个n><年代p一个nclass="mord">5年代p一个n><年代p一个nclass="mspace allowbreak">(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>1年代p一个n><年代p一个nclass="mord">9年代p一个n><年代p一个nclass="mord">1年代p一个n><年代p一个nclass="mclose">)年代p一个n><年代p一个nclass="mord">.年代p一个n>年代p一个n>所以他们有一个他们同意的密钥,而不向对方透露他们的秘密号码。他们可以使用这个密钥通过他们选择的密码系统进行安全通信。
离散对数问题
窃听者(通常被称为夏娃)会看到任何通过公共频道传输的结果,所以她会知道<年代p一个nclass="katex"> p年代p一个n><年代p一个nclass="mpunct">,年代p一个n><年代p一个nclass="mspace" style="margin-right:0.16666666666666666em;">g年代p一个n><年代p一个nclass="mpunct">,年代p一个n><年代p一个nclass="mspace" style="margin-right:0.16666666666666666em;">g年代p一个n><年代p一个nclass="msupsub">n年代p一个n>年代p一个n>(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>p年代p一个n><年代p一个nclass="mclose">)年代p一个n><年代p一个nclass="mpunct">,年代p一个n>年代p一个n>而且<年代p一个nclass="katex"> g年代p一个n><年代p一个nclass="msupsub">米年代p一个n>年代p一个n>(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>p年代p一个n><年代p一个nclass="mclose">)年代p一个n><年代p一个nclass="mord">.年代p一个n>年代p一个n>她的目标是计算<年代p一个nclass="katex"> g年代p一个n><年代p一个nclass="msupsub">米年代p一个n><年代p一个nclass="mord mathdefault mtight">n年代p一个n>年代p一个n>(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>p年代p一个n><年代p一个nclass="mclose">)年代p一个n><年代p一个nclass="mord">.年代p一个n>年代p一个n>如果她会计算<年代p一个nclass="katex"> 米年代p一个n>年代p一个n>而且<年代p一个nclass="katex"> n年代p一个n><年代p一个nclass="mpunct">,年代p一个n>年代p一个n>那么她就拥有与爱丽丝和鲍勃相同的信息,因此可以阅读他们的信息。计算指数<年代p一个nclass="katex"> n年代p一个n>年代p一个n>就像拿一个“mod- ?<年代p一个nclass="katex"> p年代p一个n>年代p一个n>- - -<年代p一个nclass="katex"> g年代p一个n>年代p一个n>对数”,<年代p一个nclass="katex"> g年代p一个n><年代p一个nclass="msupsub">n年代p一个n>年代p一个n>,年代p一个n>年代p一个n>但总的来说,这应该是一个难题。它被称为<年代trong>离散对数问题年代trong>.目前还没有有效计算离散日志的已知算法<年代p一个nclass="katex"> (年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>p年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>一般来说。
gydF4y2Ba人们也普遍认为,没有比夏娃更快的计算方法了<年代p一个nclass="katex"> g年代p一个n><年代p一个nclass="msupsub">米年代p一个n><年代p一个nclass="mord mathdefault mtight">n年代p一个n>年代p一个n>(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>p年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>比通过寻找<年代p一个nclass="katex"> 米年代p一个n>年代p一个n>而且<年代p一个nclass="katex"> n年代p一个n><年代p一个nclass="mpunct">,年代p一个n>年代p一个n>使得Diffie-Hellman协议的安全性与离散日志问题的难度相当。
继续上面的例子,夏娃知道<年代p一个nclass="katex"> p年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">=年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">1年代p一个n><年代p一个nclass="mord">9年代p一个n><年代p一个nclass="mord">1年代p一个n><年代p一个nclass="mpunct">,年代p一个n>年代p一个n> g年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">=年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">2年代p一个n><年代p一个nclass="mpunct">,年代p一个n>年代p一个n> 2年代p一个n><年代p一个nclass="msupsub">n年代p一个n>年代p一个n>≡年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">2年代p一个n><年代p一个nclass="mord">0年代p一个n><年代p一个nclass="mspace allowbreak">(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>1年代p一个n><年代p一个nclass="mord">9年代p一个n><年代p一个nclass="mord">1年代p一个n><年代p一个nclass="mclose">)年代p一个n><年代p一个nclass="mpunct">,年代p一个n>年代p一个n>而且<年代p一个nclass="katex"> 2年代p一个n><年代p一个nclass="msupsub">米年代p一个n>年代p一个n>≡年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">1年代p一个n><年代p一个nclass="mord">0年代p一个n><年代p一个nclass="mord">3.年代p一个n><年代p一个nclass="mspace allowbreak">(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>1年代p一个n><年代p一个nclass="mord">9年代p一个n><年代p一个nclass="mord">1年代p一个n><年代p一个nclass="mclose">)年代p一个n><年代p一个nclass="mord">.年代p一个n>年代p一个n>没有访问<年代p一个nclass="katex"> 米年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">=年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">3.年代p一个n><年代p一个nclass="mord">3.年代p一个n>年代p一个n>或<年代p一个nclass="katex"> n年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">=年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">4年代p一个n><年代p一个nclass="mord">2年代p一个n><年代p一个nclass="mpunct">,年代p一个n>年代p一个n>她将无法使用此信息推断共享密钥<年代p一个nclass="katex"> 1年代p一个n><年代p一个nclass="mord">1年代p一个n><年代p一个nclass="mord">5年代p一个n><年代p一个nclass="mord">.年代p一个n>年代p一个n>
选择参数
一定的选择<年代p一个nclass="katex"> p年代p一个n>年代p一个n>而且<年代p一个nclass="katex"> g年代p一个n>年代p一个n>比别人更好。以下是避免协议中常见的不安全和攻击的一些指导方针。
(1)<年代trong>总理<年代p一个nclass="katex"> p年代p一个n>年代p一个n>应该选择最大的质因数<年代p一个nclass="katex"> p年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">−年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">1年代p一个n>年代p一个n>很大。年代trong>如果<年代p一个nclass="katex"> p年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">−年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">1年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">=年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">问年代p一个n><年代p一个nclass="msupsub">1年代p一个n>年代p一个n>一个年代p一个n><年代p一个nclass="msupsub">1年代p一个n>年代p一个n>⋯年代p一个n><年代p一个nclass="mspace" style="margin-right:0.16666666666666666em;">问年代p一个n><年代p一个nclass="msupsub">k年代p一个n>年代p一个n>一个年代p一个n><年代p一个nclass="msupsub">k年代p一个n>年代p一个n>,年代p一个n>年代p一个n>在哪里<年代p一个nclass="katex"> 问年代p一个n><年代p一个nclass="msupsub">我年代p一个n>年代p一个n>都是小质数,那么一种攻击叫做<一个href="//www.parkandroid.com/wiki/pohlig-hellman-algorithm/" class="wiki_link" title="Pohlig-Hellman算法gydF4y2Ba" target="_blank">Pohlig-Hellman算法一个>计算离散日志<年代p一个nclass="katex"> x年代p一个n>年代p一个n>的<年代p一个nclass="katex"> g年代p一个n><年代p一个nclass="msupsub">x年代p一个n>年代p一个n>通过使用<一个href="//www.parkandroid.com/wiki/chinese-remainder-theorem/" class="wiki_link" title="中国剩余定理gydF4y2Ba" target="_blank">中国剩余定理一个>和快速计算<年代p一个nclass="katex"> x年代p一个n>年代p一个n>国防部<年代p一个nclass="katex"> 问年代p一个n><年代p一个nclass="msupsub">我年代p一个n>年代p一个n>一个年代p一个n><年代p一个nclass="msupsub">我年代p一个n>年代p一个n>.年代p一个n>年代p一个n>
因此,通常选择的值<年代p一个nclass="katex">
p年代p一个n>年代p一个n>的形式<年代p一个nclass="katex">
p年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">=年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">2年代p一个n><年代p一个nclass="mord mathdefault" style="margin-right:0.03588em;">问年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">+年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">1年代p一个n><年代p一个nclass="mpunct">,年代p一个n>年代p一个n>在哪里<年代p一个nclass="katex">
问年代p一个n>年代p一个n>质数(叫做a<一个href="//www.parkandroid.com/wiki/fermats-last-theorem/" class="wiki_link" title="苏菲日尔曼'gydF4y2Ba" target="_blank">苏菲日尔曼'一个>).这样的<年代p一个nclass="katex">
p年代p一个n>年代p一个n>通常被称为
(2)<年代trong>基地<年代p一个nclass="katex"> g年代p一个n>年代p一个n>应该这样选择吗<年代p一个nclass="katex"> g年代p一个n>年代p一个n>有大量<一个href="//www.parkandroid.com/wiki/order-of-an-element/" class="wiki_link" title="订单gydF4y2Ba" target="_blank">订单一个>,年代trong>即。<年代p一个nclass="katex"> g年代p一个n>年代p一个n>生成乘法的一个大子组<一个href="//www.parkandroid.com/wiki/group-theory-introduction/" class="wiki_link" title="集团gydF4y2Ba" target="_blank">集团一个><年代p一个nclass="katex"> (年代p一个n><年代p一个nclass="mord">Z年代p一个n>年代p一个n>/年代p一个n><年代p一个nclass="mord mathdefault">p年代p一个n><年代p一个nclass="mord">Z年代p一个n>年代p一个n>)年代p一个n><年代p一个nclass="msupsub">∗年代p一个n>年代p一个n>.年代p一个n>年代p一个n>这样,攻击者就无法找到的离散日志<年代p一个nclass="katex"> g年代p一个n><年代p一个nclass="msupsub">米年代p一个n>年代p一个n>通过列举所有的可能性<年代p一个nclass="katex"> g年代p一个n><年代p一个nclass="msupsub">米年代p一个n>年代p一个n> (年代p一个n>年代p一个n>它还增加了可能的密钥的数量<年代p一个nclass="katex"> g年代p一个n><年代p一个nclass="msupsub">米年代p一个n><年代p一个nclass="mord mathdefault mtight">n年代p一个n>年代p一个n>)年代p一个n><年代p一个nclass="mord">.年代p一个n>年代p一个n>当<年代p一个nclass="katex"> p年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">=年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">2年代p一个n><年代p一个nclass="mord mathdefault" style="margin-right:0.03588em;">问年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">+年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">1年代p一个n>年代p一个n>是一个安全的质数,<年代p一个nclass="katex"> g年代p一个n>年代p一个n>是常选有序吗<年代p一个nclass="katex"> 问年代p一个n><年代p一个nclass="mpunct">;年代p一个n>年代p一个n>下面的练习解释了为什么这是首选的顺序<年代p一个nclass="katex"> 2年代p一个n><年代p一个nclass="mord mathdefault" style="margin-right:0.03588em;">问年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">=年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">p年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">−年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">1年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">:年代p一个n>年代p一个n>
让<年代p一个nclass="katex"> p年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">=年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">1年代p一个n><年代p一个nclass="mord">0年代p一个n><年代p一个nclass="mord">0年代p一个n><年代p一个nclass="mord">0年代p一个n><年代p一个nclass="mord">7年代p一个n>年代p一个n>而且<年代p一个nclass="katex"> g年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">=年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">5年代p一个n><年代p一个nclass="mord">.年代p一个n>年代p一个n>你可能会认为<年代p一个nclass="katex"> p年代p一个n>年代p一个n>',<年代p一个nclass="katex"> g年代p一个n>年代p一个n>是原始根mod吗<年代p一个nclass="katex"> p年代p一个n><年代p一个nclass="mord">.年代p一个n>年代p一个n>
假设Alice和Bob使用这些参数执行Diffie-Hellman协议。作为第一步,Alice发送Bob<年代p一个nclass="katex"> g年代p一个n><年代p一个nclass="msupsub">米年代p一个n>年代p一个n>(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>p年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>鲍勃让爱丽丝<年代p一个nclass="katex"> g年代p一个n><年代p一个nclass="msupsub">n年代p一个n>年代p一个n>(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>p年代p一个n><年代p一个nclass="mclose">)年代p一个n><年代p一个nclass="mpunct">,年代p一个n>年代p一个n>在哪里<年代p一个nclass="katex"> 米年代p一个n>年代p一个n>而且<年代p一个nclass="katex"> n年代p一个n>年代p一个n>秘密正整数小于吗<年代p一个nclass="katex"> p年代p一个n><年代p一个nclass="mpunct">,年代p一个n>年代p一个n>分别只有爱丽丝和鲍勃知道。
gydF4y2Ba伊芙知道偷听的价值<年代p一个nclass="katex"> p年代p一个n>年代p一个n>而且<年代p一个nclass="katex"> g年代p一个n>年代p一个n>,并查看传输。特别地,她看到Alice将号码发送给Bob<年代p一个nclass="katex"> 2年代p一个n>年代p一个n>鲍勃把号码发给爱丽丝<年代p一个nclass="katex"> 3.年代p一个n><年代p一个nclass="mord">.年代p一个n>年代p一个n>夏娃能推断出什么<年代p一个nclass="katex"> 米年代p一个n>年代p一个n>而且<年代p一个nclass="katex"> n年代p一个n>年代p一个n>很快吗?(也就是说,比计算机要快得多<年代p一个nclass="katex"> 米年代p一个n>年代p一个n>而且<年代p一个nclass="katex"> n年代p一个n>年代p一个n>——请不要计算<年代p一个nclass="katex"> 米年代p一个n>年代p一个n>而且<年代p一个nclass="katex"> n年代p一个n>年代p一个n>解决问题!)
中间人攻击
假设Alice向Bob发送消息宣布<年代p一个nclass="katex"> g年代p一个n><年代p一个nclass="msupsub">n年代p一个n>年代p一个n>米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>p年代p一个n>年代p一个n>,伊芙拦截了消息并发送了自己的号码<年代p一个nclass="katex"> g年代p一个n><年代p一个nclass="msupsub">t年代p一个n>年代p一个n>米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>p年代p一个n>年代p一个n>鲍勃。最后鲍勃和伊芙对一把密钥达成了一致<年代p一个nclass="katex"> g年代p一个n><年代p一个nclass="msupsub">t年代p一个n><年代p一个nclass="mord mathdefault mtight">米年代p一个n>年代p一个n>米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>p年代p一个n>年代p一个n>爱丽丝和夏娃对钥匙达成了一致<年代p一个nclass="katex"> g年代p一个n><年代p一个nclass="msupsub">t年代p一个n><年代p一个nclass="mord mathdefault mtight">n年代p一个n>年代p一个n>米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>p年代p一个n>年代p一个n>.
gydF4y2Ba当Alice向Bob发送消息时,她在不知情的情况下使用了密钥<年代p一个nclass="katex"> g年代p一个n><年代p一个nclass="msupsub">t年代p一个n><年代p一个nclass="mord mathdefault mtight">n年代p一个n>年代p一个n>米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>p年代p一个n>年代p一个n>伊芙拦截,解密,修改,用密钥重新加密<年代p一个nclass="katex"> g年代p一个n><年代p一个nclass="msupsub">t年代p一个n><年代p一个nclass="mord mathdefault mtight">米年代p一个n>年代p一个n>米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>n年代p一个n><年代p一个nclass="mpunct">,年代p一个n>年代p一个n>然后把它发给鲍勃。通过这种方式,伊芙可以读取爱丽丝和鲍勃之间的每条消息,在传递消息之前修改消息,并对爱丽丝和鲍勃的通信进行许多其他恶意和破坏性的操作。注意,这并没有解决离散日志问题。
gydF4y2Ba在实践中,有一些经典的Diffie-Hellman的变体,使用签名方案和其他思想,避免了这个弱点。得到的协议通常称为<一个href="//www.parkandroid.com/wiki/sts-protocol/" class="wiki_link" title="STS(叫号电话的)协议gydF4y2Ba" target="_blank">STS(叫号电话的)协议一个>.
实际用途及变型
截至2016年,推荐的尺寸为Diffie-Hellman模数<年代p一个nclass="katex"> p年代p一个n>年代p一个n>确保安全免受最先进的攻击<年代p一个nclass="katex"> 2年代p一个n><年代p一个nclass="mord">0年代p一个n><年代p一个nclass="mord">4年代p一个n><年代p一个nclass="mord">8年代p一个n>年代p一个n>位<年代p一个nclass="katex"> (年代p一个n>年代p一个n>2年代p一个n><年代p一个nclass="msupsub">2年代p一个n><年代p一个nclass="mord mtight">0年代p一个n><年代p一个nclass="mord mtight">4年代p一个n><年代p一个nclass="mord mtight">8年代p一个n>年代p一个n>)年代p一个n>年代p一个n>.年代p一个n>年代p一个n>避免某些可以处理大素数的特殊攻击的另一种方法是改变进行算术运算的底层组:而不是使用<年代p一个nclass="katex"> (年代p一个n><年代p一个nclass="mord">Z年代p一个n>年代p一个n>/年代p一个n><年代p一个nclass="mord mathdefault">p年代p一个n><年代p一个nclass="mord">Z年代p一个n>年代p一个n>)年代p一个n><年代p一个nclass="msupsub">∗年代p一个n>年代p一个n>,年代p一个n>年代p一个n>an上的点的集合<一个href="//www.parkandroid.com/wiki/elliptic-curves/" class="wiki_link" title="椭圆曲线gydF4y2Ba" target="_blank">椭圆曲线一个>在<年代p一个nclass="katex"> F年代p一个n>年代p一个n>p年代p一个n>年代p一个n>提供一个大约相同大小的组,在这个组上离散对数问题似乎要困难得多。
gydF4y2Ba也就是说,给定一个合适的椭圆曲线<年代p一个nclass="katex"> E年代p一个n>年代p一个n>和'<年代p一个nclass="katex"> p年代p一个n><年代p一个nclass="mpunct">,年代p一个n>年代p一个n>爱丽丝和鲍勃在某一点上意见一致<年代p一个nclass="katex"> P年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">∈年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">E年代p一个n><年代p一个nclass="mopen">(年代p一个n><年代p一个nclass="mord">F年代p一个n>年代p一个n>p年代p一个n>年代p一个n>)年代p一个n><年代p一个nclass="mpunct">,年代p一个n>年代p一个n>计算<年代p一个nclass="katex"> n年代p一个n><年代p一个nclass="mord mathdefault" style="margin-right:0.13889em;">P年代p一个n>年代p一个n>而且<年代p一个nclass="katex"> 米年代p一个n><年代p一个nclass="mord mathdefault" style="margin-right:0.13889em;">P年代p一个n><年代p一个nclass="mpunct">,年代p一个n>年代p一个n>分别,然后用彼此的计算来计算点<年代p一个nclass="katex"> 米年代p一个n><年代p一个nclass="mord mathdefault">n年代p一个n><年代p一个nclass="mord mathdefault" style="margin-right:0.13889em;">P年代p一个n><年代p一个nclass="mpunct">,年代p一个n>年代p一个n>可以转换为共享私钥。这种方法的优点是它允许使用更小的质数<年代p一个nclass="katex"> p年代p一个n><年代p一个nclass="mpunct">,年代p一个n>年代p一个n>这样Alice和Bob的计算成本更低,同时还能保持可接受的安全水平。
gydF4y2Ba也有直接基于Diffie-Hellman协议的密码系统,它们使用离散日志问题的假定安全性来确保对未经授权的用户来说很难解密消息。也就是说,Alice和Bob使用Diffie-Hellman机制来发送消息,而不是简单地商定一个密钥。这个家族中目前的行业标准密码系统被称为<一个href="//www.parkandroid.com/wiki/integrated-encryption-scheme/" class="wiki_link" title="综合加密方案(IES)gydF4y2Ba" target="_blank">综合加密方案(IES)一个>.