Files
thejinchao.github.io/blog/2025/02/DH.html
T

56 lines
77 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<meta name="generator" content="VuePress 2.0.0-rc.19" />
<style>
:root {
--vp-c-bg: #fff;
}
[data-theme='dark'] {
--vp-c-bg: #1b1b1f;
}
html,
body {
background-color: var(--vp-c-bg);
}
</style>
<script>
const useChoice = localStorage.getItem('vuepress-color-scheme')
const systemStatus =
'matchMedia' in window
? window.matchMedia('(prefers-color-scheme: dark)').matches
: false
if (useChoice === 'light') {
document.documentElement.dataset.theme = 'light'
} else if (useChoice === 'dark' || systemStatus) {
document.documentElement.dataset.theme = 'dark'
}
</script>
<title>一个简单的DH密钥协商算法的实现 | 我的博客和笔记</title><meta name="description" content="理性派,数学,物理,程序">
<link rel="preload" href="/assets/style-BD3wH0kl.css" as="style"><link rel="stylesheet" href="/assets/style-BD3wH0kl.css">
<link rel="modulepreload" href="/assets/app-Bj0iHonY.js"><link rel="modulepreload" href="/assets/DH.html-BY5ss3Yd.js">
<link rel="prefetch" href="/assets/about.html-BKHD8_27.js" as="script"><link rel="prefetch" href="/assets/index.html-DCqf0Yhx.js" as="script"><link rel="prefetch" href="/assets/index.html-ByCnZdB7.js" as="script"><link rel="prefetch" href="/assets/index.html-C8bIghrh.js" as="script"><link rel="prefetch" href="/assets/flip_coin.html-CtyAnL_p.js" as="script"><link rel="prefetch" href="/assets/index.html-Bp54WPsd.js" as="script"><link rel="prefetch" href="/assets/mental_poker.html-DrLpcK0Z.js" as="script"><link rel="prefetch" href="/assets/rsa.html-BzrURFnC.js" as="script"><link rel="prefetch" href="/assets/index.html-Dd_VxDLf.js" as="script"><link rel="prefetch" href="/assets/index.html-08uek56d.js" as="script"><link rel="prefetch" href="/assets/group.html-CgID_Ytm.js" as="script"><link rel="prefetch" href="/assets/index.html-B4oSYQrc.js" as="script"><link rel="prefetch" href="/assets/number_theory_1.html-Dk51lxDs.js" as="script"><link rel="prefetch" href="/assets/number_theory_2.html-CpI8fOvy.js" as="script"><link rel="prefetch" href="/assets/number_theory_3.html-vurBmL5N.js" as="script"><link rel="prefetch" href="/assets/probability.html-DtXs-h-R.js" as="script"><link rel="prefetch" href="/assets/symbol.html-DNk3WaMG.js" as="script"><link rel="prefetch" href="/assets/Ellipse.html-MscloGz5.js" as="script"><link rel="prefetch" href="/assets/Fibonacci.html-DGHJeLXU.js" as="script"><link rel="prefetch" href="/assets/JPEG001.html-BMaPs7Rg.js" as="script"><link rel="prefetch" href="/assets/JPEG002.html-D0yfNmBx.js" as="script"><link rel="prefetch" href="/assets/JPEG003.html-6mrtdZov.js" as="script"><link rel="prefetch" href="/assets/JPEG004.html-Dhpf0TM2.js" as="script"><link rel="prefetch" href="/assets/JPEG005.html-6a8w9XiB.js" as="script"><link rel="prefetch" href="/assets/Martingle.html-CKvAEqUe.js" as="script"><link rel="prefetch" href="/assets/MentalPoker01.html-CVPMtJle.js" as="script"><link rel="prefetch" href="/assets/MentalPoker02.html-CeOOKh4d.js" as="script"><link rel="prefetch" href="/assets/RandRound.html-BYv821U1.js" as="script"><link rel="prefetch" href="/assets/SPH001.html-COiZ2bJK.js" as="script"><link rel="prefetch" href="/assets/SPH002.html-DjGg5BMo.js" as="script"><link rel="prefetch" href="/assets/SPH003.html-D_TBi5sR.js" as="script"><link rel="prefetch" href="/assets/SPH004.html-DwrD-rsk.js" as="script"><link rel="prefetch" href="/assets/SegmentCircle.html-mfJ0HByo.js" as="script"><link rel="prefetch" href="/assets/illumination_model_01.html-DHCOFCfL.js" as="script"><link rel="prefetch" href="/assets/illumination_model_02.html-igVH9CdB.js" as="script"><link rel="prefetch" href="/assets/index.html-BZusU71h.js" as="script"><link rel="prefetch" href="/assets/ibl_01.html-sH3ffk-K.js" as="script"><link rel="prefetch" href="/assets/ibl_02.html-CjNoce7g.js" as="script"><link rel="prefetch" href="/assets/index.html--Z5jQ5Vs.js" as="script"><link rel="prefetch" href="/assets/index.html-kNaRPHuk.js" as="script"><link rel="prefetch" href="/assets/math_01.html-BvIvykO8.js" as="script"><link rel="prefetch" href="/assets/math_02.html-DlKIg_k9.js" as="script"><link rel="prefetch" href="/assets/math_03.html-BhVg0PRB.js" as="script"><link rel="prefetch" href="/assets/transform_01.html-DRrLIlH3.js" as="script"><link rel="prefetch" href="/assets/transform_02.html-CX7S70bP.js" as="script"><link rel="prefetch" href="/assets/transform_03.html-CNzgsxLd.js" as="script"><link rel="prefetch" href="/assets/transform_04.html-HZ5pCysD.js" as="script"><link rel="prefetch" href="/assets/function.html-CGQnt5qr.js" as="script"><link rel="prefetch" href="/assets/grammar.html-DNbW58J0.js" as="script"><link rel="prefetch" href="/assets/helloworld.html-B3yEhBIW.js" as="script"><link rel="prefetch" href="/assets/index.html-DpgE4jGz.js" as="script"><link rel="prefetch" href="/assets/object_and_class.html-tUTPWetj.js" as="script"><link rel="prefetch" href="/assets/BRDF.html-DOaRZUqY.js" as="script"><link rel="prefetch" href="/assets/luminosity.html-CzDTFkf0.js" as="script"><link rel="prefetch" href="/assets/microfacets_1.html-N6ytvZqT.js" as="script"><link rel="prefetch" href="/assets/microfacets_2.html-Do-s-d_F.js" as="script"><link rel="prefetch" href="/assets/microfacets_3.html-CKila0Tv.js" as="script"><link rel="prefetch" href="/assets/render_function_1.html-czrKh_EI.js" as="script"><link rel="prefetch" href="/assets/404.html-ZQfppfEZ.js" as="script"><link rel="prefetch" href="/assets/setupDevtools-7MC2TMWH-C6p7wg3a.js" as="script">
</head>
<body>
<div id="app"><!--[--><div class="vp-theme-container external-link-icon" vp-container><!--[--><header class="vp-navbar" vp-navbar><div class="vp-toggle-sidebar-button" title="toggle sidebar" aria-expanded="false" role="button" tabindex="0"><div class="icon" aria-hidden="true"><span></span><span></span><span></span></div></div><span><a class="route-link" href="/"><img class="vp-site-logo" src="/favicon.png" alt="我的博客和笔记"><span class="vp-site-name vp-hide-mobile" aria-hidden="true">我的博客和笔记</span></a></span><div class="vp-navbar-items-wrapper" style=""><!--[--><!--]--><nav class="vp-navbar-items vp-hide-mobile" aria-label="site navigation"><!--[--><div class="vp-navbar-item"><a class="route-link auto-link" href="/" aria-label="首页"><!--[--><!--[--><!--]--><!--]-->首页<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link route-link-active auto-link" href="/blog/" aria-label="文章"><!--[--><!--[--><!--]--><!--]-->文章<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><div class="vp-navbar-dropdown-wrapper"><button class="vp-navbar-dropdown-title" type="button" aria-label="开源项目"><span class="title">开源项目</span><span class="arrow down"></span></button><button class="vp-navbar-dropdown-title-mobile" type="button" aria-label="开源项目"><span class="title">开源项目</span><span class="right arrow"></span></button><ul style="display:none;" class="vp-navbar-dropdown"><!--[--><li class="vp-navbar-dropdown-item"><a class="auto-link external-link" href="https://github.com/thejinchao/turbolink" aria-label="TurboLink" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->TurboLink<!--[--><!--[--><!--]--><!--]--></a></li><!--]--></ul></div></div><div class="vp-navbar-item"><div class="vp-navbar-dropdown-wrapper"><button class="vp-navbar-dropdown-title" type="button" aria-label="个人笔记"><span class="title">个人笔记</span><span class="arrow down"></span></button><button class="vp-navbar-dropdown-title-mobile" type="button" aria-label="个人笔记"><span class="title">个人笔记</span><span class="right arrow"></span></button><ul style="display:none;" class="vp-navbar-dropdown"><!--[--><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/note/math/" aria-label="数学相关"><!--[--><!--[--><!--]--><!--]-->数学相关<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/note/graphics/" aria-label="图形学"><!--[--><!--[--><!--]--><!--]-->图形学<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/note/cryptography/" aria-label="密码学"><!--[--><!--[--><!--]--><!--]-->密码学<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/note/language/" aria-label="编程语言"><!--[--><!--[--><!--]--><!--]-->编程语言<!--[--><!--[--><!--]--><!--]--></a></li><!--]--></ul></div></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/about.html" aria-label="关于"><!--[--><!--[--><!--]--><!--]-->关于<!--[--><!--[--><!--]--><!--]--></a></div><!--]--></nav><!--[--><!--]--><button type="button" class="vp-toggle-color-mode-button" title="toggle color mode"><svg class="light-icon" viewbox="0 0 32 32" style=""><path d="M16 12.005a4 4 0 1 1-4 4a4.005 4.005 0 0 1 4-4m0-2a6 6 0 1 0 6 6a6 6 0 0 0-6-6z" fill="currentColor"></path><path d="M5.394 6.813l1.414-1.415l3.506 3.506L8.9 10.318z" fill="currentColor"></path><path d="M2 15.005h5v2H2z" fill="currentColor"></path><path d="M5.394 25.197L8.9 21.691l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 25.005h2v5h-2z" fill="currentColor"></path><path d="M21.687 23.106l1.414-1.415l3.506 3.506l-1.414 1.414z" fill="currentColor"></path><path d="M25 15.005h5v2h-5z" fill="currentColor"></path><path d="M21.687 8.904l3.506-3.506l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 2.005h2v5h-2z" fill="currentColor"></path></svg><svg class="dark-icon" viewbox="0 0 32 32" style="display:none;"><path d="M13.502 5.414a15.075 15.075 0 0 0 11.594 18.194a11.113 11.113 0 0 1-7.975 3.39c-.138 0-.278.005-.418 0a11.094 11.094 0 0 1-3.2-21.584M14.98 3a1.002 1.002 0 0 0-.175.016a13.096 13.096 0 0 0 1.825 25.981c.164.006.328 0 .49 0a13.072 13.072 0 0 0 10.703-5.555a1.01 1.01 0 0 0-.783-1.565A13.08 13.08 0 0 1 15.89 4.38A1.015 1.015 0 0 0 14.98 3z" fill="currentColor"></path></svg></button><!----></div></header><!--]--><div class="vp-sidebar-mask"></div><!--[--><aside class="vp-sidebar" vp-sidebar><nav class="vp-navbar-items" aria-label="site navigation"><!--[--><div class="vp-navbar-item"><a class="route-link auto-link" href="/" aria-label="首页"><!--[--><!--[--><!--]--><!--]-->首页<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link route-link-active auto-link" href="/blog/" aria-label="文章"><!--[--><!--[--><!--]--><!--]-->文章<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><div class="vp-navbar-dropdown-wrapper"><button class="vp-navbar-dropdown-title" type="button" aria-label="开源项目"><span class="title">开源项目</span><span class="arrow down"></span></button><button class="vp-navbar-dropdown-title-mobile" type="button" aria-label="开源项目"><span class="title">开源项目</span><span class="right arrow"></span></button><ul style="display:none;" class="vp-navbar-dropdown"><!--[--><li class="vp-navbar-dropdown-item"><a class="auto-link external-link" href="https://github.com/thejinchao/turbolink" aria-label="TurboLink" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->TurboLink<!--[--><!--[--><!--]--><!--]--></a></li><!--]--></ul></div></div><div class="vp-navbar-item"><div class="vp-navbar-dropdown-wrapper"><button class="vp-navbar-dropdown-title" type="button" aria-label="个人笔记"><span class="title">个人笔记</span><span class="arrow down"></span></button><button class="vp-navbar-dropdown-title-mobile" type="button" aria-label="个人笔记"><span class="title">个人笔记</span><span class="right arrow"></span></button><ul style="display:none;" class="vp-navbar-dropdown"><!--[--><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/note/math/" aria-label="数学相关"><!--[--><!--[--><!--]--><!--]-->数学相关<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/note/graphics/" aria-label="图形学"><!--[--><!--[--><!--]--><!--]-->图形学<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/note/cryptography/" aria-label="密码学"><!--[--><!--[--><!--]--><!--]-->密码学<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/note/language/" aria-label="编程语言"><!--[--><!--[--><!--]--><!--]-->编程语言<!--[--><!--[--><!--]--><!--]--></a></li><!--]--></ul></div></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/about.html" aria-label="关于"><!--[--><!--[--><!--]--><!--]-->关于<!--[--><!--[--><!--]--><!--]--></a></div><!--]--></nav><!--[--><!--]--><ul class="vp-sidebar-items"><!--[--><li><p tabindex="0" class="vp-sidebar-item vp-sidebar-heading active collapsible">我的文章 <span class="down arrow"></span></p><ul style="" class="vp-sidebar-children"><!--[--><li><p tabindex="0" class="vp-sidebar-item collapsible">从抛币协议到智能合约 <span class="right arrow"></span></p><ul style="display:none;" class="vp-sidebar-children"><!--[--><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/02/MentalPoker01.html" aria-label="Part1"><!--[--><!--[--><!--]--><!--]-->Part1<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/02/MentalPoker02.html" aria-label="Part2"><!--[--><!--[--><!--]--><!--]-->Part2<!--[--><!--[--><!--]--><!--]--></a><!----></li><!--]--></ul></li><li><p tabindex="0" class="vp-sidebar-item collapsible">JPEG算法解密 <span class="right arrow"></span></p><ul style="display:none;" class="vp-sidebar-children"><!--[--><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/02/JPEG001.html" aria-label="Part1"><!--[--><!--[--><!--]--><!--]-->Part1<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/02/JPEG002.html" aria-label="Part2"><!--[--><!--[--><!--]--><!--]-->Part2<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/02/JPEG003.html" aria-label="Part3"><!--[--><!--[--><!--]--><!--]-->Part3<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/02/JPEG004.html" aria-label="Part4"><!--[--><!--[--><!--]--><!--]-->Part4<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/02/JPEG005.html" aria-label="Part5"><!--[--><!--[--><!--]--><!--]-->Part5<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="auto-link external-link vp-sidebar-item" href="http://github.com/thejinchao/jpeg_encoder" aria-label="Github" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->Github<!--[--><!--[--><!--]--><!--]--></a><!----></li><!--]--></ul></li><li><p tabindex="0" class="vp-sidebar-item collapsible">SPH算法简介 <span class="right arrow"></span></p><ul style="display:none;" class="vp-sidebar-children"><!--[--><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/02/SPH001.html" aria-label="Part1"><!--[--><!--[--><!--]--><!--]-->Part1<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/02/SPH002.html" aria-label="Part2"><!--[--><!--[--><!--]--><!--]-->Part2<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/02/SPH003.html" aria-label="Part3"><!--[--><!--[--><!--]--><!--]-->Part3<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/02/SPH004.html" aria-label="Part4"><!--[--><!--[--><!--]--><!--]-->Part4<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="auto-link external-link vp-sidebar-item" href="https://github.com/thejinchao/fluid" aria-label="Github" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->Github<!--[--><!--[--><!--]--><!--]--></a><!----></li><!--]--></ul></li><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/02/Martingle.html" aria-label="赌博中的数学:Martingle策略"><!--[--><!--[--><!--]--><!--]-->赌博中的数学:Martingle策略<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/02/RandRound.html" aria-label="如何生成一个随机的圆形"><!--[--><!--[--><!--]--><!--]-->如何生成一个随机的圆形<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link route-link-active auto-link vp-sidebar-item active" href="/blog/2025/02/DH.html" aria-label="一个简单的DH密钥协商算法的实现"><!--[--><!--[--><!--]--><!--]-->一个简单的DH密钥协商算法的实现<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/02/SegmentCircle.html" aria-label="如何计算线段和圆的交点"><!--[--><!--[--><!--]--><!--]-->如何计算线段和圆的交点<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/02/Ellipse.html" aria-label="一道数学趣题"><!--[--><!--[--><!--]--><!--]-->一道数学趣题<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/02/Fibonacci.html" aria-label="斐波那契数列和1/89"><!--[--><!--[--><!--]--><!--]-->斐波那契数列和1/89<!--[--><!--[--><!--]--><!--]--></a><!----></li><!--]--></ul></li><li><p tabindex="0" class="vp-sidebar-item vp-sidebar-heading collapsible">开源项目 <span class="right arrow"></span></p><ul style="display:none;" class="vp-sidebar-children"><!--[--><li><a class="auto-link external-link vp-sidebar-item" href="https://github.com/thejinchao/turbolink" aria-label="TurboLink" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->TurboLink<!--[--><!--[--><!--]--><!--]--></a><!----></li><!--]--></ul></li><li><p tabindex="0" class="vp-sidebar-item vp-sidebar-heading collapsible">学习笔记 <span class="right arrow"></span></p><ul style="display:none;" class="vp-sidebar-children"><!--[--><li><p tabindex="0" class="vp-sidebar-item collapsible">数学相关 <span class="right arrow"></span></p><ul style="display:none;" class="vp-sidebar-children"><!--[--><li><a class="route-link auto-link vp-sidebar-item" href="/note/math/symbol.html" aria-label="常用数学符号"><!--[--><!--[--><!--]--><!--]-->常用数学符号<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/math/group.html" aria-label="群"><!--[--><!--[--><!--]--><!--]-->群<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/math/number_theory_1.html" aria-label="数论(一)"><!--[--><!--[--><!--]--><!--]-->数论(一)<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/math/number_theory_2.html" aria-label="数论(二)"><!--[--><!--[--><!--]--><!--]-->数论(二)<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/math/number_theory_3.html" aria-label="数论(三)"><!--[--><!--[--><!--]--><!--]-->数论(三)<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/math/probability.html" aria-label="概率"><!--[--><!--[--><!--]--><!--]-->概率<!--[--><!--[--><!--]--><!--]--></a><!----></li><!--]--></ul></li><li><p tabindex="0" class="vp-sidebar-item collapsible">密码学 <span class="right arrow"></span></p><ul style="display:none;" class="vp-sidebar-children"><!--[--><li><a class="route-link auto-link vp-sidebar-item" href="/note/cryptography/rsa.html" aria-label="RSA"><!--[--><!--[--><!--]--><!--]-->RSA<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/cryptography/flip_coin.html" aria-label="抛币协议"><!--[--><!--[--><!--]--><!--]-->抛币协议<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/cryptography/mental_poker.html" aria-label="智能扑克协议"><!--[--><!--[--><!--]--><!--]-->智能扑克协议<!--[--><!--[--><!--]--><!--]--></a><!----></li><!--]--></ul></li><li><p tabindex="0" class="vp-sidebar-item collapsible">图形学 <span class="right arrow"></span></p><ul style="display:none;" class="vp-sidebar-children"><!--[--><li><p tabindex="0" class="vp-sidebar-item collapsible">数学基础 <span class="right arrow"></span></p><ul style="display:none;" class="vp-sidebar-children"><!--[--><li><a class="route-link auto-link vp-sidebar-item" href="/note/graphics/math/math_01.html" aria-label="矢量"><!--[--><!--[--><!--]--><!--]-->矢量<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/graphics/math/math_02.html" aria-label="矩阵"><!--[--><!--[--><!--]--><!--]-->矩阵<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/graphics/math/math_03.html" aria-label="立体角"><!--[--><!--[--><!--]--><!--]-->立体角<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/graphics/math/transform_01.html" aria-label="几何变换(一)"><!--[--><!--[--><!--]--><!--]-->几何变换(一)<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/graphics/math/transform_02.html" aria-label="几何变换(二)"><!--[--><!--[--><!--]--><!--]-->几何变换(二)<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/graphics/math/transform_03.html" aria-label="法线变换"><!--[--><!--[--><!--]--><!--]-->法线变换<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/graphics/math/transform_04.html" aria-label="摄像机变换"><!--[--><!--[--><!--]--><!--]-->摄像机变换<!--[--><!--[--><!--]--><!--]--></a><!----></li><!--]--></ul></li><li><p tabindex="0" class="vp-sidebar-item collapsible">光照模型 <span class="right arrow"></span></p><ul style="display:none;" class="vp-sidebar-children"><!--[--><li><a class="route-link auto-link vp-sidebar-item" href="/note/graphics/illumination_model/luminosity/luminosity.html" aria-label="光度学"><!--[--><!--[--><!--]--><!--]-->光度学<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/graphics/illumination_model/BRDF/BRDF.html" aria-label="双向反射分布函数(BRDF)"><!--[--><!--[--><!--]--><!--]-->双向反射分布函数(BRDF)<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/graphics/illumination_model/microfacets/microfacets_1.html" aria-label="微平面理论(一)"><!--[--><!--[--><!--]--><!--]-->微平面理论(一)<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/graphics/illumination_model/microfacets/microfacets_2.html" aria-label="微平面理论(二)"><!--[--><!--[--><!--]--><!--]-->微平面理论(二)<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/graphics/illumination_model/microfacets/microfacets_3.html" aria-label="微平面理论(三)"><!--[--><!--[--><!--]--><!--]-->微平面理论(三)<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/graphics/illumination_model/render_function/render_function_1.html" aria-label="光照方程"><!--[--><!--[--><!--]--><!--]-->光照方程<!--[--><!--[--><!--]--><!--]--></a><!----></li><!--]--></ul></li><li><p tabindex="0" class="vp-sidebar-item collapsible">环境光渲染 <span class="right arrow"></span></p><ul style="display:none;" class="vp-sidebar-children"><!--[--><li><a class="route-link auto-link vp-sidebar-item" href="/note/graphics/image_based_lighting/ibl_01.html" aria-label="环境光渲染(一)"><!--[--><!--[--><!--]--><!--]-->环境光渲染(一)<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/graphics/image_based_lighting/ibl_02.html" aria-label="环境光渲染(二)"><!--[--><!--[--><!--]--><!--]-->环境光渲染(二)<!--[--><!--[--><!--]--><!--]--></a><!----></li><!--]--></ul></li><!--]--></ul></li><li><p tabindex="0" class="vp-sidebar-item collapsible">编程语言 <span class="right arrow"></span></p><ul style="display:none;" class="vp-sidebar-children"><!--[--><li><p tabindex="0" class="vp-sidebar-item collapsible">JavaScript <span class="right arrow"></span></p><ul style="display:none;" class="vp-sidebar-children"><!--[--><li><a class="route-link auto-link vp-sidebar-item" href="/note/language/javascript/helloworld.html" aria-label="环境搭建"><!--[--><!--[--><!--]--><!--]-->环境搭建<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/language/javascript/grammar.html" aria-label="基本语法"><!--[--><!--[--><!--]--><!--]-->基本语法<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/language/javascript/function.html" aria-label="函数"><!--[--><!--[--><!--]--><!--]-->函数<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/language/javascript/object_and_class.html" aria-label="对象和类"><!--[--><!--[--><!--]--><!--]-->对象和类<!--[--><!--[--><!--]--><!--]--></a><!----></li><!--]--></ul></li><!--]--></ul></li><!--]--></ul></li><!--]--></ul><!--[--><!--]--></aside><!--]--><!--[--><main class="vp-page"><!--[--><!--]--><div vp-content><!--[--><!--]--><div><h1 id="一个简单的dh密钥协商算法的实现" tabindex="-1"><a class="header-anchor" href="#一个简单的dh密钥协商算法的实现"><span>一个简单的DH密钥协商算法的实现</span></a></h1><p>密码的管理可以说是加密体系中最为性命攸关的问题,在计算机发明之前,加密方法只能使用简单的移位、查表等简单的方法,这种级别的加密算法,基本上都无法逃脱被破解的命运,比如二战中德国发明的“英格玛”可以说是前计算机时代人类所发明的最为复杂的加密方法了,但以图灵为首的盟军科学家们,仍然可以用粗暴的暴力破解法硬生生从密文中破解出原文出来。<br> 进入计算机时代后,加密算法的复杂度有了质的飞跃,相对应的破解难度也不断加大,到了如今,像AES这样变态的加密算法,已经比英格玛不知复杂了多少个数量级,在没有密码的情况下,想直接从密文中破解出明文,即使图灵重生也全无可能了。于是,密钥本身的管理变成了加密环节中最脆弱的环节,“如何安全的把密码告诉别人”成了一个难题,比如,如果你需要发给同事一封包含加密附件的邮件,一般都会把密码放在另外一封邮件中发送,或者用其他方式告诉他,尽管这样做也并不安全,但总比那种傻乎乎的把密码和加密附件直接放在一起强多了。<br> 1976年,美国的两位数学家<a href="http://en.wikipedia.org/wiki/Whitfield_Diffie" target="_blank" rel="noopener noreferrer">Whitfield Diffie</a>和<a href="http://en.wikipedia.org/wiki/Martin_Hellman" target="_blank" rel="noopener noreferrer">Martin Hellman</a>率先发表了一种解决该密钥传输的方法,因此这种方法被大家称为<a href="http://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange" target="_blank" rel="noopener noreferrer">Diffie–Hellman key exchange</a>算法,这种算法提出这么一个做法:“在加密通讯之前双方各自生成密码的一部分,然后互换后合成起来,作为最终的密码”。这就是密钥协商,维基百科上使用了一个很有趣的比喻,就是颜料的混合:<br> 设想这样一个场景,Alice(A)和Bob(B),他们想在不见面的情况下秘密约定出一种颜色,但他们互相沟通的信息都会被公开,应该怎么办呢?</p><table class="gridtable" style="width:100%;text-align:center;border-collapse:collapse;"><tbody><tr><th rowspan="2" width="20%"></th><th colspan="2" style="text-align:center;">Alice</th><th rowspan="2" width="15%"></th><th colspan="2" style="text-align:center;">Bob</th></tr><tr><th style="text-align:center;">私密信息</th><th style="text-align:center;">公开信息</th><th style="text-align:center;">公开信息</th><th style="text-align:center;">私密信息</th></tr><tr><td style="vertical-align:middle;">A和B首先约定好公开的一种颜色,比如黄色</td><td></td><td><img src="/images/2015/05/dh_01.png"></td><td></td><td><img src="/images/2015/05/dh_01.png"></td><td></td></tr><tr><td style="vertical-align:middle;">A,B各自挑选出一种私密的颜色,比如橙色和兰色</td><td><img src="/images/2015/05/dh_02.png"></td><td></td><td></td><td></td><td><img src="/images/2015/05/dh_03.png"></td></tr><tr><td style="vertical-align:middle;">A,B各自将两种颜色混合起来</td><td><img src="/images/2015/05/dh_01_add_02.png"></td><td><img src="/images/2015/05/dh_04.png"></td><td></td><td><img src="/images/2015/05/dh_05.png"></td><td><img src="/images/2015/05/dh_01_add_03.png"></td></tr><tr><td></td><td></td><td></td><td><img src="/images/2015/05/dh_07.png"></td><td></td><td></td></tr><tr><td style="vertical-align:middle;">双方交换混合后的颜色</td><td></td><td><img src="/images/2015/05/dh_05.png"></td><td></td><td><img src="/images/2015/05/dh_04.png"></td><td></td></tr><tr><td style="vertical-align:middle;">A,B各自将自己的私密颜色再次混入得到的颜色中</td><td><img src="/images/2015/05/dh_05_add_02.png"></td><td></td><td></td><td></td><td><img src="/images/2015/05/dh_04_add_03.png"></td></tr><tr><td style="vertical-align:middle;">现在A,B得到了一种相同的颜色,这种颜色是由一份黄色、一份橙色、一份兰色混合而来,但外界无法得知</td><td><img src="/images/2015/05/dh_08.png"></td><td></td><td></td><td></td><td><img src="/images/2015/05/dh_08.png"></td></tr></tbody></table><p>秘密在于,颜色混合是一种“不可逆”的操作,当双方交换颜色时,尽管我们知道他们交换的颜色都是由一份黄色和另一份其他颜色混合得到的,但我们还是无法或者很难得到他们的私密颜色。而DH秘钥交换的原理非常相似,也是利用了数学上的一个“不可逆”的运算,就是离散对数(Discrete logarithm)<br> 乘方得逆运算称为对数运算,比如已知<mjx-container class="MathJax" jax="CHTML" style="position:relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-msup><mjx-mn class="mjx-n"><mjx-c class="mjx-c37"></mjx-c></mjx-mn><mjx-script style="vertical-align:0.363em;"><mjx-mi class="mjx-i" size="s"><mjx-c class="mjx-c1D465 TEX-I"></mjx-c></mjx-mi></mjx-script></mjx-msup><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c3D"></mjx-c></mjx-mo><mjx-mn class="mjx-n" space="4"><mjx-c class="mjx-c34"></mjx-c><mjx-c class="mjx-c39"></mjx-c></mjx-mn></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><msup><mn>7</mn><mi>x</mi></msup><mo>=</mo><mn>49</mn></math></mjx-assistive-mml></mjx-container>,那么可知<mjx-container class="MathJax" jax="CHTML" style="position:relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D465 TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c3D"></mjx-c></mjx-mo><mjx-mi class="mjx-i" space="4"><mjx-c class="mjx-c1D459 TEX-I"></mjx-c></mjx-mi><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D45C TEX-I"></mjx-c></mjx-mi><mjx-msub><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D454 TEX-I"></mjx-c></mjx-mi><mjx-script style="vertical-align:-0.15em;"><mjx-mn class="mjx-n" size="s"><mjx-c class="mjx-c37"></mjx-c></mjx-mn></mjx-script></mjx-msub><mjx-mn class="mjx-n"><mjx-c class="mjx-c34"></mjx-c><mjx-c class="mjx-c39"></mjx-c></mjx-mn><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c3D"></mjx-c></mjx-mo><mjx-mn class="mjx-n" space="4"><mjx-c class="mjx-c32"></mjx-c></mjx-mn></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>x</mi><mo>=</mo><mi>l</mi><mi>o</mi><msub><mi>g</mi><mn>7</mn></msub><mn>49</mn><mo>=</mo><mn>2</mn></math></mjx-assistive-mml></mjx-container>, 对数运算非常容易,即使在数字很大的时候是,但如果是下面的情况</p><mjx-container class="MathJax" jax="CHTML" display="true" style="position:relative;"><mjx-math display="true" style="margin-left:0;margin-right:0;" class="MJX-TEX" aria-hidden="true"><mjx-msup><mjx-mn class="mjx-n"><mjx-c class="mjx-c37"></mjx-c></mjx-mn><mjx-script style="vertical-align:0.413em;"><mjx-mi class="mjx-i" size="s"><mjx-c class="mjx-c1D465 TEX-I"></mjx-c></mjx-mi></mjx-script></mjx-msup><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mn class="mjx-n"><mjx-c class="mjx-c31"></mjx-c><mjx-c class="mjx-c33"></mjx-c></mjx-mn><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c3D"></mjx-c></mjx-mo><mjx-mn class="mjx-n" space="4"><mjx-c class="mjx-c38"></mjx-c></mjx-mn></mjx-math><mjx-assistive-mml unselectable="on" display="block"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><msup><mn>7</mn><mi>x</mi></msup><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mn>13</mn><mo>=</mo><mn>8</mn></math></mjx-assistive-mml></mjx-container><p>求X的过程称为“离散对数”,就不那么容易了,在数字很大时几乎是一个不可能的运算,而DH秘钥交换就是利用了这种离散对数计算非常困难的特性来设计的。公式里的mod是取模运算,取模运算有几条基本的定律如下</p><mjx-container class="MathJax" jax="CHTML" display="true" style="position:relative;"><mjx-math display="true" style="margin-left:0;margin-right:0;" class="MJX-TEX" aria-hidden="true"><mjx-mtable style="min-width:20.033em;"><mjx-table><mjx-itable><mjx-mtr><mjx-mtd style="text-align:right;padding-right:0;padding-bottom:0.15em;"><mjx-mo class="mjx-n"><mjx-c class="mjx-c28"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D44E TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n" space="3"><mjx-c class="mjx-c2B"></mjx-c></mjx-mo><mjx-mi class="mjx-i" space="3"><mjx-c class="mjx-c1D44F TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n"><mjx-c class="mjx-c29"></mjx-c></mjx-mo><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D443 TEX-I"></mjx-c></mjx-mi><mjx-tstrut></mjx-tstrut></mjx-mtd><mjx-mtd style="text-align:left;padding-left:0;padding-bottom:0.15em;"><mjx-mi class="mjx-n"></mjx-mi><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c3D"></mjx-c></mjx-mo><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c28"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D44E TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D443 TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n" space="3"><mjx-c class="mjx-c2B"></mjx-c></mjx-mo><mjx-mi class="mjx-i" space="3"><mjx-c class="mjx-c1D44F TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D443 TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n"><mjx-c class="mjx-c29"></mjx-c></mjx-mo><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D443 TEX-I"></mjx-c></mjx-mi><mjx-tstrut></mjx-tstrut></mjx-mtd></mjx-mtr><mjx-mtr><mjx-mtd style="text-align:right;padding-right:0;padding-top:0.15em;padding-bottom:0.15em;"><mjx-mo class="mjx-n"><mjx-c class="mjx-c28"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D44E TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n" space="3"><mjx-c class="mjx-c2217"></mjx-c></mjx-mo><mjx-mi class="mjx-i" space="3"><mjx-c class="mjx-c1D44F TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n"><mjx-c class="mjx-c29"></mjx-c></mjx-mo><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D443 TEX-I"></mjx-c></mjx-mi><mjx-tstrut></mjx-tstrut></mjx-mtd><mjx-mtd style="text-align:left;padding-left:0;padding-top:0.15em;padding-bottom:0.15em;"><mjx-mi class="mjx-n"></mjx-mi><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c3D"></mjx-c></mjx-mo><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c28"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D44E TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D443 TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n" space="3"><mjx-c class="mjx-c2217"></mjx-c></mjx-mo><mjx-mi class="mjx-i" space="3"><mjx-c class="mjx-c1D44F TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D443 TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n"><mjx-c class="mjx-c29"></mjx-c></mjx-mo><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D443 TEX-I"></mjx-c></mjx-mi><mjx-tstrut></mjx-tstrut></mjx-mtd></mjx-mtr><mjx-mtr><mjx-mtd style="text-align:right;padding-right:0;padding-top:0.15em;"><mjx-mo class="mjx-n"><mjx-c class="mjx-c28"></mjx-c></mjx-mo><mjx-msup><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D44E TEX-I"></mjx-c></mjx-mi><mjx-script style="vertical-align:0.413em;"><mjx-mi class="mjx-i" size="s"><mjx-c class="mjx-c1D44F TEX-I"></mjx-c></mjx-mi></mjx-script></mjx-msup><mjx-mo class="mjx-n"><mjx-c class="mjx-c29"></mjx-c></mjx-mo><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D443 TEX-I"></mjx-c></mjx-mi><mjx-tstrut></mjx-tstrut></mjx-mtd><mjx-mtd style="text-align:left;padding-left:0;padding-top:0.15em;"><mjx-mi class="mjx-n"></mjx-mi><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c3D"></mjx-c></mjx-mo><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c28"></mjx-c></mjx-mo><mjx-mo class="mjx-n"><mjx-c class="mjx-c28"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D44E TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D443 TEX-I"></mjx-c></mjx-mi><mjx-msup><mjx-mo class="mjx-n"><mjx-c class="mjx-c29"></mjx-c></mjx-mo><mjx-script style="vertical-align:0.413em;"><mjx-mi class="mjx-i" size="s"><mjx-c class="mjx-c1D44F TEX-I"></mjx-c></mjx-mi></mjx-script></mjx-msup><mjx-mo class="mjx-n"><mjx-c class="mjx-c29"></mjx-c></mjx-mo><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D443 TEX-I"></mjx-c></mjx-mi><mjx-tstrut></mjx-tstrut></mjx-mtd></mjx-mtr></mjx-itable></mjx-table></mjx-mtable></mjx-math><mjx-assistive-mml unselectable="on" display="block"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mtable displaystyle="true" columnalign="right left" columnspacing="0em" rowspacing="3pt"><mtr><mtd><mo stretchy="false">(</mo><mi>a</mi><mo>+</mo><mi>b</mi><mo stretchy="false">)</mo><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mi>P</mi></mtd><mtd><mi></mi><mo>=</mo><mo stretchy="false">(</mo><mi>a</mi><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mi>P</mi><mo>+</mo><mi>b</mi><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mi>P</mi><mo stretchy="false">)</mo><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mi>P</mi></mtd></mtr><mtr><mtd><mo stretchy="false">(</mo><mi>a</mi><mo>∗</mo><mi>b</mi><mo stretchy="false">)</mo><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mi>P</mi></mtd><mtd><mi></mi><mo>=</mo><mo stretchy="false">(</mo><mi>a</mi><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mi>P</mi><mo>∗</mo><mi>b</mi><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mi>P</mi><mo stretchy="false">)</mo><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mi>P</mi></mtd></mtr><mtr><mtd><mo stretchy="false">(</mo><msup><mi>a</mi><mi>b</mi></msup><mo stretchy="false">)</mo><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mi>P</mi></mtd><mtd><mi></mi><mo>=</mo><mo stretchy="false">(</mo><mo stretchy="false">(</mo><mi>a</mi><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mi>P</mi><msup><mo stretchy="false">)</mo><mi>b</mi></msup><mo stretchy="false">)</mo><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mi>P</mi></mtd></mtr></mtable></math></mjx-assistive-mml></mjx-container><p>根据上面的公式,可以推导出一个非常重要的公式</p><mjx-container class="MathJax" jax="CHTML" display="true" style="position:relative;"><mjx-math display="true" style="margin-left:0;margin-right:0;" class="MJX-TEX" aria-hidden="true"><mjx-mo class="mjx-n"><mjx-c class="mjx-c28"></mjx-c></mjx-mo><mjx-msup><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D43A TEX-I"></mjx-c></mjx-mi><mjx-script style="vertical-align:0.413em;"><mjx-TeXAtom size="s" texclass="ORD"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D44E TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n"><mjx-c class="mjx-c2217"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D44F TEX-I"></mjx-c></mjx-mi></mjx-TeXAtom></mjx-script></mjx-msup><mjx-mo class="mjx-n"><mjx-c class="mjx-c29"></mjx-c></mjx-mo><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D443 TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c3D"></mjx-c></mjx-mo><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c28"></mjx-c></mjx-mo><mjx-msup><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D43A TEX-I"></mjx-c></mjx-mi><mjx-script style="vertical-align:0.413em;"><mjx-mi class="mjx-i" size="s"><mjx-c class="mjx-c1D44E TEX-I"></mjx-c></mjx-mi></mjx-script></mjx-msup><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D443 TEX-I"></mjx-c></mjx-mi><mjx-msup><mjx-mo class="mjx-n"><mjx-c class="mjx-c29"></mjx-c></mjx-mo><mjx-script style="vertical-align:0.413em;"><mjx-mi class="mjx-i" size="s"><mjx-c class="mjx-c1D44F TEX-I"></mjx-c></mjx-mi></mjx-script></mjx-msup><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D443 TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c3D"></mjx-c></mjx-mo><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c28"></mjx-c></mjx-mo><mjx-msup><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D43A TEX-I"></mjx-c></mjx-mi><mjx-script style="vertical-align:0.413em;"><mjx-mi class="mjx-i" size="s"><mjx-c class="mjx-c1D44F TEX-I"></mjx-c></mjx-mi></mjx-script></mjx-msup><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D443 TEX-I"></mjx-c></mjx-mi><mjx-msup><mjx-mo class="mjx-n"><mjx-c class="mjx-c29"></mjx-c></mjx-mo><mjx-script style="vertical-align:0.413em;"><mjx-mi class="mjx-i" size="s"><mjx-c class="mjx-c1D44E TEX-I"></mjx-c></mjx-mi></mjx-script></mjx-msup><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D443 TEX-I"></mjx-c></mjx-mi></mjx-math><mjx-assistive-mml unselectable="on" display="block"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mo stretchy="false">(</mo><msup><mi>G</mi><mrow data-mjx-texclass="ORD"><mi>a</mi><mo>∗</mo><mi>b</mi></mrow></msup><mo stretchy="false">)</mo><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mi>P</mi><mo>=</mo><mo stretchy="false">(</mo><msup><mi>G</mi><mi>a</mi></msup><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mi>P</mi><msup><mo stretchy="false">)</mo><mi>b</mi></msup><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mi>P</mi><mo>=</mo><mo stretchy="false">(</mo><msup><mi>G</mi><mi>b</mi></msup><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mi>P</mi><msup><mo stretchy="false">)</mo><mi>a</mi></msup><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mi>P</mi></math></mjx-assistive-mml></mjx-container><p>根据这个公式,我们可以向上面交换颜色那样设计出一个秘密交换数字的流程出来</p><table class="gridtable" style="width:100%;text-align:center;border-collapse:collapse;"><tbody><tr><th rowspan="2" width="40%"></th><th colspan="2" style="text-align:center;">Alice</th><th rowspan="2"></th><th colspan="2" style="text-align:center;">Bob</th></tr><tr><th style="text-align:center;">私密信息</th><th style="text-align:center;">公开信息</th><th style="text-align:center;">公开信息</th><th style="text-align:center;">私密信息</th></tr><tr><td style="vertical-align:middle;">A和B首先约定两个公开的质数p和g</td><td></td><td><p><mjx-container class="MathJax" jax="CHTML" style="position:relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D45D TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n"><mjx-c class="mjx-c2C"></mjx-c></mjx-mo><mjx-mi class="mjx-i" space="2"><mjx-c class="mjx-c1D454 TEX-I"></mjx-c></mjx-mi></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>p</mi><mo>,</mo><mi>g</mi></math></mjx-assistive-mml></mjx-container></p></td><td></td><td><p><mjx-container class="MathJax" jax="CHTML" style="position:relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D45D TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n"><mjx-c class="mjx-c2C"></mjx-c></mjx-mo><mjx-mi class="mjx-i" space="2"><mjx-c class="mjx-c1D454 TEX-I"></mjx-c></mjx-mi></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>p</mi><mo>,</mo><mi>g</mi></math></mjx-assistive-mml></mjx-container></p></td><td></td></tr><tr><td style="vertical-align:middle;">A和B各自随机产生两个数a,b,作为自己的私钥</td><td><p><mjx-container class="MathJax" jax="CHTML" style="position:relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D44E TEX-I"></mjx-c></mjx-mi></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>a</mi></math></mjx-assistive-mml></mjx-container></p></td><td></td><td></td><td></td><td><p><mjx-container class="MathJax" jax="CHTML" style="position:relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D44F TEX-I"></mjx-c></mjx-mi></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>b</mi></math></mjx-assistive-mml></mjx-container></p></td></tr><tr><td style="vertical-align:middle;">各自计算出自己的公钥A,B</td><td></td><td><p><mjx-container class="MathJax" jax="CHTML" style="position:relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mstyle size="sm"><mjx-TeXAtom texclass="ORD"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D434 TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c3D"></mjx-c></mjx-mo><mjx-msup space="4"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D454 TEX-I"></mjx-c></mjx-mi><mjx-script style="vertical-align:0.363em;"><mjx-mi class="mjx-i" size="s"><mjx-c class="mjx-c1D44E TEX-I"></mjx-c></mjx-mi></mjx-script></mjx-msup><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D45D TEX-I"></mjx-c></mjx-mi></mjx-TeXAtom></mjx-mstyle></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mstyle mathsize="0.85em"><mrow data-mjx-texclass="ORD"><mi>A</mi><mo>=</mo><msup><mi>g</mi><mi>a</mi></msup><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mi>p</mi></mrow></mstyle></math></mjx-assistive-mml></mjx-container></p></td><td></td><td><p><mjx-container class="MathJax" jax="CHTML" style="position:relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mstyle size="sm"><mjx-TeXAtom texclass="ORD"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D435 TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c3D"></mjx-c></mjx-mo><mjx-msup space="4"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D454 TEX-I"></mjx-c></mjx-mi><mjx-script style="vertical-align:0.363em;"><mjx-mi class="mjx-i" size="s"><mjx-c class="mjx-c1D44F TEX-I"></mjx-c></mjx-mi></mjx-script></mjx-msup><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D45D TEX-I"></mjx-c></mjx-mi></mjx-TeXAtom></mjx-mstyle></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mstyle mathsize="0.85em"><mrow data-mjx-texclass="ORD"><mi>B</mi><mo>=</mo><msup><mi>g</mi><mi>b</mi></msup><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mi>p</mi></mrow></mstyle></math></mjx-assistive-mml></mjx-container></p></td><td></td></tr><tr><td style="vertical-align:middle;">交换公钥A,B</td><td></td><td><p><mjx-container class="MathJax" jax="CHTML" style="position:relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mstyle size="sm"><mjx-TeXAtom texclass="ORD"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D435 TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c3D"></mjx-c></mjx-mo><mjx-msup space="4"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D454 TEX-I"></mjx-c></mjx-mi><mjx-script style="vertical-align:0.363em;"><mjx-mi class="mjx-i" size="s"><mjx-c class="mjx-c1D44F TEX-I"></mjx-c></mjx-mi></mjx-script></mjx-msup><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D45D TEX-I"></mjx-c></mjx-mi></mjx-TeXAtom></mjx-mstyle></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mstyle mathsize="0.85em"><mrow data-mjx-texclass="ORD"><mi>B</mi><mo>=</mo><msup><mi>g</mi><mi>b</mi></msup><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mi>p</mi></mrow></mstyle></math></mjx-assistive-mml></mjx-container></p></td><td></td><td><p><mjx-container class="MathJax" jax="CHTML" style="position:relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mstyle size="sm"><mjx-TeXAtom texclass="ORD"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D434 TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c3D"></mjx-c></mjx-mo><mjx-msup space="4"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D454 TEX-I"></mjx-c></mjx-mi><mjx-script style="vertical-align:0.363em;"><mjx-mi class="mjx-i" size="s"><mjx-c class="mjx-c1D44E TEX-I"></mjx-c></mjx-mi></mjx-script></mjx-msup><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D45D TEX-I"></mjx-c></mjx-mi></mjx-TeXAtom></mjx-mstyle></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mstyle mathsize="0.85em"><mrow data-mjx-texclass="ORD"><mi>A</mi><mo>=</mo><msup><mi>g</mi><mi>a</mi></msup><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mi>p</mi></mrow></mstyle></math></mjx-assistive-mml></mjx-container></p></td><td></td></tr><tr><td style="vertical-align:middle;">计算出加密用的密钥S</td><td><mjx-container class="MathJax" jax="CHTML" display="true" style="position:relative;"><mjx-math display="true" style="margin-left:0;margin-right:0;" class="MJX-TEX" aria-hidden="true"><mjx-mstyle size="sm"><mjx-TeXAtom texclass="ORD"><mjx-mtable style="min-width:10.397em;"><mjx-table><mjx-itable><mjx-mtr><mjx-mtd style="text-align:right;padding-right:0;padding-bottom:0.15em;"><mjx-msub><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D446 TEX-I"></mjx-c></mjx-mi><mjx-script style="vertical-align:-0.15em;margin-left:-0.032em;"><mjx-mi class="mjx-i" size="s"><mjx-c class="mjx-c1D44E TEX-I"></mjx-c></mjx-mi></mjx-script></mjx-msub><mjx-tstrut></mjx-tstrut></mjx-mtd><mjx-mtd style="text-align:left;padding-left:0;padding-bottom:0.15em;"><mjx-mi class="mjx-n"></mjx-mi><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c3D"></mjx-c></mjx-mo><mjx-msup space="4"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D435 TEX-I"></mjx-c></mjx-mi><mjx-script style="vertical-align:0.413em;"><mjx-mi class="mjx-i" size="s"><mjx-c class="mjx-c1D44E TEX-I"></mjx-c></mjx-mi></mjx-script></mjx-msup><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D45D TEX-I"></mjx-c></mjx-mi><mjx-tstrut></mjx-tstrut></mjx-mtd></mjx-mtr><mjx-mtr><mjx-mtd style="text-align:right;padding-right:0;padding-top:0.15em;padding-bottom:0.15em;"><mjx-tstrut></mjx-tstrut></mjx-mtd><mjx-mtd style="text-align:left;padding-left:0;padding-top:0.15em;padding-bottom:0.15em;"><mjx-mi class="mjx-n"></mjx-mi><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c3D"></mjx-c></mjx-mo><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c28"></mjx-c></mjx-mo><mjx-msup><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D454 TEX-I"></mjx-c></mjx-mi><mjx-script style="vertical-align:0.413em;"><mjx-mi class="mjx-i" size="s"><mjx-c class="mjx-c1D44F TEX-I"></mjx-c></mjx-mi></mjx-script></mjx-msup><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D45D TEX-I"></mjx-c></mjx-mi><mjx-msup><mjx-mo class="mjx-n"><mjx-c class="mjx-c29"></mjx-c></mjx-mo><mjx-script style="vertical-align:0.413em;"><mjx-mi class="mjx-i" size="s"><mjx-c class="mjx-c1D44E TEX-I"></mjx-c></mjx-mi></mjx-script></mjx-msup><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D45D TEX-I"></mjx-c></mjx-mi><mjx-tstrut></mjx-tstrut></mjx-mtd></mjx-mtr><mjx-mtr><mjx-mtd style="text-align:right;padding-right:0;padding-top:0.15em;"><mjx-tstrut></mjx-tstrut></mjx-mtd><mjx-mtd style="text-align:left;padding-left:0;padding-top:0.15em;"><mjx-mi class="mjx-n"></mjx-mi><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c3D"></mjx-c></mjx-mo><mjx-msup space="4"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D454 TEX-I"></mjx-c></mjx-mi><mjx-script style="vertical-align:0.413em;"><mjx-TeXAtom size="s" texclass="ORD"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D44E TEX-I"></mjx-c></mjx-mi><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D44F TEX-I"></mjx-c></mjx-mi></mjx-TeXAtom></mjx-script></mjx-msup><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D45D TEX-I"></mjx-c></mjx-mi><mjx-tstrut></mjx-tstrut></mjx-mtd></mjx-mtr></mjx-itable></mjx-table></mjx-mtable></mjx-TeXAtom></mjx-mstyle></mjx-math><mjx-assistive-mml unselectable="on" display="block"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mstyle mathsize="0.85em"><mrow data-mjx-texclass="ORD"><mtable displaystyle="true" columnalign="right left" columnspacing="0em" rowspacing="3pt"><mtr><mtd><msub><mi>S</mi><mi>a</mi></msub></mtd><mtd><mi></mi><mo>=</mo><msup><mi>B</mi><mi>a</mi></msup><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mi>p</mi></mtd></mtr><mtr><mtd></mtd><mtd><mi></mi><mo>=</mo><mo stretchy="false">(</mo><msup><mi>g</mi><mi>b</mi></msup><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mi>p</mi><msup><mo stretchy="false">)</mo><mi>a</mi></msup><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mi>p</mi></mtd></mtr><mtr><mtd></mtd><mtd><mi></mi><mo>=</mo><msup><mi>g</mi><mrow data-mjx-texclass="ORD"><mi>a</mi><mi>b</mi></mrow></msup><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mi>p</mi></mtd></mtr></mtable></mrow></mstyle></math></mjx-assistive-mml></mjx-container></td><td></td><td></td><td></td><td><mjx-container class="MathJax" jax="CHTML" display="true" style="position:relative;"><mjx-math display="true" style="margin-left:0;margin-right:0;" class="MJX-TEX" aria-hidden="true"><mjx-mstyle size="sm"><mjx-TeXAtom texclass="ORD"><mjx-mtable style="min-width:10.326em;"><mjx-table><mjx-itable><mjx-mtr><mjx-mtd style="text-align:right;padding-right:0;padding-bottom:0.15em;"><mjx-msub><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D446 TEX-I"></mjx-c></mjx-mi><mjx-script style="vertical-align:-0.15em;margin-left:-0.032em;"><mjx-mi class="mjx-i" size="s"><mjx-c class="mjx-c1D44F TEX-I"></mjx-c></mjx-mi></mjx-script></mjx-msub><mjx-tstrut></mjx-tstrut></mjx-mtd><mjx-mtd style="text-align:left;padding-left:0;padding-bottom:0.15em;"><mjx-mi class="mjx-n"></mjx-mi><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c3D"></mjx-c></mjx-mo><mjx-msup space="4"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D434 TEX-I"></mjx-c></mjx-mi><mjx-script style="vertical-align:0.413em;"><mjx-mi class="mjx-i" size="s"><mjx-c class="mjx-c1D44F TEX-I"></mjx-c></mjx-mi></mjx-script></mjx-msup><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D45D TEX-I"></mjx-c></mjx-mi><mjx-tstrut></mjx-tstrut></mjx-mtd></mjx-mtr><mjx-mtr><mjx-mtd style="text-align:right;padding-right:0;padding-top:0.15em;padding-bottom:0.15em;"><mjx-tstrut></mjx-tstrut></mjx-mtd><mjx-mtd style="text-align:left;padding-left:0;padding-top:0.15em;padding-bottom:0.15em;"><mjx-mi class="mjx-n"></mjx-mi><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c3D"></mjx-c></mjx-mo><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c28"></mjx-c></mjx-mo><mjx-msup><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D454 TEX-I"></mjx-c></mjx-mi><mjx-script style="vertical-align:0.413em;"><mjx-mi class="mjx-i" size="s"><mjx-c class="mjx-c1D44E TEX-I"></mjx-c></mjx-mi></mjx-script></mjx-msup><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D45D TEX-I"></mjx-c></mjx-mi><mjx-msup><mjx-mo class="mjx-n"><mjx-c class="mjx-c29"></mjx-c></mjx-mo><mjx-script style="vertical-align:0.413em;"><mjx-mi class="mjx-i" size="s"><mjx-c class="mjx-c1D44F TEX-I"></mjx-c></mjx-mi></mjx-script></mjx-msup><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D45D TEX-I"></mjx-c></mjx-mi><mjx-tstrut></mjx-tstrut></mjx-mtd></mjx-mtr><mjx-mtr><mjx-mtd style="text-align:right;padding-right:0;padding-top:0.15em;"><mjx-tstrut></mjx-tstrut></mjx-mtd><mjx-mtd style="text-align:left;padding-left:0;padding-top:0.15em;"><mjx-mi class="mjx-n"></mjx-mi><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c3D"></mjx-c></mjx-mo><mjx-msup space="4"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D454 TEX-I"></mjx-c></mjx-mi><mjx-script style="vertical-align:0.413em;"><mjx-TeXAtom size="s" texclass="ORD"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D44E TEX-I"></mjx-c></mjx-mi><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D44F TEX-I"></mjx-c></mjx-mi></mjx-TeXAtom></mjx-script></mjx-msup><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D45D TEX-I"></mjx-c></mjx-mi><mjx-tstrut></mjx-tstrut></mjx-mtd></mjx-mtr></mjx-itable></mjx-table></mjx-mtable></mjx-TeXAtom></mjx-mstyle></mjx-math><mjx-assistive-mml unselectable="on" display="block"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mstyle mathsize="0.85em"><mrow data-mjx-texclass="ORD"><mtable displaystyle="true" columnalign="right left" columnspacing="0em" rowspacing="3pt"><mtr><mtd><msub><mi>S</mi><mi>b</mi></msub></mtd><mtd><mi></mi><mo>=</mo><msup><mi>A</mi><mi>b</mi></msup><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mi>p</mi></mtd></mtr><mtr><mtd></mtd><mtd><mi></mi><mo>=</mo><mo stretchy="false">(</mo><msup><mi>g</mi><mi>a</mi></msup><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mi>p</mi><msup><mo stretchy="false">)</mo><mi>b</mi></msup><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mi>p</mi></mtd></mtr><mtr><mtd></mtd><mtd><mi></mi><mo>=</mo><msup><mi>g</mi><mrow data-mjx-texclass="ORD"><mi>a</mi><mi>b</mi></mrow></msup><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mi>p</mi></mtd></mtr></mtable></mrow></mstyle></math></mjx-assistive-mml></mjx-container></td></tr></tbody></table><p>最终两个人得到的秘密数字都是<mjx-container class="MathJax" jax="CHTML" style="position:relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-msup><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D454 TEX-I"></mjx-c></mjx-mi><mjx-script style="vertical-align:0.363em;"><mjx-TeXAtom size="s" texclass="ORD"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D44E TEX-I"></mjx-c></mjx-mi><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D44F TEX-I"></mjx-c></mjx-mi></mjx-TeXAtom></mjx-script></mjx-msup><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D45D TEX-I"></mjx-c></mjx-mi></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><msup><mi>g</mi><mrow data-mjx-texclass="ORD"><mi>a</mi><mi>b</mi></mrow></msup><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mi>p</mi></math></mjx-assistive-mml></mjx-container>,而窃听者仅从<mjx-container class="MathJax" jax="CHTML" style="position:relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D45D TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n"><mjx-c class="mjx-c2C"></mjx-c></mjx-mo><mjx-mi class="mjx-i" space="2"><mjx-c class="mjx-c1D454 TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n"><mjx-c class="mjx-c2C"></mjx-c></mjx-mo><mjx-mi class="mjx-i" space="2"><mjx-c class="mjx-c1D434 TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n"><mjx-c class="mjx-c2C"></mjx-c></mjx-mo><mjx-mi class="mjx-i" space="2"><mjx-c class="mjx-c1D435 TEX-I"></mjx-c></mjx-mi></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>p</mi><mo>,</mo><mi>g</mi><mo>,</mo><mi>A</mi><mo>,</mo><mi>B</mi></math></mjx-assistive-mml></mjx-container>四个公开信息,是无法得到这个秘密数字的。<br> 举个例子,假如</p><mjx-container class="MathJax" jax="CHTML" display="true" style="position:relative;"><mjx-math display="true" style="margin-left:0;margin-right:0;" class="MJX-TEX" aria-hidden="true"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D45D TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c3D"></mjx-c></mjx-mo><mjx-mn class="mjx-n" space="4"><mjx-c class="mjx-c32"></mjx-c><mjx-c class="mjx-c33"></mjx-c></mjx-mn><mjx-mo class="mjx-n"><mjx-c class="mjx-c2C"></mjx-c></mjx-mo><mjx-mi class="mjx-i" space="2"><mjx-c class="mjx-c1D454 TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c3D"></mjx-c></mjx-mo><mjx-mn class="mjx-n" space="4"><mjx-c class="mjx-c35"></mjx-c></mjx-mn></mjx-math><mjx-assistive-mml unselectable="on" display="block"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mi>p</mi><mo>=</mo><mn>23</mn><mo>,</mo><mi>g</mi><mo>=</mo><mn>5</mn></math></mjx-assistive-mml></mjx-container><p>Alice选取的秘密数字<mjx-container class="MathJax" jax="CHTML" style="position:relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D44E TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c3D"></mjx-c></mjx-mo><mjx-mn class="mjx-n" space="4"><mjx-c class="mjx-c36"></mjx-c></mjx-mn></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>a</mi><mo>=</mo><mn>6</mn></math></mjx-assistive-mml></mjx-container>, 那么</p><mjx-container class="MathJax" jax="CHTML" display="true" style="position:relative;"><mjx-math display="true" style="margin-left:0;margin-right:0;" class="MJX-TEX" aria-hidden="true"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D434 TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c3D"></mjx-c></mjx-mo><mjx-msup space="4"><mjx-mn class="mjx-n"><mjx-c class="mjx-c35"></mjx-c></mjx-mn><mjx-script style="vertical-align:0.413em;"><mjx-mn class="mjx-n" size="s"><mjx-c class="mjx-c36"></mjx-c></mjx-mn></mjx-script></mjx-msup><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mn class="mjx-n"><mjx-c class="mjx-c32"></mjx-c><mjx-c class="mjx-c33"></mjx-c></mjx-mn><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c3D"></mjx-c></mjx-mo><mjx-mn class="mjx-n" space="4"><mjx-c class="mjx-c38"></mjx-c></mjx-mn></mjx-math><mjx-assistive-mml unselectable="on" display="block"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mi>A</mi><mo>=</mo><msup><mn>5</mn><mn>6</mn></msup><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mn>23</mn><mo>=</mo><mn>8</mn></math></mjx-assistive-mml></mjx-container><p>Bob选取的秘密数字是<mjx-container class="MathJax" jax="CHTML" style="position:relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mn class="mjx-n"><mjx-c class="mjx-c31"></mjx-c><mjx-c class="mjx-c35"></mjx-c></mjx-mn></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>15</mn></math></mjx-assistive-mml></mjx-container>, 那么</p><mjx-container class="MathJax" jax="CHTML" display="true" style="position:relative;"><mjx-math display="true" style="margin-left:0;margin-right:0;" class="MJX-TEX" aria-hidden="true"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D435 TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c3D"></mjx-c></mjx-mo><mjx-msup space="4"><mjx-mn class="mjx-n"><mjx-c class="mjx-c35"></mjx-c></mjx-mn><mjx-script style="vertical-align:0.413em;"><mjx-TeXAtom size="s" texclass="ORD"><mjx-mn class="mjx-n"><mjx-c class="mjx-c31"></mjx-c><mjx-c class="mjx-c35"></mjx-c></mjx-mn></mjx-TeXAtom></mjx-script></mjx-msup><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mn class="mjx-n"><mjx-c class="mjx-c32"></mjx-c><mjx-c class="mjx-c33"></mjx-c></mjx-mn><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c3D"></mjx-c></mjx-mo><mjx-mn class="mjx-n" space="4"><mjx-c class="mjx-c31"></mjx-c><mjx-c class="mjx-c39"></mjx-c></mjx-mn></mjx-math><mjx-assistive-mml unselectable="on" display="block"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mi>B</mi><mo>=</mo><msup><mn>5</mn><mrow data-mjx-texclass="ORD"><mn>15</mn></mrow></msup><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mn>23</mn><mo>=</mo><mn>19</mn></math></mjx-assistive-mml></mjx-container><p>交换<mjx-container class="MathJax" jax="CHTML" style="position:relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D434 TEX-I"></mjx-c></mjx-mi></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>A</mi></math></mjx-assistive-mml></mjx-container>和<mjx-container class="MathJax" jax="CHTML" style="position:relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D435 TEX-I"></mjx-c></mjx-mi></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>B</mi></math></mjx-assistive-mml></mjx-container>后,Alice计算出的密钥</p><mjx-container class="MathJax" jax="CHTML" display="true" style="position:relative;"><mjx-math display="true" style="margin-left:0;margin-right:0;" class="MJX-TEX" aria-hidden="true"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D446 TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c3D"></mjx-c></mjx-mo><mjx-msup space="4"><mjx-mn class="mjx-n"><mjx-c class="mjx-c31"></mjx-c><mjx-c class="mjx-c39"></mjx-c></mjx-mn><mjx-script style="vertical-align:0.413em;"><mjx-mn class="mjx-n" size="s"><mjx-c class="mjx-c36"></mjx-c></mjx-mn></mjx-script></mjx-msup><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mn class="mjx-n"><mjx-c class="mjx-c32"></mjx-c><mjx-c class="mjx-c33"></mjx-c></mjx-mn><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c3D"></mjx-c></mjx-mo><mjx-mn class="mjx-n" space="4"><mjx-c class="mjx-c32"></mjx-c></mjx-mn></mjx-math><mjx-assistive-mml unselectable="on" display="block"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mi>S</mi><mo>=</mo><msup><mn>19</mn><mn>6</mn></msup><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mn>23</mn><mo>=</mo><mn>2</mn></math></mjx-assistive-mml></mjx-container><p>Bob计算出的密钥</p><mjx-container class="MathJax" jax="CHTML" display="true" style="position:relative;"><mjx-math display="true" style="margin-left:0;margin-right:0;" class="MJX-TEX" aria-hidden="true"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D446 TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c3D"></mjx-c></mjx-mo><mjx-msup space="4"><mjx-mn class="mjx-n"><mjx-c class="mjx-c38"></mjx-c></mjx-mn><mjx-script style="vertical-align:0.413em;"><mjx-TeXAtom size="s" texclass="ORD"><mjx-mn class="mjx-n"><mjx-c class="mjx-c31"></mjx-c><mjx-c class="mjx-c35"></mjx-c></mjx-mn></mjx-TeXAtom></mjx-script></mjx-msup><mjx-mo class="mjx-n" space="4" rspace="4"><mjx-c class="mjx-c6D"></mjx-c><mjx-c class="mjx-c6F"></mjx-c><mjx-c class="mjx-c64"></mjx-c></mjx-mo><mjx-mn class="mjx-n"><mjx-c class="mjx-c32"></mjx-c><mjx-c class="mjx-c33"></mjx-c></mjx-mn><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c3D"></mjx-c></mjx-mo><mjx-mn class="mjx-n" space="4"><mjx-c class="mjx-c32"></mjx-c></mjx-mn></mjx-math><mjx-assistive-mml unselectable="on" display="block"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mi>S</mi><mo>=</mo><msup><mn>8</mn><mrow data-mjx-texclass="ORD"><mn>15</mn></mrow></msup><mo lspace="thickmathspace" rspace="thickmathspace">mod</mo><mn>23</mn><mo>=</mo><mn>2</mn></math></mjx-assistive-mml></mjx-container><p>当然,实际运算中不可能取这么小的数值,比如如果需要128bit长度的密钥,那么p值需要是128bit长度的质数,由于有模运算,所获得的密钥不会大于<mjx-container class="MathJax" jax="CHTML" style="position:relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D45D TEX-I"></mjx-c></mjx-mi></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>p</mi></math></mjx-assistive-mml></mjx-container>,所以<mjx-container class="MathJax" jax="CHTML" style="position:relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D45D TEX-I"></mjx-c></mjx-mi></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>p</mi></math></mjx-assistive-mml></mjx-container>值可以是128bit数字中最大的一个质数,<mjx-container class="MathJax" jax="CHTML" style="position:relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D454 TEX-I"></mjx-c></mjx-mi></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>g</mi></math></mjx-assistive-mml></mjx-container>可以随便设置一个小的质数即可。<br> 我在<a href="https://github.com/thejinchao/dhexchange" target="_blank" rel="noopener noreferrer">github</a>上写了一个DH密钥交换算法,支持128bit长度密钥运算,纯C完成,没有引用其他库,只有两个接口,用法如下</p><div class="language-cpp" data-highlighter="prismjs" data-ext="cpp" data-title="cpp"><pre><code><span class="line"><span class="token comment">//Alice获得随机私钥a并计算出对应的公钥A</span></span>
<span class="line">DH_KEY alice_private<span class="token punctuation">,</span> alice_public<span class="token punctuation">;</span></span>
<span class="line"><span class="token function">DH_generate_key_pair</span><span class="token punctuation">(</span>alice_public<span class="token punctuation">,</span> alice_private<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token comment">//Bob获得随机私钥b并计算出对应的公钥B</span></span>
<span class="line">DH_KEY bob_private<span class="token punctuation">,</span> bob_public<span class="token punctuation">;</span></span>
<span class="line"><span class="token function">DH_generate_key_pair</span><span class="token punctuation">(</span>bob_public<span class="token punctuation">,</span> bob_private<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token comment">//交换公钥后Alice计算出加密用密钥s</span></span>
<span class="line">DH_KEY alice_secret<span class="token punctuation">;</span></span>
<span class="line"><span class="token function">DH_generate_key_secret</span><span class="token punctuation">(</span>alice_secret<span class="token punctuation">,</span> alice_private<span class="token punctuation">,</span> bob_public<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token comment">//Bob计算出加密用密钥s</span></span>
<span class="line">DH_KEY bob_secret<span class="token punctuation">;</span></span>
<span class="line"><span class="token function">DH_generate_key_secret</span><span class="token punctuation">(</span>bob_secret<span class="token punctuation">,</span> bob_private<span class="token punctuation">,</span> alice_public<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre></div></div><!--[--><!--]--></div><footer class="vp-page-meta"><!----><div class="vp-meta-item git-info"><div class="vp-meta-item last-updated"><span class="meta-item-label">Last Updated: </span><!----></div><div class="vp-meta-item contributors"><span class="meta-item-label">Contributors: </span><span class="meta-item-info"><!--[--><!--[--><span class="contributor" title="email: thejinchao@gmail.com">thejinchao</span><!----><!--]--><!--]--></span></div></div></footer><nav class="vp-page-nav" aria-label="page navigation"><a class="route-link auto-link prev" href="/blog/2025/02/RandRound.html" aria-label="如何生成一个随机的圆形"><!--[--><div class="hint"><span class="arrow left"></span> Prev</div><div class="link"><span>如何生成一个随机的圆形</span></div><!--]--></a><a class="route-link auto-link next" href="/blog/2025/02/SegmentCircle.html" aria-label="如何计算线段和圆的交点"><!--[--><div class="hint">Next <span class="arrow right"></span></div><div class="link"><span>如何计算线段和圆的交点</span></div><!--]--></a></nav><!--[--><!--]--></main><!--]--></div><!--[--><!----><!--]--><!--]--></div>
<script type="module" src="/assets/app-Bj0iHonY.js" defer></script>
</body>
</html>