diffie - hellman
的<年代trong>diffie - hellman协议年代trong>是一种在公共通道上交换信息的方案。如果两个人(在密码学文献中通常被称为Alice和Bob)希望安全地通信,他们需要一种方式来交换一些只有他们自己知道的信息。实际上,Alice和Bob是远程通信(例如通过internet),并且没有预先安排的方式来交换信息。
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>Bob秘密地选择了一个整数<年代p一个nclass="katex"> 米年代p一个n><年代p一个nclass="mord">.年代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">米年代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>Bob发送给Alice<年代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>现在Alice和Bob有了秘钥<年代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>然后Alice计算<年代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>Bob计算<年代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>Bob计算<年代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>所以他们有一个密钥,他们已经同意没有透露他们的秘密号码给对方。他们可以使用这个密钥通过自己选择的密码系统进行安全通信。
离散对数问题
窃听者(通常被称为Eve)会看到任何通过公共频道传输的结果,所以她会知道<年代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>那么她就拥有与Alice和Bob相同的信息,因此可以读取他们的信息。计算指数<年代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协议的安全性与离散日志问题的难度一样强。
继续上面的例子,Eve知道<年代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>Bob发送给Alice<年代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>然后发给鲍勃。通过这种方式,Eve可以读取Alice和Bob之间的每条消息,在传递消息之前修改消息,并对Alice和Bob的通信做许多其他邪恶和破坏性的事情。请注意,这是在没有解决离散日志问题的情况下完成的。
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)一个>.