<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/">
	<channel>
		<title>Posts on Perox</title>
		<link>https://p3r0x.github.io/post/</link>
		<description>Recent content in Posts on Perox</description>
		<generator>Hugo -- 0.152.2</generator>
		<language>zh-cn</language>
		<copyright>Perox</copyright>
		<lastBuildDate>Tue, 19 May 2026 20:14:14 +0800</lastBuildDate>
		<atom:link href="https://p3r0x.github.io/post/index.xml" rel="self" type="application/rss+xml" />
		
		
		<item>
			<title>Jacobian雅可比坐标（ECC)</title>
			<link>https://p3r0x.github.io/p/jacobian%E9%9B%85%E5%8F%AF%E6%AF%94%E5%9D%90%E6%A0%87ecc/</link>
			<pubDate>Tue, 19 May 2026 20:14:14 +0800</pubDate><author>Perox</author><guid>https://p3r0x.github.io/p/jacobian%E9%9B%85%E5%8F%AF%E6%AF%94%E5%9D%90%E6%A0%87ecc/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<h1 id="jacobian">jacobian<a href="#jacobian" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h1>
<p>避免逆运算过于难算将仿射坐标转化为雅可比坐标</p>
<h2 id="定义">定义<a href="#%e5%ae%9a%e4%b9%89" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>对一个椭圆曲线：$y^2≡x^3+ax+b \mod p$</p>
<p>将坐标(x,y)等价表示为：$(X,Y,Z)$</p>
<p>$x = \frac{X}{Z^2} \ y = \frac{Y}{Z^3}$</p>
<p>代入原方程得:
</p>
$$
Y^2≡X^3+aXZ^4+bZ^6 \mod p
$$<h2 id="点加法pq">点加法(P≠Q)<a href="#%e7%82%b9%e5%8a%a0%e6%b3%95pq" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>仿射坐标下：
</p>
$$
\left\{
\begin{aligned}
\lambda &= \frac{y_2 - y_1}{x_2 - x_1} \\
x_3 &= \lambda^2 - x_1 - x_2 \\
y_3 &= \lambda(x_1 - x_3) - y_1
\end{aligned}
\right.
$$<p>$x_1 = \frac{X_1}{Z^2_1} \ y_1 = \frac{Y_1}{Z^3_1}$</p>
<p>$x_2 = \frac{X_2}{Z^2_2} \ y_2 = \frac{Y_2}{Z^3_2}$​</p>
<p>令$U_1=X_1Z_2^2,U_2=X_2Z_1^2$</p>
<p>$S_1=Y_1Z_2^3,S_2=Y_2Z_1^3$</p>
<p>$令H=U_2-U_1$</p>
<p>$R=S_2-S_1$</p>
<p>所以
</p>
$$
\lambda =\frac{R}{H} \frac{1}{Z_1Z_2}
$$$$
x_3 = \frac{R^2-H^2Z_2^2X_1-H^2Z_1^2X_2}{H^2Z_1^2Z_2^2}\\
所以x_3=\frac{R^2-H^2(U_2+U_1)}{H^2Z_1^2Z_2^2}\\
因为H=U_2-U_1,所以U_1+U_2=2U_1+H\\
x_3=\frac{R^2-2U_1H^2-H^3}{H^2Z_1^2Z_2^2}
所以按照x=\frac{X}{Z^2}，令z_3=HZ_1Z_2\\
X_3=R^2-2U_1H^2-H^3\\
Y_3可以同样化简为:Y_3=R(U_1H^2-X_3)-S_1H^3
$$<p>得到$(X_3,Y_3,Z_3)$</p>
<p>然后得到$(x_3,y_3)$</p>
<h2 id="点倍加pq">点倍加（P=Q）<a href="#%e7%82%b9%e5%80%8d%e5%8a%a0pq" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>若P=Q时,切线代替割线：
</p>
$$
λ=\frac{3x_1^2+a}{2y_1} \mod p
$$$$
x_3=λ^2-2x_1 \mod p\\
y_3=λ(x_1-x_3)-y_1
$$$$
x_1=\frac{X_1}{Z_1^2},y_1=\frac{Y_1}{Z_1^3}
$$<p>则：
</p>
$$
\lambda=\frac{3X_1^2+aZ_1^4}{2Y_1Z_1}
$$<p>令：
</p>
$$
M=3X_1^2+aZ_1^4
$$$$
S=4X_1Y_1^2
$$<p>由：
</p>
$$
x_3=\lambda^2-2x_1
$$<p>得到：
</p>
$$
x_3=\frac{M^2-2S}{4Y_1^2Z_1^2}
$$<p>因此令：
</p>
$$
Z_3=2Y_1Z_1
$$<p>得到：
</p>
$$
X_3=M^2-2S
$$<p>再由：
</p>
$$
y_3=\lambda(x_1-x_3)-y_1
$$<p>得到：
</p>
$$
Y_3=M(S-X_3)-8Y_1^4
$$<p>因此：
</p>
$$
2P=(X_3,Y_3,Z_3)
$$<p>其中：
</p>
$$
X_3=M^2-2S \\
Y_3=M(S-X_3)-8Y_1^4 \\
Z_3=2Y_1Z_1
$$<p>最后恢复仿射坐标：
</p>
$$
x_3=\frac{X_3}{Z_3^2},y_3=\frac{Y_3}{Z_3^3}
$$]]></content>
		</item>
		
		<item>
			<title>双线性映射 weil pairing</title>
			<link>https://p3r0x.github.io/p/%E5%8F%8C%E7%BA%BF%E6%80%A7%E6%98%A0%E5%B0%84-weil-pairing/</link>
			<pubDate>Fri, 17 Apr 2026 19:37:01 +0800</pubDate><author>Perox</author><guid>https://p3r0x.github.io/p/%E5%8F%8C%E7%BA%BF%E6%80%A7%E6%98%A0%E5%B0%84-weil-pairing/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<h1 id="双线性映射">双线性映射<a href="#%e5%8f%8c%e7%ba%bf%e6%80%a7%e6%98%a0%e5%b0%84" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h1>
<h2 id="定义">定义<a href="#%e5%ae%9a%e4%b9%89" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>$G_1,G_2为两个q阶循环群，G_1是F_p椭圆曲线上的点群，G_2是F_{p^2}^*的子群，所以$定义了$f:G_1 ×G_2→G_T$，其中$G_1和G_2$为加法群，$G_T$为乘法群</p>
<p>有$g_1∈G_1,g_2∈G_2,a,b∈Z$，满足：</p>
<ol>
<li>
<p>双线性性：$e(a*g_1,b*g_2)=e(g_1,g_2)^{ab}$​</p>
<p>或者定义为：$e(P,Q+R)=e(P,Q)*e(P,R) \\ e(P+S,Q)=e(P,Q)*e(S,Q)$</p>
</li>
<li>
<p>非退化性：满足$e(g_1,g_2)≠e_{G_T}$，$e_{G_T}$代表 $G_T$的单位元</p>
</li>
<li>
<p>可计算性：存在有效算法$e(g_1,g_2)$​</p>
</li>
</ol>
<h2 id="线性映射">线性映射<a href="#%e7%ba%bf%e6%80%a7%e6%98%a0%e5%b0%84" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>线性映射如:
</p>
$$
f(x+y)=f(x)+f(y)\\
f(ax)=af(x)
$$<p>对两个变量，分别单独看都是线性的，合在一起就叫双线性</p>
<p>如果有变量<strong>x,y</strong>，函数<strong>F(x,y)</strong>：</p>
<ul>
<li><strong>固定x,变化y</strong>：函数对y是线性的</li>
<li><strong>固定y,变化x</strong>：函数对x是线性的</li>
</ul>
<h2 id="weil配对">weil配对<a href="#weil%e9%85%8d%e5%af%b9" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p><strong>Weil对可将椭圆曲线的挠群上的两个点，映射到一个特殊有限域的乘法子群上，借此可将椭圆曲线离散对数问题（ECDLP）投射到一般的离散对数问题（DLP）</strong></p>
<p><strong>$n$-torsion点</strong>：如果一个点$P$被“加自己”若干次以后会回到单位元 $\mathcal O$，那它就是torsion点，表现为$nP=\mathcal O$</p>
<p><strong>$E[n]$</strong>：所有满足$nP=\mathcal O$的点放在一起，形成一个子群，记作$E[n]$</p>
<p><strong>单位根</strong>：满足$\zeta^n=1$的数叫$n$次单位根，比如复数里$1,-1,i,-i$ 是4次单位根</p>
<p><strong>除子</strong>：记录函数在哪些点有零、哪些点有极点，以及它们各自重复多少次，记作$\operatorname{div}(f)=n(P)-n(\mathcal O)$，表示在$P$有$n$重零点，在$\mathcal O$有$n$重极点：
</p>
$$
设有理函数f(X) = \frac{a_0 + a_1 X + \cdots + a_n X^n}{b_0 + b_1 X + \cdots + b_m X^m}\\
在复数范围内进行因子分解：f(X) = \frac{a(X - \alpha_1)^{e_1} (X - \alpha_2)^{e_2} \cdots (X - \alpha_r)^{e_r}}
{b(X - \beta_1)^{d_1} (X - \beta_2)^{d_2} \cdots (X - \beta_s)^{d_s}}\\
$$<p>
可写作：
$$
\operatorname{div}(f(X)) \triangleq e_1[\alpha_1] + e_2[\alpha_2] + \cdots + e_r[\alpha_r]</p>
<ul>
<li>d_1[\beta_1] - d_2[\beta_2] - \cdots - d_s[\beta_s]
$$
表示$e_1$个$$\alpha_1$$零点&hellip;在$d_1$有$\beta_1$个极点&hellip;</li>
</ul>
<h3 id="定义-1">定义<a href="#%e5%ae%9a%e4%b9%89-1" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>设$P,Q \in E[n]$，选择函数$f_P,f_Q$，满足
</p>
$$
\operatorname{div}(f_P) = n(P) - n(\mathcal O)\\
\operatorname{div}(f_Q) = n(Q) - n(\mathcal O)
$$<p>
可定义为：
</p>
$$
e_n(P,Q) =
\frac{f_P(Q+S)}{f_P(S)}
\bigg/
\frac{f_Q(P-S)}{f_Q(-S)}.
$$<p>S为辅助点，为E中任意元素，且满足$S \notin \{\mathcal{O}, P,-Q,P,-Q\}\,$</p>
<p>只要输入的两个点P和Q都是n-torsion点，配对的输出$e_n(P,Q)$满足所有$x^n=1$的集合</p>
<h2 id="题">题<a href="#%e9%a2%98" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>红名谷2025</p>
<div class="code-shell">
    <span class="code-lang">python</span>
    <div class="code-block">
        <div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">Crypto.Util.number</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">Crypto.Util.Padding</span> <span class="kn">import</span> <span class="n">pad</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">sage.all</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">functools</span> <span class="kn">import</span> <span class="n">reduce</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">mul</span><span class="p">(</span><span class="n">numbers</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">reduce</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="n">x</span> <span class="o">*</span> <span class="n">y</span><span class="p">,</span> <span class="n">numbers</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">res</span> <span class="o">=</span> <span class="p">[</span><span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272555731</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272556223</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272556437</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272556749</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272557237</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272557459</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272557687</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272558239</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272558627</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559239</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559523</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559787</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272560169</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272560343</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272560433</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272560751</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272560969</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272561441</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272562103</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272562601</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272563261</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272563297</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272563391</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272563511</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272563711</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="n">res</span><span class="p">[</span><span class="mi">11</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">pp</span> <span class="o">=</span> <span class="n">mul</span><span class="p">(</span><span class="n">res</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">K</span> <span class="o">=</span> <span class="n">GF</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">E</span> <span class="o">=</span> <span class="n">EllipticCurve</span><span class="p">(</span><span class="n">K</span><span class="p">,</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">4</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">qwq</span> <span class="o">=</span> <span class="mh">0x320238b</span>
</span></span><span class="line"><span class="cl"><span class="n">qaq</span> <span class="o">=</span> <span class="n">E</span><span class="o">.</span><span class="n">order</span><span class="p">()</span><span class="o">//</span><span class="n">qwq</span><span class="o">**</span><span class="mi">2</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">flag</span> <span class="o">=</span> <span class="n">pad</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="s2">&#34;flag.txt&#34;</span><span class="p">,</span> <span class="s2">&#34;rb&#34;</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">(),</span><span class="mi">4</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">flag_part</span> <span class="o">=</span> <span class="p">[</span><span class="n">bytes_to_long</span><span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="n">i</span><span class="o">+</span><span class="mi">2</span><span class="p">])</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">flag</span><span class="p">),</span> <span class="mi">2</span><span class="p">)]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">output</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">flag_part</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">P1</span> <span class="o">=</span> <span class="n">qaq</span><span class="o">*</span><span class="n">E</span><span class="o">.</span><span class="n">random_element</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="n">P2</span> <span class="o">=</span> <span class="n">qaq</span><span class="o">*</span><span class="n">E</span><span class="o">.</span><span class="n">random_element</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="n">out</span> <span class="o">=</span> <span class="n">P1</span><span class="o">.</span><span class="n">weil_pairing</span><span class="p">(</span><span class="n">P2</span><span class="p">,</span> <span class="n">qwq</span><span class="p">)</span><span class="o">**</span><span class="mi">3</span><span class="o">*</span><span class="n">c</span>
</span></span><span class="line"><span class="cl">    <span class="n">output</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">pow</span><span class="p">(</span><span class="n">out</span><span class="p">,</span><span class="n">qaq</span><span class="p">,</span> <span class="n">pp</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">output</span><span class="p">)</span></span></span></code></pre></td></tr></table>
</div>
</div>
    </div>
</div>
<p>E的阶为qaq*qwq^2^,因为flag_part的每个元素为两个字节，也就是16bit，所以表示的范围为（0，$2^{16}$）</p>
<div class="code-shell">
    <span class="code-lang">pytho</span>
    <div class="code-block">
        <div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">    P1 = qaq*E.random_element()
</span></span><span class="line"><span class="cl">    P2 = qaq*E.random_element()</span></span></code></pre></td></tr></table>
</div>
</div>
    </div>
</div>
<p>这两行代码将p1和p2投影到了qwq^2^阶子群，然后对这两个点进行weil配对，所以输出结果应该为qwq次单位根：
</p>
$$
e_{qwq}(p_1,p_2)^{qwq}=1
$$<p>
所以$output=(e_{qwq}(p_1,p_2)^3*c)^{qaq} \ mod \ pp$</p>
<p>两边qwq次幂得到$output^{qwq}=c^{qwq*qaq}$</p>
<div class="code-shell">
    <span class="code-lang">python</span>
    <div class="code-block">
        <div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">sage.all</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">Crypto.Util.number</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="n">res</span> <span class="o">=</span> <span class="p">[</span><span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272555731</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272556223</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272556437</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272556749</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272557237</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272557459</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272557687</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272558239</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272558627</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559239</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559523</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559787</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272560169</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272560343</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272560433</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272560751</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272560969</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272561441</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272562103</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272562601</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272563261</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272563297</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272563391</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272563511</span><span class="p">,</span> <span class="mi">4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272563711</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="n">res</span><span class="p">[</span><span class="mi">11</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">pp</span> <span class="o">=</span> <span class="n">mul</span><span class="p">(</span><span class="n">res</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">K</span> <span class="o">=</span> <span class="n">GF</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">E</span> <span class="o">=</span> <span class="n">EllipticCurve</span><span class="p">(</span><span class="n">K</span><span class="p">,</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">4</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">qwq</span> <span class="o">=</span> <span class="mh">0x320238b</span>
</span></span><span class="line"><span class="cl"><span class="n">qaq</span> <span class="o">=</span> <span class="n">E</span><span class="o">.</span><span class="n">order</span><span class="p">()</span><span class="o">//</span><span class="n">qwq</span><span class="o">**</span><span class="mi">2</span>
</span></span><span class="line"><span class="cl"><span class="n">output</span> <span class="o">=</span> <span class="p">[</span><span class="mi">2258729984869869545899085887518820011795880892632317458813070773270633871398785757696896679887453336507722151037267</span><span class="p">,</span> <span class="mi">1843407310728065127389586068976768146728145160643439144895915852634291722663455873979176336542780552480617232750208</span><span class="p">,</span> <span class="mi">1107061034832953338095294459542523703297843192927313275050958753437078121375795698115353665062727895555487155331316</span><span class="p">,</span> <span class="mi">460337686287218470707660572908024613140030922587867288532588857547792028112129697850035268228038619747643899804437</span><span class="p">,</span> <span class="mi">1659483062154723617504533638726171721668768657049197025961515070605996080663312140357834824850074607457421362000265</span><span class="p">,</span> <span class="mi">3150528329201636320206556304125544975332446992414777732425647667048147102509308959254762895094589762017857965981432</span><span class="p">,</span> <span class="mi">3338854035461286314545186888372727000962778038359519702308782495912356677650264814573463929190025956045491115654437</span><span class="p">,</span> <span class="mi">3042574495339632074308497406446851120362994432361876743901608172567070991832258762751304397604780567703759317642849</span><span class="p">,</span> <span class="mi">380771388315580393673388198522357440257018642337119013880143084485482127962577943753495690258532782147018511750175</span><span class="p">,</span> <span class="mi">507222017133457507399048159541059729302482262298099528096040456818913085187752925782279385808732260473494863290057</span><span class="p">,</span> <span class="mi">533663958640518878580794848474449572155795564171089765377581587253792204491009275840408579120376539757958097910250</span><span class="p">,</span> <span class="mi">2681145160205204287930367627648683111546318004811732016137828270063753300095675791698398080219566725174890793619305</span><span class="p">,</span> <span class="mi">3259478178021541801713314504097142165241891541242669456591074651894459393333167453811425864198267757724232689747676</span><span class="p">,</span> <span class="mi">3553147298452254907907643059383506744982654808021508866104139240155822133286673657139615950259800036058045049186173</span><span class="p">,</span> <span class="mi">1778776925369812510137824472396145391840300438509021838870105004154301861222612045533034046889878767915343446874895</span><span class="p">,</span> <span class="mi">3409071358092535255033136229525415652816479844958949032220987821989305575696869929136493897719813036034016228268240</span><span class="p">,</span> <span class="mi">571819148781137687997336847709735468532344087614483867682513640750800758034003212746545051127998686475933050072942</span><span class="p">,</span> <span class="mi">2676666310158795770609746651024766841212271213339384335651155407291004834251914242990757216402110096603729617413168</span><span class="p">,</span> <span class="mi">2557670339976470006330058052583841683167706755578266425502679937976714609864257535859316483527764340425703004883241</span><span class="p">,</span> <span class="mi">973319024062640263364951783086923560907216776835485042157036675663719529568519121997200478026304141184810597275543</span><span class="p">,</span> <span class="mi">1189768012357955450386827626693191057999220508190415783719135619271537446794904663649700073564180453068646130539863</span><span class="p">,</span> <span class="mi">790522915783756530835443034667719516913120763875831140857606265058871034793645280121113275798239222760522467771184</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">flag</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">output</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">flag_part</span> <span class="o">=</span> <span class="nb">pow</span><span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="n">qwq</span><span class="p">,</span><span class="n">p</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">h</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">65537</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="nb">pow</span><span class="p">(</span><span class="n">h</span><span class="p">,</span><span class="n">qaq</span><span class="o">*</span><span class="n">qwq</span><span class="p">,</span><span class="n">p</span><span class="p">)</span> <span class="o">==</span> <span class="n">flag_part</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">flag</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">h</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="k">break</span>
</span></span><span class="line"><span class="cl"><span class="n">flag</span> <span class="o">=</span> <span class="sa">b</span><span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">long_to_bytes</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">flag</span><span class="p">])</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">flag</span><span class="p">)</span></span></span></code></pre></td></tr></table>
</div>
</div>
    </div>
</div>
]]></content>
		</item>
		
		<item>
			<title>cryptohack lwe wp</title>
			<link>https://p3r0x.github.io/p/cryptohack-lwe-wp/</link>
			<pubDate>Tue, 10 Mar 2026 18:00:00 +0800</pubDate><author>Perox</author><guid>https://p3r0x.github.io/p/cryptohack-lwe-wp/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<h2 id="lwe-high-bits-message">LWE High Bits Message<a href="#lwe-high-bits-message" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<div class="code-shell">
    <span class="code-lang">python</span>
    <div class="code-block">
        <div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># dimension</span>
</span></span><span class="line"><span class="cl"><span class="n">n</span> <span class="o">=</span> <span class="mi">64</span>
</span></span><span class="line"><span class="cl"><span class="c1"># plaintext modulus</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="mi">257</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ciphertext modulus</span>
</span></span><span class="line"><span class="cl"><span class="n">q</span> <span class="o">=</span> <span class="mh">0x10001</span>
</span></span><span class="line"><span class="cl"><span class="c1"># bound for error term</span>
</span></span><span class="line"><span class="cl"><span class="n">error_bound</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">floor</span><span class="p">((</span><span class="n">q</span><span class="o">/</span><span class="n">p</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="c1"># message scaling factor</span>
</span></span><span class="line"><span class="cl"><span class="n">delta</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="nb">round</span><span class="p">(</span><span class="n">q</span><span class="o">/</span><span class="n">p</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">V</span> <span class="o">=</span> <span class="n">VectorSpace</span><span class="p">(</span><span class="n">GF</span><span class="p">(</span><span class="n">q</span><span class="p">),</span> <span class="n">n</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">S</span> <span class="o">=</span> <span class="n">V</span><span class="o">.</span><span class="n">random_element</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;S = &#34;</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">m</span> <span class="o">=</span> <span class="err">?</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">A</span> <span class="o">=</span> <span class="n">V</span><span class="o">.</span><span class="n">random_element</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">error</span> <span class="o">=</span> <span class="n">randint</span><span class="p">(</span><span class="o">-</span><span class="n">error_bound</span><span class="p">,</span> <span class="n">error_bound</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">b</span> <span class="o">=</span> <span class="n">A</span> <span class="o">*</span> <span class="n">S</span> <span class="o">+</span> <span class="n">m</span> <span class="o">*</span> <span class="n">delta</span> <span class="o">+</span> <span class="n">error</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;A = &#34;</span><span class="p">,</span> <span class="n">A</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;b = &#34;</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span></span></span></code></pre></td></tr></table>
</div>
</div>
    </div>
</div>
<p>缩放因子delta=round(q/p)</p>
<p>b=A * S+m * delta+e(mod q)</p>
<p>所以$m*{\delta}+e=b-A*S=t$</p>
<p>$m + \frac{e}{\delta} = \frac{t}{\delta}$</p>
<p>e在$(-\frac{\delta}{2},\frac{\delta}{2})$之间，所以相当于m+x,x∈$(-\frac{1}{2},\frac{1}{2})$所以四舍五入就是m</p>
<div class="code-shell">
    <span class="code-lang">python</span>
    <div class="code-block">
        <div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">sage.all</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">Crypto.Util.number</span> <span class="kn">import</span><span class="o">*</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">S</span> <span class="o">=</span>  <span class="p">(</span><span class="mi">55542</span><span class="p">,</span> <span class="mi">19411</span><span class="p">,</span> <span class="mi">34770</span><span class="p">,</span> <span class="mi">6739</span><span class="p">,</span> <span class="mi">63198</span><span class="p">,</span> <span class="mi">63821</span><span class="p">,</span> <span class="mi">5900</span><span class="p">,</span> <span class="mi">32164</span><span class="p">,</span> <span class="mi">51223</span><span class="p">,</span> <span class="mi">38979</span><span class="p">,</span> <span class="mi">24459</span><span class="p">,</span> <span class="mi">10936</span><span class="p">,</span> <span class="mi">17256</span><span class="p">,</span> <span class="mi">20215</span><span class="p">,</span> <span class="mi">35814</span><span class="p">,</span> <span class="mi">42905</span><span class="p">,</span> <span class="mi">53656</span><span class="p">,</span> <span class="mi">17000</span><span class="p">,</span> <span class="mi">1834</span><span class="p">,</span> <span class="mi">51682</span><span class="p">,</span> <span class="mi">43780</span><span class="p">,</span> <span class="mi">22391</span><span class="p">,</span> <span class="mi">33012</span><span class="p">,</span> <span class="mi">61667</span><span class="p">,</span> <span class="mi">37447</span><span class="p">,</span> <span class="mi">16404</span><span class="p">,</span> <span class="mi">58991</span><span class="p">,</span> <span class="mi">61772</span><span class="p">,</span> <span class="mi">44888</span><span class="p">,</span> <span class="mi">43199</span><span class="p">,</span> <span class="mi">32039</span><span class="p">,</span> <span class="mi">26885</span><span class="p">,</span> <span class="mi">17206</span><span class="p">,</span> <span class="mi">62186</span><span class="p">,</span> <span class="mi">58387</span><span class="p">,</span> <span class="mi">57048</span><span class="p">,</span> <span class="mi">38393</span><span class="p">,</span> <span class="mi">29306</span><span class="p">,</span> <span class="mi">58001</span><span class="p">,</span> <span class="mi">57199</span><span class="p">,</span> <span class="mi">33472</span><span class="p">,</span> <span class="mi">56572</span><span class="p">,</span> <span class="mi">53429</span><span class="p">,</span> <span class="mi">62593</span><span class="p">,</span> <span class="mi">14134</span><span class="p">,</span> <span class="mi">40522</span><span class="p">,</span> <span class="mi">25106</span><span class="p">,</span> <span class="mi">34325</span><span class="p">,</span> <span class="mi">37646</span><span class="p">,</span> <span class="mi">43688</span><span class="p">,</span> <span class="mi">14259</span><span class="p">,</span> <span class="mi">24197</span><span class="p">,</span> <span class="mi">33427</span><span class="p">,</span> <span class="mi">43977</span><span class="p">,</span> <span class="mi">18322</span><span class="p">,</span> <span class="mi">38877</span><span class="p">,</span> <span class="mi">55093</span><span class="p">,</span> <span class="mi">12466</span><span class="p">,</span> <span class="mi">16869</span><span class="p">,</span> <span class="mi">25413</span><span class="p">,</span> <span class="mi">54773</span><span class="p">,</span> <span class="mi">59532</span><span class="p">,</span> <span class="mi">62694</span><span class="p">,</span> <span class="mi">13948</span><span class="p">)</span> 
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">A</span> <span class="o">=</span>  <span class="p">(</span><span class="mi">13759</span><span class="p">,</span> <span class="mi">12750</span><span class="p">,</span> <span class="mi">38163</span><span class="p">,</span> <span class="mi">63722</span><span class="p">,</span> <span class="mi">39130</span><span class="p">,</span> <span class="mi">22935</span><span class="p">,</span> <span class="mi">58866</span><span class="p">,</span> <span class="mi">48803</span><span class="p">,</span> <span class="mi">15933</span><span class="p">,</span> <span class="mi">64995</span><span class="p">,</span> <span class="mi">60517</span><span class="p">,</span> <span class="mi">64302</span><span class="p">,</span> <span class="mi">42432</span><span class="p">,</span> <span class="mi">32000</span><span class="p">,</span> <span class="mi">22058</span><span class="p">,</span> <span class="mi">58123</span><span class="p">,</span> <span class="mi">53993</span><span class="p">,</span> <span class="mi">33790</span><span class="p">,</span> <span class="mi">35783</span><span class="p">,</span> <span class="mi">61333</span><span class="p">,</span> <span class="mi">53431</span><span class="p">,</span> <span class="mi">43016</span><span class="p">,</span> <span class="mi">60795</span><span class="p">,</span> <span class="mi">25781</span><span class="p">,</span> <span class="mi">28091</span><span class="p">,</span> <span class="mi">11212</span><span class="p">,</span> <span class="mi">64592</span><span class="p">,</span> <span class="mi">11385</span><span class="p">,</span> <span class="mi">24690</span><span class="p">,</span> <span class="mi">40658</span><span class="p">,</span> <span class="mi">35307</span><span class="p">,</span> <span class="mi">63583</span><span class="p">,</span> <span class="mi">60365</span><span class="p">,</span> <span class="mi">60359</span><span class="p">,</span> <span class="mi">32568</span><span class="p">,</span> <span class="mi">35417</span><span class="p">,</span> <span class="mi">22078</span><span class="p">,</span> <span class="mi">38207</span><span class="p">,</span> <span class="mi">16331</span><span class="p">,</span> <span class="mi">53636</span><span class="p">,</span> <span class="mi">28734</span><span class="p">,</span> <span class="mi">30436</span><span class="p">,</span> <span class="mi">18170</span><span class="p">,</span> <span class="mi">15939</span><span class="p">,</span> <span class="mi">966</span><span class="p">,</span> <span class="mi">48519</span><span class="p">,</span> <span class="mi">41621</span><span class="p">,</span> <span class="mi">36371</span><span class="p">,</span> <span class="mi">41836</span><span class="p">,</span> <span class="mi">4026</span><span class="p">,</span> <span class="mi">33536</span><span class="p">,</span> <span class="mi">57062</span><span class="p">,</span> <span class="mi">52428</span><span class="p">,</span> <span class="mi">59850</span><span class="p">,</span> <span class="mi">476</span><span class="p">,</span> <span class="mi">43354</span><span class="p">,</span> <span class="mi">61614</span><span class="p">,</span> <span class="mi">32243</span><span class="p">,</span> <span class="mi">42518</span><span class="p">,</span> <span class="mi">19733</span><span class="p">,</span> <span class="mi">63464</span><span class="p">,</span> <span class="mi">29357</span><span class="p">,</span> <span class="mi">56039</span><span class="p">,</span> <span class="mi">15013</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">b</span> <span class="o">=</span>  <span class="mi">44007</span>
</span></span><span class="line"><span class="cl"><span class="c1"># dimension</span>
</span></span><span class="line"><span class="cl"><span class="n">n</span> <span class="o">=</span> <span class="mi">64</span>
</span></span><span class="line"><span class="cl"><span class="c1"># plaintext modulus</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="mi">257</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ciphertext modulus</span>
</span></span><span class="line"><span class="cl"><span class="n">q</span> <span class="o">=</span> <span class="mh">0x10001</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">error_bound</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">floor</span><span class="p">((</span><span class="n">q</span><span class="o">/</span><span class="n">p</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">delta</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="nb">round</span><span class="p">(</span><span class="n">q</span><span class="o">/</span><span class="n">p</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">AS</span><span class="o">=</span><span class="nb">sum</span><span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">*</span><span class="n">S</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">S</span><span class="p">)))</span><span class="o">%</span><span class="n">q</span>
</span></span><span class="line"><span class="cl"><span class="n">t</span> <span class="o">=</span> <span class="p">(</span><span class="n">b</span><span class="o">-</span><span class="n">AS</span><span class="p">)</span><span class="o">%</span><span class="n">q</span>
</span></span><span class="line"><span class="cl"><span class="n">m</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="nb">round</span><span class="p">(</span><span class="n">t</span><span class="o">/</span><span class="n">delta</span><span class="p">))</span><span class="o">%</span><span class="n">p</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">m</span><span class="p">)</span></span></span></code></pre></td></tr></table>
</div>
</div>
    </div>
</div>
<h2 id="lwe-low-bits-message">LWE Low Bits Message<a href="#lwe-low-bits-message" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<div class="code-shell">
    <span class="code-lang">python</span>
    <div class="code-block">
        <div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># dimension</span>
</span></span><span class="line"><span class="cl"><span class="n">n</span> <span class="o">=</span> <span class="mi">64</span>
</span></span><span class="line"><span class="cl"><span class="c1"># plaintext modulus</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="mi">257</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ciphertext modulus</span>
</span></span><span class="line"><span class="cl"><span class="n">q</span> <span class="o">=</span> <span class="mh">0x10001</span>
</span></span><span class="line"><span class="cl"><span class="c1"># bound for error term</span>
</span></span><span class="line"><span class="cl"><span class="n">error_bound</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">floor</span><span class="p">((</span><span class="n">q</span><span class="o">/</span><span class="n">p</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">V</span> <span class="o">=</span> <span class="n">VectorSpace</span><span class="p">(</span><span class="n">GF</span><span class="p">(</span><span class="n">q</span><span class="p">),</span> <span class="n">n</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">S</span> <span class="o">=</span> <span class="n">V</span><span class="o">.</span><span class="n">random_element</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;S = &#34;</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">m</span> <span class="o">=</span> <span class="err">?</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">A</span> <span class="o">=</span> <span class="n">V</span><span class="o">.</span><span class="n">random_element</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">error</span> <span class="o">=</span> <span class="n">randint</span><span class="p">(</span><span class="o">-</span><span class="n">error_bound</span><span class="p">,</span> <span class="n">error_bound</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">b</span> <span class="o">=</span> <span class="n">A</span> <span class="o">*</span> <span class="n">S</span> <span class="o">+</span> <span class="n">error</span> <span class="o">*</span> <span class="n">p</span> <span class="o">+</span> <span class="n">m</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;A = &#34;</span><span class="p">,</span> <span class="n">A</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;b = &#34;</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span></span></span></code></pre></td></tr></table>
</div>
</div>
    </div>
</div>
<p>模q的值可能是：</p>
<ul>
<li>x</li>
<li>x+q</li>
</ul>
<p>范围在[0,q-1]，所以当x+q(即x&lt;0)时，减一个q就可以复原，然后因为x=p*e+m，所以对m取模就可以得到m</p>
<div class="code-shell">
    <span class="code-lang">python</span>
    <div class="code-block">
        <div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">sage.all</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="n">n</span> <span class="o">=</span> <span class="mi">64</span>
</span></span><span class="line"><span class="cl"><span class="c1"># plaintext modulus</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="mi">257</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ciphertext modulus</span>
</span></span><span class="line"><span class="cl"><span class="n">q</span> <span class="o">=</span> <span class="mh">0x10001</span>
</span></span><span class="line"><span class="cl"><span class="c1"># bound for error term</span>
</span></span><span class="line"><span class="cl"><span class="n">S</span> <span class="o">=</span>  <span class="p">(</span><span class="mi">10082</span><span class="p">,</span> <span class="mi">48747</span><span class="p">,</span> <span class="mi">17960</span><span class="p">,</span> <span class="mi">55638</span><span class="p">,</span> <span class="mi">37012</span><span class="p">,</span> <span class="mi">51876</span><span class="p">,</span> <span class="mi">10128</span><span class="p">,</span> <span class="mi">37750</span><span class="p">,</span> <span class="mi">7608</span><span class="p">,</span> <span class="mi">58952</span><span class="p">,</span> <span class="mi">33296</span><span class="p">,</span> <span class="mi">25463</span><span class="p">,</span> <span class="mi">38900</span><span class="p">,</span> <span class="mi">85</span><span class="p">,</span> <span class="mi">65248</span><span class="p">,</span> <span class="mi">42153</span><span class="p">,</span> <span class="mi">44966</span><span class="p">,</span> <span class="mi">31594</span><span class="p">,</span> <span class="mi">40676</span><span class="p">,</span> <span class="mi">56828</span><span class="p">,</span> <span class="mi">30325</span><span class="p">,</span> <span class="mi">38502</span><span class="p">,</span> <span class="mi">65083</span><span class="p">,</span> <span class="mi">7497</span><span class="p">,</span> <span class="mi">2667</span><span class="p">,</span> <span class="mi">54022</span><span class="p">,</span> <span class="mi">24029</span><span class="p">,</span> <span class="mi">32162</span><span class="p">,</span> <span class="mi">57267</span><span class="p">,</span> <span class="mi">12253</span><span class="p">,</span> <span class="mi">6668</span><span class="p">,</span> <span class="mi">5181</span><span class="p">,</span> <span class="mi">14906</span><span class="p">,</span> <span class="mi">51655</span><span class="p">,</span> <span class="mi">61347</span><span class="p">,</span> <span class="mi">4722</span><span class="p">,</span> <span class="mi">22227</span><span class="p">,</span> <span class="mi">23606</span><span class="p">,</span> <span class="mi">63183</span><span class="p">,</span> <span class="mi">52860</span><span class="p">,</span> <span class="mi">1670</span><span class="p">,</span> <span class="mi">31085</span><span class="p">,</span> <span class="mi">42633</span><span class="p">,</span> <span class="mi">47197</span><span class="p">,</span> <span class="mi">7255</span><span class="p">,</span> <span class="mi">16150</span><span class="p">,</span> <span class="mi">9574</span><span class="p">,</span> <span class="mi">62956</span><span class="p">,</span> <span class="mi">26742</span><span class="p">,</span> <span class="mi">57998</span><span class="p">,</span> <span class="mi">49467</span><span class="p">,</span> <span class="mi">31224</span><span class="p">,</span> <span class="mi">60073</span><span class="p">,</span> <span class="mi">12730</span><span class="p">,</span> <span class="mi">41419</span><span class="p">,</span> <span class="mi">41042</span><span class="p">,</span> <span class="mi">53032</span><span class="p">,</span> <span class="mi">16339</span><span class="p">,</span> <span class="mi">32913</span><span class="p">,</span> <span class="mi">16351</span><span class="p">,</span> <span class="mi">34283</span><span class="p">,</span> <span class="mi">47845</span><span class="p">,</span> <span class="mi">3617</span><span class="p">,</span> <span class="mi">35718</span><span class="p">)</span> 
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">A</span> <span class="o">=</span>  <span class="p">(</span><span class="mi">53751</span><span class="p">,</span> <span class="mi">21252</span><span class="p">,</span> <span class="mi">55954</span><span class="p">,</span> <span class="mi">16345</span><span class="p">,</span> <span class="mi">60990</span><span class="p">,</span> <span class="mi">2822</span><span class="p">,</span> <span class="mi">56279</span><span class="p">,</span> <span class="mi">37048</span><span class="p">,</span> <span class="mi">36153</span><span class="p">,</span> <span class="mi">52141</span><span class="p">,</span> <span class="mi">2121</span><span class="p">,</span> <span class="mi">56565</span><span class="p">,</span> <span class="mi">48112</span><span class="p">,</span> <span class="mi">43755</span><span class="p">,</span> <span class="mi">12951</span><span class="p">,</span> <span class="mi">22539</span><span class="p">,</span> <span class="mi">29478</span><span class="p">,</span> <span class="mi">28421</span><span class="p">,</span> <span class="mi">62175</span><span class="p">,</span> <span class="mi">10265</span><span class="p">,</span> <span class="mi">36378</span><span class="p">,</span> <span class="mi">21305</span><span class="p">,</span> <span class="mi">42402</span><span class="p">,</span> <span class="mi">26359</span><span class="p">,</span> <span class="mi">939</span><span class="p">,</span> <span class="mi">60690</span><span class="p">,</span> <span class="mi">1161</span><span class="p">,</span> <span class="mi">65097</span><span class="p">,</span> <span class="mi">34505</span><span class="p">,</span> <span class="mi">19777</span><span class="p">,</span> <span class="mi">29652</span><span class="p">,</span> <span class="mi">42868</span><span class="p">,</span> <span class="mi">49148</span><span class="p">,</span> <span class="mi">38296</span><span class="p">,</span> <span class="mi">31916</span><span class="p">,</span> <span class="mi">25606</span><span class="p">,</span> <span class="mi">18700</span><span class="p">,</span> <span class="mi">12655</span><span class="p">,</span> <span class="mi">35631</span><span class="p">,</span> <span class="mi">64674</span><span class="p">,</span> <span class="mi">29018</span><span class="p">,</span> <span class="mi">21021</span><span class="p">,</span> <span class="mi">14865</span><span class="p">,</span> <span class="mi">40196</span><span class="p">,</span> <span class="mi">14036</span><span class="p">,</span> <span class="mi">40278</span><span class="p">,</span> <span class="mi">37209</span><span class="p">,</span> <span class="mi">35585</span><span class="p">,</span> <span class="mi">34344</span><span class="p">,</span> <span class="mi">33030</span><span class="p">,</span> <span class="mi">285</span><span class="p">,</span> <span class="mi">58536</span><span class="p">,</span> <span class="mi">56121</span><span class="p">,</span> <span class="mi">40899</span><span class="p">,</span> <span class="mi">24262</span><span class="p">,</span> <span class="mi">62326</span><span class="p">,</span> <span class="mi">57433</span><span class="p">,</span> <span class="mi">5765</span><span class="p">,</span> <span class="mi">24456</span><span class="p">,</span> <span class="mi">28859</span><span class="p">,</span> <span class="mi">45170</span><span class="p">,</span> <span class="mi">14799</span><span class="p">,</span> <span class="mi">21567</span><span class="p">,</span> <span class="mi">55484</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">b</span> <span class="o">=</span>  <span class="mi">11507</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">error_bound</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">floor</span><span class="p">((</span><span class="n">q</span><span class="o">/</span><span class="n">p</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">AS</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">*</span><span class="n">S</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">A</span><span class="p">)))</span><span class="o">%</span><span class="n">q</span>
</span></span><span class="line"><span class="cl"><span class="n">x</span> <span class="o">=</span> <span class="p">(</span><span class="n">b</span><span class="o">-</span><span class="n">AS</span><span class="p">)</span><span class="o">%</span><span class="n">q</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="n">x</span> <span class="o">&gt;</span> <span class="n">q</span><span class="o">//</span><span class="mi">2</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">x</span> <span class="o">-=</span> <span class="n">q</span>
</span></span><span class="line"><span class="cl"><span class="n">m</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="n">x</span><span class="p">)</span><span class="o">%</span><span class="n">p</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">m</span><span class="p">)</span></span></span></code></pre></td></tr></table>
</div>
</div>
    </div>
</div>
<h2 id="noise-free">Noise Free<a href="#noise-free" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<div class="code-shell">
    <span class="code-lang">python</span>
    <div class="code-block">
        <div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span><span class="lnt">55
</span><span class="lnt">56
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">utils</span> <span class="kn">import</span> <span class="n">listener</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">sage.all</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="n">FLAG</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&#34;crypto{????????????????????????}&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># dimension</span>
</span></span><span class="line"><span class="cl"><span class="n">n</span> <span class="o">=</span> <span class="mi">64</span>
</span></span><span class="line"><span class="cl"><span class="c1"># plaintext modulus</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="mi">257</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ciphertext modulus</span>
</span></span><span class="line"><span class="cl"><span class="n">q</span> <span class="o">=</span> <span class="mh">0x10001</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">V</span> <span class="o">=</span> <span class="n">VectorSpace</span><span class="p">(</span><span class="n">GF</span><span class="p">(</span><span class="n">q</span><span class="p">),</span> <span class="n">n</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">S</span> <span class="o">=</span> <span class="n">V</span><span class="o">.</span><span class="n">random_element</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">encrypt</span><span class="p">(</span><span class="n">m</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">A</span> <span class="o">=</span> <span class="n">V</span><span class="o">.</span><span class="n">random_element</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="n">b</span> <span class="o">=</span> <span class="n">A</span> <span class="o">*</span> <span class="n">S</span> <span class="o">+</span> <span class="n">m</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">A</span><span class="p">,</span> <span class="n">b</span>
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">Challenge</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="bp">self</span><span class="o">.</span><span class="n">before_input</span> <span class="o">=</span> <span class="s2">&#34;Would you like to encrypt your own message, or see an encryption of a character in the flag?</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">def</span> <span class="nf">challenge</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">your_input</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="s1">&#39;option&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">your_input</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="k">return</span> <span class="p">{</span><span class="s1">&#39;error&#39;</span><span class="p">:</span> <span class="s1">&#39;You must specify an option&#39;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">your_input</span><span class="p">[</span><span class="s1">&#39;option&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;get_flag&#39;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="s2">&#34;index&#34;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">your_input</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="k">return</span> <span class="p">{</span><span class="s2">&#34;error&#34;</span><span class="p">:</span> <span class="s2">&#34;You must provide an index&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">                <span class="bp">self</span><span class="o">.</span><span class="n">exit</span> <span class="o">=</span> <span class="kc">True</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="n">index</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">your_input</span><span class="p">[</span><span class="s2">&#34;index&#34;</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="n">index</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">index</span> <span class="o">&gt;=</span> <span class="nb">len</span><span class="p">(</span><span class="n">FLAG</span><span class="p">)</span> <span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="k">return</span> <span class="p">{</span><span class="s2">&#34;error&#34;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&#34;index must be between 0 and </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">FLAG</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">                <span class="bp">self</span><span class="o">.</span><span class="n">exit</span> <span class="o">=</span> <span class="kc">True</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="n">A</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="n">encrypt</span><span class="p">(</span><span class="n">FLAG</span><span class="p">[</span><span class="n">index</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">            <span class="k">return</span> <span class="p">{</span><span class="s2">&#34;A&#34;</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">A</span><span class="p">)),</span> <span class="s2">&#34;b&#34;</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">b</span><span class="p">))}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">elif</span> <span class="n">your_input</span><span class="p">[</span><span class="s1">&#39;option&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;encrypt&#39;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="s2">&#34;message&#34;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">your_input</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="k">return</span> <span class="p">{</span><span class="s2">&#34;error&#34;</span><span class="p">:</span> <span class="s2">&#34;You must provide a message&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">                <span class="bp">self</span><span class="o">.</span><span class="n">exit</span> <span class="o">=</span> <span class="kc">True</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="n">message</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">your_input</span><span class="p">[</span><span class="s2">&#34;message&#34;</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="n">message</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">message</span> <span class="o">&gt;=</span> <span class="n">p</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="k">return</span> <span class="p">{</span><span class="s2">&#34;error&#34;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&#34;message must be between 0 and </span><span class="si">{</span><span class="n">p</span> <span class="o">-</span> <span class="mi">1</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">                <span class="bp">self</span><span class="o">.</span><span class="n">exit</span> <span class="o">=</span> <span class="kc">True</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="n">A</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="n">encrypt</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="k">return</span> <span class="p">{</span><span class="s2">&#34;A&#34;</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">A</span><span class="p">)),</span> <span class="s2">&#34;b&#34;</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">b</span><span class="p">))}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="p">{</span><span class="s1">&#39;error&#39;</span><span class="p">:</span> <span class="s1">&#39;Unknown action&#39;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">builtins</span><span class="p">;</span> <span class="n">builtins</span><span class="o">.</span><span class="n">Challenge</span> <span class="o">=</span> <span class="n">Challenge</span> <span class="c1"># hack to enable challenge to be run locally, see https://cryptohack.org/faq/#listener</span>
</span></span><span class="line"><span class="cl"><span class="n">listener</span><span class="o">.</span><span class="n">start_server</span><span class="p">(</span><span class="n">port</span><span class="o">=</span><span class="mi">13411</span><span class="p">)</span></span></span></code></pre></td></tr></table>
</div>
</div>
    </div>
</div>
<p>有两个选项：</p>
<ol>
<li>get_flag:可以得到flag字符的加密</li>
<li>encrypt:可以加密自定义m</li>
</ol>
<p>所以选encrypt，且令m=0，就可以得到式子b = A * S，这样就可以把S算出来、</p>
<p>再选get_flag，由于不知道flag的长度，所以进行100轮循环把flag遍历完</p>
<p>然后每次循环执行m=b-A * S（mod q）</p>
<div class="code-shell">
    <span class="code-lang">python</span>
    <div class="code-block">
        <div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">json</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">sage.all</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="n">io</span> <span class="o">=</span> <span class="n">remote</span><span class="p">(</span><span class="s2">&#34;socket.cryptohack.org&#34;</span><span class="p">,</span><span class="mi">13411</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">recvline</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">n</span> <span class="o">=</span> <span class="mi">64</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="mi">257</span>
</span></span><span class="line"><span class="cl"><span class="n">q</span> <span class="o">=</span> <span class="mh">0x10001</span>
</span></span><span class="line"><span class="cl"><span class="n">row</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl"><span class="n">bs</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">64</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">io</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;option&#34;</span><span class="p">:</span><span class="s2">&#34;encrypt&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;message&#34;</span><span class="p">:</span><span class="mi">0</span>
</span></span><span class="line"><span class="cl">	<span class="p">})</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
</span></span><span class="line"><span class="cl">    <span class="n">r</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">io</span><span class="o">.</span><span class="n">recvline</span><span class="p">()</span><span class="o">.</span><span class="n">decode</span><span class="p">())</span>
</span></span><span class="line"><span class="cl">    <span class="n">A</span> <span class="o">=</span> <span class="nb">eval</span><span class="p">(</span><span class="n">r</span><span class="p">[</span><span class="s2">&#34;A&#34;</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">    <span class="n">b</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">r</span><span class="p">[</span><span class="s2">&#34;b&#34;</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">    <span class="n">row</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">A</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">bs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">A</span> <span class="o">=</span> <span class="n">matrix</span><span class="p">(</span><span class="n">GF</span><span class="p">(</span><span class="n">q</span><span class="p">),</span><span class="n">row</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">b</span> <span class="o">=</span> <span class="n">vector</span><span class="p">(</span><span class="n">GF</span><span class="p">(</span><span class="n">q</span><span class="p">),</span><span class="n">bs</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">S</span> <span class="o">=</span> <span class="n">A</span><span class="o">.</span><span class="n">solve_right</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">flag</span> <span class="o">=</span> <span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">100</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">io</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;option&#34;</span><span class="p">:</span><span class="s2">&#34;get_flag&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;index&#34;</span><span class="p">:</span><span class="n">i</span>
</span></span><span class="line"><span class="cl">    <span class="p">})</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
</span></span><span class="line"><span class="cl">    <span class="n">r</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">io</span><span class="o">.</span><span class="n">recvline</span><span class="p">()</span><span class="o">.</span><span class="n">decode</span><span class="p">())</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="s2">&#34;error&#34;</span> <span class="ow">in</span> <span class="n">r</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">break</span>
</span></span><span class="line"><span class="cl">    <span class="n">A</span> <span class="o">=</span> <span class="n">vector</span><span class="p">(</span><span class="n">GF</span><span class="p">(</span><span class="n">q</span><span class="p">),</span><span class="nb">eval</span><span class="p">(</span><span class="n">r</span><span class="p">[</span><span class="s2">&#34;A&#34;</span><span class="p">]))</span>
</span></span><span class="line"><span class="cl">    <span class="n">b</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">r</span><span class="p">[</span><span class="s2">&#34;b&#34;</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">    <span class="n">m</span> <span class="o">=</span> <span class="p">(</span><span class="n">b</span><span class="o">-</span><span class="n">A</span><span class="o">*</span><span class="n">S</span><span class="p">)</span><span class="o">%</span><span class="n">q</span>
</span></span><span class="line"><span class="cl">    <span class="n">flag</span> <span class="o">+=</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">m</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">flag</span><span class="p">)</span></span></span></code></pre></td></tr></table>
</div>
</div>
    </div>
</div>
]]></content>
		</item>
		
		<item>
			<title>RSA共私钥d攻击</title>
			<link>https://p3r0x.github.io/p/rsa%E5%85%B1%E7%A7%81%E9%92%A5d%E6%94%BB%E5%87%BB/</link>
			<pubDate>Mon, 09 Mar 2026 20:50:09 +0800</pubDate><author>Perox</author><guid>https://p3r0x.github.io/p/rsa%E5%85%B1%E7%A7%81%E9%92%A5d%E6%94%BB%E5%87%BB/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<h1 id="共私钥d的rsa攻击">共私钥d的RSA攻击<a href="#%e5%85%b1%e7%a7%81%e9%92%a5d%e7%9a%84rsa%e6%94%bb%e5%87%bb" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h1>
<h2 id="攻击原理">攻击原理<a href="#%e6%94%bb%e5%87%bb%e5%8e%9f%e7%90%86" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>原文：<a href="https://www.ijcsi.org/papers/IJCSI-9-2-1-311-314.pdf" target="_blank" >IJCSI-9-2-1-311-314.pdf</a></p>
<p>不深究数学原理</p>
<p>对于RSA给出的r个式子满足：
</p>
$$
\begin{align*}
e_1 d &= 1 + k_1 \phi(N_1) \\
e_2 d &= 1 + k_2 \phi(N_2) \\
&\ \vdots \\
e_r d &= 1 + k_r \phi(N_r)
\end{align*}
$$<p>
私钥指数d相同，模数N大小相似，且满足
</p>
$$
N_1 < N_2 < N_3 < .... < Nr < 2N_1
$$<p>$ϕ(N_r)=N_i−s_i$,
</p>
$$
在 RSA 中，模数N=pq，欧拉函数
\varphi(N) = (p-1)(q-1) = pq - p - q + 1 = N - (p+q) + 1
\\
令 s = p + q - 1，那么
\varphi(N) = N - s
$$<p>
在攻击中，$ϕ(N_r)$未知，所以可以将其转换成N-s，
</p>
$$
所以e_i d = 1 + k_i \varphi(N_i)\\
就变成了
e_i d = 1 + k_i (N_i - s_i) \quad\Rightarrow\quad e_i d - N_i k_i = 1 - k_i s_i
$$<p>
令$M=\sqrt{N_r}$这样就可以根据这个方程构造格：
</p>
$$
dM=dM\\
e_1d-N_1k_1=1-k_1s_1\\
e_2d-N_2k_2=1-k_2s_2\\
...\\
e_rd-N_rk_r=1-k_rs_r\\
$$<p>
构造过程：
</p>
$$
d\begin{pmatrix} M \\ e_1 \\ e_2 \\ ... \\ e_r\end{pmatrix}+k_1\begin{pmatrix} 0 \\ -N_1 \\0 \\ ... \\ 0\end{pmatrix}+k_2\begin{pmatrix} 0 \\ 0 \\-N_2 \\ ... \\ 0\end{pmatrix}+...+k_r\begin{pmatrix} 0 \\ 0 \\0 \\ ... \\ -N_r\end{pmatrix}=\begin{pmatrix} dM \\ 1-k_1s_1 \\1-k_2s_2 \\ ... \\ 1-k_rs_r\end{pmatrix}
$$<p>
转置得到这个矩阵来进行LLL：
</p>
$$
\begin{pmatrix}
    M      &e_1       &e_2        & \dotsb &e_r        \\
    0       & -N_1    & 0           & \dotsb & 0           \\
    0       & 0       & -N_2    & \dotsb & 0           \\
    \vdots  & \vdots  & \vdots      & \ddots & \vdots      \\
    0       & 0       & 0           & \dotsb & -N_r
\end{pmatrix}
$$<h2 id="题">题<a href="#%e9%a2%98" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<div class="code-shell">
    <span class="code-lang">python</span>
    <div class="code-block">
        <div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">Crypto.Util.number</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">random</span> <span class="kn">import</span> <span class="n">randint</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">secret</span> <span class="kn">import</span> <span class="n">flag</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">flag</span> <span class="o">=</span> <span class="n">bytes_to_long</span><span class="p">(</span><span class="n">flag</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">d</span> <span class="o">=</span> <span class="n">getPrime</span><span class="p">(</span><span class="n">randint</span><span class="p">(</span><span class="mi">370</span><span class="p">,</span> <span class="mi">390</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">enc</span><span class="p">(</span><span class="n">i</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="n">p</span> <span class="o">=</span> <span class="n">getPrime</span><span class="p">(</span><span class="mi">512</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">q</span> <span class="o">=</span> <span class="n">getPrime</span><span class="p">(</span><span class="mi">512</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">n</span> <span class="o">=</span> <span class="n">p</span> <span class="o">*</span> <span class="n">q</span>
</span></span><span class="line"><span class="cl">    <span class="n">phi</span> <span class="o">=</span> <span class="p">(</span><span class="n">p</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">q</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">e</span> <span class="o">=</span> <span class="n">inverse</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">phi</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">c</span> <span class="o">=</span> <span class="nb">pow</span><span class="p">(</span><span class="n">flag</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;e_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s1"> =&#39;</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;n_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s1"> =&#39;</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;c_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s1"> =&#39;</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">&#39;__main__&#39;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">3</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">enc</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># e_0 = 37389635736858807810703086504264263440188928763651776502954117173983775626039037008534821321761858567723984257427640816113325770208734640385635663643682102780255726244659849205653007212192504491177021176624605722718152646889627480051142935241036578957272339153039961711802753021931124235464986935316295647379</span>
</span></span><span class="line"><span class="cl"><span class="c1"># n_0 = 87704526707772151782606625126900349506318713860335977395824997219721333991491994027303721441548488339412359519408127174109547119019245873976917916080340858937125736650376514406944094998893225164676363063781400756374403299951466867573215964360920244878373810391250391475087527409213204756990192602517961590163</span>
</span></span><span class="line"><span class="cl"><span class="c1"># c_0 = 78656123855003406993963573497876652287109947684890741747390020445306861422604130132525802389554149844489256622057009394678814584233565675702142297935509191018145970589418173328145004732595569847696022333024124469320873194195223535859964387627938665526123562969554622541694399263934496631337485091067073489148</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># e_1 = 28535169211141109871379321582501492434722235009040085167442370469971731780018594508141105234950857774463438226249819106596920677559656398153362076685288045484306156454558741088396794170762527953573082734587618137075161676392362016474076363311708889307420903699720319611668580377903356783222664068961626803615</span>
</span></span><span class="line"><span class="cl"><span class="c1"># n_1 = 134298877057487865189085342936485527664167450453080897084604607959501054859295769447683135156167266222961308751016451904929475702646252122360203167489936020076488657815646993920082535307414536854323149177250531362615850689341066360635074886835720438532107976530111551202845697404444502476862934946146194420313</span>
</span></span><span class="line"><span class="cl"><span class="c1"># c_1 = 3208711484494445700905074340207543865325589037128163311082565190422756093807236786011349707275838139469873445326457948489588753029946395247710197747538418278782966047404435385208682596795152082296050804126524129644617710791433973098499266439604632728957505961744280687343384601998774018570047292904007768763</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># e_2 = 27653153186459366670449283776658896188717513017934031993526241644501850206894800647711159987946276669184047769965182746812351757618147642060630769822810070480507035319320426666128599562714143342910248758055424582501972900763786232170145957578683616604737178839977216709381529813768748145393798635858691196687</span>
</span></span><span class="line"><span class="cl"><span class="c1"># n_2 = 82113192811251631639012300385672674439485256963081847790431181633372052788107703751257606763043873164706839243919206719171536710944060815484051324239120708906418093409305166299531826404505861042666985630956832163750255358332156122245372899824101210233079028706971698312018388678352739819636695333269309456613</span>
</span></span><span class="line"><span class="cl"><span class="c1"># c_2 = 79145689398302968140315554300835109898158799236562716569497147385375487041207363302776833573990584370222316102267792795080448018216133931915984139305260191001847394275311719986838969706049641052337337102739487620502723651258075501409442088938776353037366614208693030741599888985069155346722608948495955447606</span></span></span></code></pre></td></tr></table>
</div>
</div>
    </div>
</div>
<p>构造格
</p>
$$
\begin{pmatrix}
    M      & e_0        & e_1         & e_2        \\
    0       & -n_0    & 0            & 0           \\
    0       & 0           & -n_1   & 0           \\
    0       & 0           & 0          &-n_2
\end{pmatrix}
$$<div class="code-shell">
    <span class="code-lang">python</span>
    <div class="code-block">
        <div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">gmpy2</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">sage.all</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="n">e_0</span> <span class="o">=</span> <span class="mi">37389635736858807810703086504264263440188928763651776502954117173983775626039037008534821321761858567723984257427640816113325770208734640385635663643682102780255726244659849205653007212192504491177021176624605722718152646889627480051142935241036578957272339153039961711802753021931124235464986935316295647379</span>
</span></span><span class="line"><span class="cl"><span class="n">n_0</span> <span class="o">=</span> <span class="mi">87704526707772151782606625126900349506318713860335977395824997219721333991491994027303721441548488339412359519408127174109547119019245873976917916080340858937125736650376514406944094998893225164676363063781400756374403299951466867573215964360920244878373810391250391475087527409213204756990192602517961590163</span>
</span></span><span class="line"><span class="cl"><span class="n">c_0</span> <span class="o">=</span> <span class="mi">78656123855003406993963573497876652287109947684890741747390020445306861422604130132525802389554149844489256622057009394678814584233565675702142297935509191018145970589418173328145004732595569847696022333024124469320873194195223535859964387627938665526123562969554622541694399263934496631337485091067073489148</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">e_1</span> <span class="o">=</span> <span class="mi">28535169211141109871379321582501492434722235009040085167442370469971731780018594508141105234950857774463438226249819106596920677559656398153362076685288045484306156454558741088396794170762527953573082734587618137075161676392362016474076363311708889307420903699720319611668580377903356783222664068961626803615</span>
</span></span><span class="line"><span class="cl"><span class="n">n_1</span> <span class="o">=</span> <span class="mi">134298877057487865189085342936485527664167450453080897084604607959501054859295769447683135156167266222961308751016451904929475702646252122360203167489936020076488657815646993920082535307414536854323149177250531362615850689341066360635074886835720438532107976530111551202845697404444502476862934946146194420313</span>
</span></span><span class="line"><span class="cl"><span class="n">c_1</span> <span class="o">=</span> <span class="mi">3208711484494445700905074340207543865325589037128163311082565190422756093807236786011349707275838139469873445326457948489588753029946395247710197747538418278782966047404435385208682596795152082296050804126524129644617710791433973098499266439604632728957505961744280687343384601998774018570047292904007768763</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">e_2</span> <span class="o">=</span> <span class="mi">27653153186459366670449283776658896188717513017934031993526241644501850206894800647711159987946276669184047769965182746812351757618147642060630769822810070480507035319320426666128599562714143342910248758055424582501972900763786232170145957578683616604737178839977216709381529813768748145393798635858691196687</span>
</span></span><span class="line"><span class="cl"><span class="n">n_2</span> <span class="o">=</span> <span class="mi">82113192811251631639012300385672674439485256963081847790431181633372052788107703751257606763043873164706839243919206719171536710944060815484051324239120708906418093409305166299531826404505861042666985630956832163750255358332156122245372899824101210233079028706971698312018388678352739819636695333269309456613</span>
</span></span><span class="line"><span class="cl"><span class="n">c_2</span> <span class="o">=</span> <span class="mi">79145689398302968140315554300835109898158799236562716569497147385375487041207363302776833573990584370222316102267792795080448018216133931915984139305260191001847394275311719986838969706049641052337337102739487620502723651258075501409442088938776353037366614208693030741599888985069155346722608948495955447606</span>
</span></span><span class="line"><span class="cl"><span class="n">M</span><span class="p">,</span><span class="n">exact</span> <span class="o">=</span> <span class="n">gmpy2</span><span class="o">.</span><span class="n">iroot</span><span class="p">(</span><span class="n">n_2</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">M</span><span class="o">=</span><span class="n">ZZ</span><span class="p">(</span><span class="n">M</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">L</span> <span class="o">=</span> <span class="n">matrix</span><span class="p">([</span>
</span></span><span class="line"><span class="cl">    <span class="p">[</span><span class="n">M</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">    <span class="p">[</span><span class="n">e_0</span><span class="p">,</span><span class="o">-</span><span class="n">n_0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">    <span class="p">[</span><span class="n">e_1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="o">-</span><span class="n">n_1</span><span class="p">,</span><span class="mi">0</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">    <span class="p">[</span><span class="n">e_2</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="o">-</span><span class="n">n_2</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">])</span><span class="o">.</span><span class="n">T</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">L</span><span class="o">.</span><span class="n">LLL</span><span class="p">())</span>
</span></span><span class="line"><span class="cl"><span class="n">Md</span> <span class="o">=</span> <span class="n">L</span><span class="o">.</span><span class="n">LLL</span><span class="p">()[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>        
</span></span><span class="line"><span class="cl"><span class="n">d</span> <span class="o">=</span> <span class="n">Md</span><span class="o">//</span><span class="n">M</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">long_to_bytes</span><span class="p">(</span><span class="nb">pow</span><span class="p">(</span><span class="n">c_0</span><span class="p">,</span><span class="n">d</span><span class="p">,</span><span class="n">n_0</span><span class="p">)))</span></span></span></code></pre></td></tr></table>
</div>
</div>
    </div>
</div>
]]></content>
		</item>
		
		<item>
			<title>格密码学习笔记2</title>
			<link>https://p3r0x.github.io/p/%E6%A0%BC%E5%AF%86%E7%A0%81%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B02/</link>
			<pubDate>Wed, 14 Jan 2026 15:30:32 +0800</pubDate><author>Perox</author><guid>https://p3r0x.github.io/p/%E6%A0%BC%E5%AF%86%E7%A0%81%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B02/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<h1 id="格密码学习笔记">格密码学习笔记<a href="#%e6%a0%bc%e5%af%86%e7%a0%81%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h1>
<h1 id="对偶格">对偶格<a href="#%e5%af%b9%e5%81%b6%e6%a0%bc" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h1>
<h2 id="定义">定义<a href="#%e5%ae%9a%e4%b9%89" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>对偶格也叫倒易格，对一个满秩格Λ，定义对偶格为：</p>
<img src="Snipaste_2026-01-14_15-38-02.png" style="zoom:30%;" />
<p>只要y与对偶格的内积为整数就属于对偶格</p>
<p>一般情况（非满秩）下，</p>
<img src="Snipaste_2026-01-14_15-44-47.png" style="zoom:30%;" />
<p>span(Λ)是格的张成空间</p>
<p>几何解释：</p>
<img src="Snipaste_2026-01-14_16-03-00.png" style="zoom:40%;" />
<p>固定一个向量x，找出与向量x内积为整数的点，这些点都在同一个超平面（多维空间的平面）上，点之间的距离为1/||x||</p>
<h2 id="对偶基">对偶基<a href="#%e5%af%b9%e5%81%b6%e5%9f%ba" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<h3 id="定义-1">定义<a href="#%e5%ae%9a%e4%b9%89-1" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<img src="Snipaste_2026-01-14_16-08-17.png" style="zoom:40%;" />
<p>对于一个基B(b1,b2&hellip;.bn)，和它的对偶基D(d1,d2,&hellip;.dn)满足两个条件：</p>
<ol>
<li>张成空间相同</li>
<li>B的转置矩阵和D的乘积为I，I就是单位矩阵E所以对角线为1其余为0，也就是&lt;bi,di&gt;=1,&lt;bi,dj&gt;=0</li>
</ol>
<p>D是唯一的，在满秩格的情况下，
</p>
$$
D=(B^T)^{-1}
$$<p>
一般情况下：
</p>
$$
D=B(B^TB)^{-1}
$$<h2 id="对偶格的性质">对偶格的性质<a href="#%e5%af%b9%e5%81%b6%e6%a0%bc%e7%9a%84%e6%80%a7%e8%b4%a8" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<h3 id="定理1">定理1<a href="#%e5%ae%9a%e7%90%861" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>一个格的对偶格的基正好是这个格的基的对偶基</p>
<p>如果D为B的对偶基，那么(L(B))^* =L(D)</p>
<p>证明过程：<img src="./index.assets/Snipaste_2026-01-14_16-41-19.png" style="zoom:40%;" /></p>
<h3 id="定理2">定理2<a href="#%e5%ae%9a%e7%90%862" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>给定一个格Λ，$(Λ^*)^*=Λ$，</p>
<h3 id="定理3">定理3<a href="#%e5%ae%9a%e7%90%863" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>对偶格的行列式和原本格的行列式满足
</p>
$$
det(Λ^*)=\frac{1}{det(Λ)}
$$<h4 id="证明过程">证明过程<a href="#%e8%af%81%e6%98%8e%e8%bf%87%e7%a8%8b" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h4>
<p>对于满秩格来说：</p>
<p>依靠线性代数：矩阵的逆的行列式等于矩阵的行列式的倒数，矩阵的转置的行列式等于矩阵的行列式</p>
<img src="Snipaste_2026-01-14_18-31-27.png" style="zoom:50%;" />
<p>对非满秩格：</p>
<img src="Snipaste_2026-01-14_18-32-25.png" style="zoom:50%;" />
<p>原来的格行列式（体积）越小，对偶格的行列式（体积）就越大，格密度就大，格的分布就越稀</p>
<h3 id="定理4">定理4<a href="#%e5%ae%9a%e7%90%864" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>对任意秩为n的格Λ：
</p>
$$
λ1(Λ)⋅λ1(Λ^∗)≤n
$$<p>λ1(Λ)表示最短向量长度</p>
<img src="Snipaste_2026-01-14_18-50-49.png" style="zoom:50%;" />
<p>上下两个相乘就可以得到这个式子</p>
<h3 id="定理5">定理5<a href="#%e5%ae%9a%e7%90%865" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>对于任意秩为n的格Λ：
</p>
$$
λ_1(Λ)⋅λ_n(Λ^∗)≥1
$$<p>
取原格中的最短向量v，使：
</p>
$$
||v||= \lambda_1(Λ)
$$<p>
取对偶格Λ* 中的n给无关向量，x1,x2&hellip;.xn（Λ<em>为秩为n的格），它们不可能全部与v正交，因此存在某个i使得&lt;xi,v&gt;≠0，根据对偶格的定义&lt;xi,v&gt;∈Z，所以
$$
||xi||≥ \frac{1}{||v||}
$$
因为λn(Λ</em> )肯定&gt;||xi||，所以结果成立</p>
<p>+++</p>
<p>对一组基b1,b2&hellip;.bn，让πi投影到空间$span(b_1,…,b_{i−1})^⊥$，特别的，π1b1,π2b2,&hellip;..,πnbn，就是b1,b2,&hellip;,bn正交化后的结果</p>
<p>⊥叫“正交补”表示与该子空间中的所有向量都正交的向量构成的集合</p>
<p>+++</p>
<h3 id="定理6">定理6<a href="#%e5%ae%9a%e7%90%866" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>设B，D为一组对偶基，B’=(πi(bi),&hellip;,πi(bn))和，D’=(di,&hellip;,dn)也是对偶基</p>
<img src="Snipaste_2026-01-14_20-24-49.png" style="zoom:40%;" />
<p>要证明B’和D’为对偶基，需要证明，span(B’)=span(D’)，和$B'^TD'=I$,等价于 ⟨bj,dk⟩=σ_ij</p>
<p>因为dj与b1,&hellip;.,bn都正交，所以dj∈$span(b_1,…,b_{i−1})^⊥$，D’=(di,&hellip;,dn)，所以span(D’)=$span(b_1,…,b_{i−1})^⊥$</p>
<p>因为πi(bk)是把bk投影到$span(b_1,…,b_{i−1})^⊥$，所以span(B’)=$span(b_1,…,b_{i−1})^⊥$，所以span(B’)=span(D’)</p>
<h3 id="定理7">定理7<a href="#%e5%ae%9a%e7%90%867" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>设对偶格基为B,D，B=（b1,b2,&hellip;,bn），D=(d1,d2,&hellip;,dn)</p>
<p>所以B正交化后=
</p>
$$
\tilde{b}_1,....., \tilde{b}_n
$$<p>
D正交化=
</p>
$$
\tilde{d}_1,....., \tilde{d}_n
$$<p>
长度满足：
</p>
$$
\tilde{d}_i= \frac{\tilde{b_i}}{||\tilde{b_i}||^2}
$$<p>
证明采用对n的归纳法，假设对秩为n-1的格成立，来证明对秩为n的格成立：</p>
<img src="Snipaste_2026-01-14_21-30-16.png" style="zoom:40%;" />
<h2 id="korkine-zolotarev-bases">Korkine-Zolotarev bases<a href="#korkine-zolotarev-bases" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<h3 id="定义-2">定义<a href="#%e5%ae%9a%e4%b9%89-2" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>对一个秩为n的格Λ，其KZ基b1,b2&hellip;..bn递归定义如下：</p>
<ol>
<li>
<p>令b1为格Λ中的短向量</p>
</li>
<li>
<p>令 Λ′为将Λ投影到span(Λ)中与b1正交的子空间所得的格</p>
</li>
<li>
<p>令c2&hellip;.cn 为Λ′的KZ基</p>
</li>
<li>
<p>定义
</p>
$$
   b_i=c_i+α_ib_i
   $$<p>
αi∈（-1/2，1/2]，是让bi∈Λ成立的唯一数</p>
</li>
</ol>
<img src="Snipaste_2026-01-16_12-25-18.png" style="zoom:33%;" />
<h1 id="参考链接">参考链接<a href="#%e5%8f%82%e8%80%83%e9%93%be%e6%8e%a5" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h1>
<p><a href="https://cims.nyu.edu/~regev/teaching/lattices_fall_2004/" target="_blank" >计算机科学中的格（2004 年秋季） &mdash; Lattices in Computer Science (Fall 2004)</a></p>
]]></content>
		</item>
		
		<item>
			<title>格密码学习笔记 1</title>
			<link>https://p3r0x.github.io/p/%E6%A0%BC%E5%AF%86%E7%A0%81%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-1/</link>
			<pubDate>Sat, 10 Jan 2026 16:09:51 +0800</pubDate><author>Perox</author><guid>https://p3r0x.github.io/p/%E6%A0%BC%E5%AF%86%E7%A0%81%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-1/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<h1 id="格密码学习笔记">格密码学习笔记<a href="#%e6%a0%bc%e5%af%86%e7%a0%81%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h1>
<p>记录一下学习 LLL 算法，以 Regev 的讲义为主加上网上搜的其他资料，主要是 LLL ==</p>
<h2 id="lll-算法">LLL 算法<a href="#lll-%e7%ae%97%e6%b3%95" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<h3 id="算法目的">算法目的<a href="#%e7%ae%97%e6%b3%95%e7%9b%ae%e7%9a%84" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>用于解决最短向量问题的多项式时间复杂度算法，目的简单说就是将坏基转化为好基</p>
<img src="Snipaste_2026-01-10_17-00-56.png" style="zoom:30%;" />
<p>好基：</p>
<ul>
<li>向量短</li>
<li>接近正交（垂直）</li>
</ul>
<p>坏基：</p>
<ul>
<li>向量长</li>
<li>接近平行</li>
</ul>
<h3 id="lll-约简基">LLL 约简基<a href="#lll-%e7%ba%a6%e7%ae%80%e5%9f%ba" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<h4 id="gram-schmidt-正交化">Gram-Schmidt 正交化<a href="#gram-schmidt-%e6%ad%a3%e4%ba%a4%e5%8c%96" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h4>
<img src="Snipaste_2026-01-10_17-55-49.png" style="zoom:30%;" />
<h4 id="进行-δ-lll-约基简的条件">进行 δ-LLL 约基简的条件<a href="#%e8%bf%9b%e8%a1%8c-%ce%b4-lll-%e7%ba%a6%e5%9f%ba%e7%ae%80%e7%9a%84%e6%9d%a1%e4%bb%b6" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h4>
<img src="Snipaste_2026-01-10_17-32-54.png" style="zoom:40%;" />
<p>σ = 3/4，bi 线性无关向量，上面有个~的是正交化后的正交向量，μi, j 是 bi 在 bj（正交化） 上的投影系数</p>
<h5 id="尺寸约减条件一">尺寸约减（条件一）<a href="#%e5%b0%ba%e5%af%b8%e7%ba%a6%e5%87%8f%e6%9d%a1%e4%bb%b6%e4%b8%80" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h5>
<p>第 i 个原始基向量 bi 在前个正交化向量 bj 上的投影系数 ui, j 的绝对值不超过二分之一, 目的是为了让基向量更接近正交</p>
<h5 id="lovász-条件条件二">Lovász 条件（条件二）<a href="#lov%c3%a1sz-%e6%9d%a1%e4%bb%b6%e6%9d%a1%e4%bb%b6%e4%ba%8c" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h5>
<p>正交化的第 i 个模长的平方的 σ 倍小于右边，给第 i+1 个正交化的向量规定了下限</p>
<p>因为 ~ b i 和 ~ b(i+1) 都进行了正交化，所以内积等于 0，两者和的平方就可以看作两者平方之和，</p>
<p>由 <strong>条件一</strong> 可以得到 u 小于 1/2，所以 u² 应该小于 1/4，所以比较小，~bi+1 的平方加上这个比较小的数大于等于 σ 倍 ~bi 的平方，所以 <strong>限制 ~bi+1 的长度不能太短</strong></p>
<h3 id="svp-问题">SVP 问题<a href="#svp-%e9%97%ae%e9%a2%98" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>最短向量问题（SVP）：给定一个格 L，找到一个非零向量 v，使得对于格 L 中任意一个非零向量 u，都满足 ∥v∥≤∥u∥（即 v 是格中长度最短的非零向量）</p>
<h3 id="近似cvp问题">近似CVP问题<a href="#%e8%bf%91%e4%bc%bccvp%e9%97%ae%e9%a2%98" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>cvp可定义搜索问题，优化问题和决策问题。</p>
<img src="Snipaste_2026-01-12_13-40-05.png" style="zoom:30%;" />
$$
(CVP_γ,搜索):在\mathcal{L}(B)里找一个点x，让x到t的距离，不超过格里其他点到t的距离的γ倍\\
(CVP_γ,优化):找一个数r，使得r属于最短距离和最短距离的γ倍之间\\
(CVP_γ,判断):给定一个数r，来判断最短距离 ≤ r|最短距离＞γ⋅r
$$
上面γ≥1为近似因子。当γ=1时，为精确cvp问题
<p>可以用babai算法解决CVP搜索问题，其中γ=2^n/2^</p>
<img src="Snipaste_2026-01-12_14-28-20.png" style="zoom:30%;" />
<h2 id="参考链接">参考链接<a href="#%e5%8f%82%e8%80%83%e9%93%be%e6%8e%a5" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p><a href="https://www.cnblogs.com/3cH0-Nu1L/p/19313812#%e7%ac%ac%e4%b8%80%e7%ab%a0-lll%e7%ae%97%e6%b3%95%e6%a6%82%e8%bf%b0" target="_blank" >LLL 格基约简算法（2） - 3cH0_Nu1L - 博客园</a></p>
<p><a href="https://cims.nyu.edu/~regev/teaching/lattices_fall_2004/" target="_blank" >计算机科学中的格（2004 年秋季） &mdash; Lattices in Computer Science (Fall 2004)</a></p>
]]></content>
		</item>
		
		<item>
			<title>格密码学习笔记</title>
			<link>https://p3r0x.github.io/p/%E6%A0%BC%E5%AF%86%E7%A0%81%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</link>
			<pubDate>Fri, 09 Jan 2026 17:24:37 +0800</pubDate><author>Perox</author><guid>https://p3r0x.github.io/p/%E6%A0%BC%E5%AF%86%E7%A0%81%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<h1 id="格密码学习笔记">格密码学习笔记<a href="#%e6%a0%bc%e5%af%86%e7%a0%81%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h1>
<h2 id="1格的定义">1.格的定义<a href="#1%e6%a0%bc%e7%9a%84%e5%ae%9a%e4%b9%89" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p><strong>基</strong>：向量的集合，例如基向量（0，1）和（1，0）构成一个基</p>
<p><strong>格</strong>：由基向量线性组合，</p>
<img src="Snipaste_2026-01-09_17-29-26.png" alt="格" style="zoom:30%;" />
<p><strong>秩与维度</strong>：秩为基向量的个数 n，维度空间所在的维度 m。若 n = m 则称这个格为满秩格</p>
<p><strong>基本平行体(Fundamental Parallelepiped)</strong>：基本平行体是由格的基向量围绕成的一个半闭半开的区域，给出一组线性无关的向量 b1, b2&hellip;., bn∈Rn，基本平行体就是：
</p>
$$
P(\mathbf{b}_1, \mathbf{b}_2, \dots, \mathbf{b}_n) = \left\{ \sum_{i = 1}^{n} z_i \mathbf{b}_i \mid z_1, z_2, \dots, z_n \in \mathbb{Z},\ 0 \le z_i < 1 \right\}
$$<p>
例如：</p>
<img src="Snipaste_2026-01-09_17-57-58.png" style="zoom:30%;" />
<p>图 a 的阴影面积为（0，1）和（1，0）组成的基本平行体，图 b 的阴影面积为（1，1）和（2，1）组成的</p>
<p><strong>行列式和体积</strong>：这个基本平行体的体积 = 行列式，令 B 是格 L 的基矩阵，则格 L 的行列式定义为 det(L)=|det(B)|，以图 a 为例子，
</p>
$$
\mathrm{Vol}(A) = \left| \det\begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix} \right| = 1
$$<p>
然后可以通过幺模变换来相互转换的基向量等价，简单说就是基向量可以通过幺模变换变成另一组基向量，这两组基向量的行列式一样，表示的格都一样</p>
<ul>
<li>幺模变换：由幺模矩阵定义的线性变换</li>
<li>幺模矩阵：设 U 为整数矩阵，满足
<ul>
<li>U 的所有元素都是整数</li>
<li>det(U)= ±1（行列式绝对值为 1）</li>
<li>幺模矩阵的逆矩阵也是幺模矩阵</li>
</ul>
</li>
</ul>
<p>表示为：
</p>
$$
B'= B\ *\ U
$$<p>
<strong>格的扩展空间</strong>：格基实系数组合生成的空间称为格的延展空间，表示为$span(L(B))=span(B)={Ba|a∈R^n}$，当格为满秩格时格的扩展空间是整个n维空间</p>
<p>在格空间内有两个困难问题：</p>
<ul>
<li><a href="https://en.wikipedia.org/wiki/Lattice_problem#Shortest_vector_problem_%28SVP%29" target="_blank" >最短向量问题 Shortest_vector_problem</a>：寻找格中的最短向量</li>
<li><a href="https://en.wikipedia.org/wiki/Lattice_problem#Closest_vector_problem_%28CVP%29" target="_blank" >最近向量问题 Closest_vector_problem</a>：寻找一个非格点距离最近的格点</li>
</ul>
<h2 id="gram-schmidt-正交化">Gram-Schmidt 正交化<a href="#gram-schmidt-%e6%ad%a3%e4%ba%a4%e5%8c%96" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<img src="Snipaste_2026-01-09_18-38-02.png" style="zoom:30%;" />
<h3 id="正交化过程">正交化过程<a href="#%e6%ad%a3%e4%ba%a4%e5%8c%96%e8%bf%87%e7%a8%8b" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>设有一组线性无关的向量α1α2&hellip;.αn，目标是构造正交向量组β1β2&hellip;βn，</p>
<p>正交化流程
</p>
$$
\beta_1 = \alpha_1\\
\beta_2 = \alpha_2 - \frac{(\alpha_2, \beta_1)}{(\beta_1, \beta_1)}\beta_1\\
\beta_3 = \alpha_3 - \frac{(\alpha_3, \beta_1)}{(\beta_1, \beta_1)}\beta_1 - \frac{(\alpha_3, \beta_2)}{(\beta_2, \beta_2)}\beta_2\\
所以\beta_n = \alpha_n - \sum_{i = 1}^{n-1}\frac{(\alpha_n, \beta_i)}{(\beta_i, \beta_i)}\beta_i\\
投影的系数：\mu_{n,i} = \frac{(\alpha_n, \beta_i)}{(\beta_i, \beta_i)}\\
标准化：\\
e_n = \frac{\beta_n}{|\beta_n|}
$$<h2 id="3successive-minima逐次极小">3.Successive Minima（逐次极小）<a href="#3successive-minima%e9%80%90%e6%ac%a1%e6%9e%81%e5%b0%8f" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>逐次极小描述了在一个空间中，一个凸集（比如一个对称的、中心在原点的物体）能装下多少个线性无关的、越来越长的格向量</p>
<h3 id="31最短非零向量λ1">3.1最短非零向量λ1<a href="#31%e6%9c%80%e7%9f%ad%e9%9d%9e%e9%9b%b6%e5%90%91%e9%87%8f%ce%bb1" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>格Λ是由一组基向量线性组合（系数为整数）生成的向量集合。在这个集合里，去掉零向量后，所有非零向量中 “长度最短” 的那个向量的长度，就记为λ1（Λ）
</p>
$$
λ1(Λ)=inf \{∥v∥∣v∈Λ∖{0}\}
$$<p>
Λ\0表示格Λ中除0之外的所有向量，inf表示最小值</p>
<h3 id="32逐次极小的一般定义λiλ">3.2逐次极小的一般定义λi（Λ）<a href="#32%e9%80%90%e6%ac%a1%e6%9e%81%e5%b0%8f%e7%9a%84%e4%b8%80%e8%88%ac%e5%ae%9a%e4%b9%89%ce%bbi%ce%bb" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>公式：
</p>
$$
\lambda_k(\Lambda) = \inf\left\{ r>0 \mid \exists \text{ 线性无关的 } \boldsymbol{v}_1,\dots,\boldsymbol{v}_k \in \Lambda \cap C(r) \right\}
$$<ul>
<li>λk（Λ）：表示格Λ的第k个逐次极小</li>
<li>C(r)：指以原点为中心、半径为r的闭球</li>
<li>Λ∩C(r)：格Λ中落在这个球里的所有向量</li>
</ul>
<p>闭球C(r)：以原点为中心、半径为 ( r ) 的欧氏闭球，是所有到原点的距离不超过r的向量v的集合</p>
<p>这个公式表示：找到最小的半径r，使得该闭球内存在k个线性无关的格向量</p>
<h2 id="blichfeld理论">BLICHFELD理论<a href="#blichfeld%e7%90%86%e8%ae%ba" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>对任意满秩格 $\Lambda \subseteq \mathbb{R}^n$ 以及可测集 $S \subseteq \mathbb{R}^n$，若 S 的体积 $\text{vol}(S) > \det\Lambda$，则必存在S中两个不同的点 $(z_1,z_2)$，使得 $(z_1 - z_2 \in \Lambda)$</p>
<p>如果集合S的体积比A的大（格A的体积等于行列式），那么存在集合的两个点的差属于格A</p>
<img src="Snipaste_2026-01-20_14-24-11.png" style="zoom:50%;" />
<h2 id="闵可夫斯基凸体定理">闵可夫斯基凸体定理<a href="#%e9%97%b5%e5%8f%af%e5%a4%ab%e6%96%af%e5%9f%ba%e5%87%b8%e4%bd%93%e5%ae%9a%e7%90%86" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>设任意满秩格 $\Lambda \subseteq \mathbb{R}^n$ ，$S⊂R^n$是一个凸的、中心对称的集合，如果$val(S)>2^ndet(A)$，那么$S∩(\Lambda \backslash \{0 \}≠∅)$，S中一定包含一个格向量。</p>
<img src="Snipaste_2026-01-20_14-40-19.png" style="zoom:50%;" />
<h2 id="闵可夫斯基定理第二定理">闵可夫斯基定理第二定理<a href="#%e9%97%b5%e5%8f%af%e5%a4%ab%e6%96%af%e5%9f%ba%e5%ae%9a%e7%90%86%e7%ac%ac%e4%ba%8c%e5%ae%9a%e7%90%86" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>对任意n维格Λ：</p>
<img src="Snipaste_2026-01-09_19-37-54.png" style="zoom:33%;" />
<p>Hermite定理:</p>
<p><img src="/p/%E6%A0%BC%E5%AF%86%E7%A0%81%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/Snipaste_2025-12-25_17-49-16.png" alt=""></p>
<p>n表示维度，为基向量的个数</p>
<p>公式含义：格的n个相继极小的乘积的n次方根，不超过Hermite常数的平方根与格行列式的n次方根的乘积</p>
<h2 id="参考链接">参考链接<a href="#%e5%8f%82%e8%80%83%e9%93%be%e6%8e%a5" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p><a href="https://www.ruanx.net/lattice-5/" target="_blank" >格密码笔记（五）</a></p>
<p><a href="https://zh.wikipedia.org/wiki/%e6%a0%bc%e6%8b%89%e5%a7%86-%e6%96%bd%e5%af%86%e7%89%b9%e6%ad%a3%e4%ba%a4%e5%8c%96" target="_blank" >格拉姆-施密特正交化 - 维基百科，自由的百科全书</a></p>
<p><a href="https://blog.csdn.net/2303_79193185/article/details/149266626" target="_blank" >格密码&ndash;数学基础&ndash;05Successive Minima与闵可夫斯基第二定理及赫米特常数_闵可夫斯基格点定理-CSDN博客</a></p>
<p>原讲义：<a href="https://cims.nyu.edu/~regev/teaching/lattices_fall_2004/" target="_blank" >Lattices in Computer Science (Fall 2004)</a></p>
]]></content>
		</item>
		
		<item>
			<title>Coppersmith定理的几种攻击情况的学习</title>
			<link>https://p3r0x.github.io/p/coppersmith%E5%AE%9A%E7%90%86%E7%9A%84%E5%87%A0%E7%A7%8D%E6%94%BB%E5%87%BB%E6%83%85%E5%86%B5%E7%9A%84%E5%AD%A6%E4%B9%A0/</link>
			<pubDate>Fri, 02 Jan 2026 20:47:05 +0800</pubDate><author>Perox</author><guid>https://p3r0x.github.io/p/coppersmith%E5%AE%9A%E7%90%86%E7%9A%84%E5%87%A0%E7%A7%8D%E6%94%BB%E5%87%BB%E6%83%85%E5%86%B5%E7%9A%84%E5%AD%A6%E4%B9%A0/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<h1 id="coppersmith-定理的几种攻击情况的学习">coppersmith 定理的几种攻击情况的学习<a href="#coppersmith-%e5%ae%9a%e7%90%86%e7%9a%84%e5%87%a0%e7%a7%8d%e6%94%bb%e5%87%bb%e6%83%85%e5%86%b5%e7%9a%84%e5%ad%a6%e4%b9%a0" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h1>
<p>Coppersmith 可以用于求多项式的小根，经常用于 RSA 攻击中“已知某些二进制位，求剩余位”这一类问题</p>
<p>给定：</p>
<ul>
<li>模数 N（通常很大，如 RSA 模数）</li>
<li>模 N 的多项式 f(x)（通常为单变量）</li>
<li>边界 X</li>
</ul>
<p>寻找所有满足 f(x0) ≡ 0 (mod N)且 ∣x0∣ &lt; X 的整数根 x0</p>
<p>成立的条件：
</p>
$$
|x_0|\ <\ N^{1/deg(f)}\\
$$<p>
deg(f)为多项式最高项次数</p>
<h2 id="1basic-boradcast-attack-广播攻击">1.basic boradcast attack 广播攻击<a href="#1basic-boradcast-attack-%e5%b9%bf%e6%92%ad%e6%94%bb%e5%87%bb" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<h3 id="攻击原理">攻击原理<a href="#%e6%94%bb%e5%87%bb%e5%8e%9f%e7%90%86" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<div class="code-shell">
    <span class="code-lang">text</span>
    <div class="code-block">
        <div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Broadcast attack 是 Håstad attack，不是 Coppersmith，只是经常一起出现</span></span></code></pre></td></tr></table>
</div>
</div>
    </div>
</div>
<p>使用同一个指数 e 加密同一个密文 m，产生 e 个明文，形如：
</p>
$$
c_1 \equiv m^e \pmod{n_1} \\
c_2 \equiv m^e \pmod{n_2} \\
\vdots \\
c_e \equiv m^e \pmod{n_e}
$$<p>
n1, n2&hellip;互素，</p>
<p>是 m ≤ min(n₁, n₂, …, nₑ)，即明文 m 必须小于等于所有模数中的最小值</p>
<p>然后解中国剩余定理</p>
<p>根据中国剩余定理（CRT），可以求解：</p>
<p>mᵉ ≡ C (mod N)</p>
<p>其中 N = n₁ × n₂ × … × nₑ</p>
<p>因为 m ≤ min(n₁, n₂, …, nₑ)，m^e^ &lt; n₁ × n₂ × … × nₑ</p>
<p>mᵉ &lt; N，则可以直接对 C 开 e 次方根得到明文 m：m = ᵉ√C</p>
<h2 id="rsa-高位攻击">RSA 高位攻击<a href="#rsa-%e9%ab%98%e4%bd%8d%e6%94%bb%e5%87%bb" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>内容参考：</p>
<p><a href="https://blog.csdn.net/lc9992023/article/details/141112336" target="_blank" >RSA_高位攻击学习记录_rsa 已知高位攻击-CSDN 博客</a></p>
<p><a href="https://blog.csdn.net/qq_51999772/article/details/123620932" target="_blank" >RSA 中 coppersmith 定理的应用条件-CSDN 博客</a></p>
<p><a href="https://www.ruanx.net/coppersmith/" target="_blank" >Coppersmith 攻击</a></p>
<p>知道部分二进制位，求剩余二进制位，<strong>只有未知的 bit 位满足 unknown_bits / p_bits &lt;= 0.44（即 coppersmith 定理）时，才能通过 small_roots()方法求出未知的 bit 位，进而求解 flag</strong></p>
<p>small_roots(X = , beta = )的使用方法：</p>
<div class="code-shell">
    <span class="code-lang">sage</span>
    <div class="code-block">
        <div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sage" data-lang="sage"><span class="line"><span class="cl"><span class="n">R</span><span class="o">.&lt;</span><span class="n">x</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">PolynomialRing</span><span class="p">(</span><span class="n">Zmod</span><span class="p">(</span><span class="n">N</span><span class="p">))</span>      <span class="c1"># 定义模N的多项式环</span>
</span></span><span class="line"><span class="cl"><span class="n">f</span> <span class="o">=</span> <span class="p">(</span><span class="n">x</span> <span class="o">+</span> <span class="n">a</span><span class="p">)</span><span class="o">^</span><span class="n">e</span> <span class="o">-</span> <span class="n">c</span>                     <span class="c1"># 定义多项式</span>
</span></span><span class="line"><span class="cl"><span class="n">roots</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">small_roots</span><span class="p">(</span><span class="n">X</span><span class="o">=</span><span class="p">,</span><span class="n">beta</span><span class="o">=</span><span class="p">)</span></span></span></code></pre></td></tr></table>
</div>
</div>
    </div>
</div>
<p>看不懂，让 ai 细说了一下</p>
<p>边界因素 X：</p>
<ol>
<li>已知根的比特 k 的情况下，X = 2^k^</li>
<li>已知根的大致范围 [0,1000]，X = 1000</li>
<li>理论边界：根据 coppersmith: X &lt; N^1/e^，所以 X = floor(N^1/e^)</li>
<li>因子的部分比特攻击，知道了 p 的高位，p = p_high+x，所以 X = 2^unknown_bits^</li>
</ol>
<p>beta 参数（β）：当 p, q 二进制位数相同时一般只能取 0.4</p>
<ol>
<li>
<p>在模 N 上寻找根，如果根满足 f(x) ≡ 0 (mod N)，beta = 1</p>
</li>
<li>
<p>在模 p 上寻找根，且 p 约等于 N^0.5^（RSA 情况），p 是 N 的一个因子，p ≈ √N ≈ N^0.5，beta = 0.5，因为 p ≈ N^0.5，所以 β = 0.5</p>
</li>
<li>
<p>在模 p 上寻找根，但 p 的大小不同：</p>
<p>如果 p ≈ N^0.3^：beta = 0.3</p>
<p>如果 p ≈ N^0.25：beta = 0.25</p>
</li>
<li>
<p>寻找模 N 的小根：beta = 1.0</p>
</li>
</ol>
<table>
  <thead>
      <tr>
          <th>攻击目标</th>
          <th>模数</th>
          <th>β</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>模 N 求根</td>
          <td>N</td>
          <td>1.0</td>
      </tr>
      <tr>
          <td>模 p（RSA）</td>
          <td>p ≈ N^0.5</td>
          <td>0.5</td>
      </tr>
      <tr>
          <td>模 p ≈ N^0.3</td>
          <td>p</td>
          <td>0.3</td>
      </tr>
  </tbody>
</table>
<h3 id="已知-p-高位">已知 p 高位<a href="#%e5%b7%b2%e7%9f%a5-p-%e9%ab%98%e4%bd%8d" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>知道 p 的前 k 位，记低位为 x，所以 p = p_high * 2^k^ + x，算出 p 的低位 x 后直接用 small_roots</p>
<div class="code-shell">
    <span class="code-lang">python</span>
    <div class="code-block">
        <div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">Crypto.Util.number</span> <span class="kn">import</span><span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="n">getPrime</span><span class="p">(</span><span class="mi">1024</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">q</span> <span class="o">=</span> <span class="n">getPrime</span><span class="p">(</span><span class="mi">1024</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">n</span><span class="o">=</span> <span class="n">p</span> <span class="o">*</span> <span class="n">q</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p_high</span> <span class="o">=</span> <span class="n">p</span> <span class="o">&gt;&gt;</span> <span class="mi">300</span><span class="c1">#已知高位1024-300bits</span>
</span></span><span class="line"><span class="cl"><span class="n">pbits</span> <span class="o">=</span> <span class="mi">1024</span>
</span></span><span class="line"><span class="cl"><span class="n">kbits</span> <span class="o">=</span> <span class="n">pbits</span> <span class="o">-</span> <span class="n">p_high</span><span class="o">.</span><span class="n">bit_length</span><span class="p">()</span><span class="c1">#低位300bits</span>
</span></span><span class="line"><span class="cl"><span class="n">p_high</span> <span class="o">=</span> <span class="n">p_high</span> <span class="o">&lt;&lt;</span> <span class="n">kbits</span><span class="c1">#移动回去把低位空出来</span>
</span></span><span class="line"><span class="cl"><span class="n">PR</span><span class="o">.&lt;</span><span class="n">x</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">PolynomialRing</span><span class="p">(</span><span class="n">Zmod</span><span class="p">(</span><span class="n">n</span><span class="p">))</span><span class="c1">#多项式环</span>
</span></span><span class="line"><span class="cl"><span class="n">f</span> <span class="o">=</span> <span class="n">x</span> <span class="o">+</span> <span class="n">p_high</span>
</span></span><span class="line"><span class="cl"><span class="n">p0</span><span class="o">=</span><span class="n">f</span><span class="o">.</span><span class="n">small_roots</span><span class="p">(</span><span class="mi">2</span><span class="o">**</span><span class="n">kbits</span><span class="p">,</span><span class="mf">0.4</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">p0</span><span class="o">+</span><span class="n">p_high</span><span class="p">)</span></span></span></code></pre></td></tr></table>
</div>
</div>
    </div>
</div>
<h3 id="已知-p-高位q-低位">已知 p 高位，q 低位<a href="#%e5%b7%b2%e7%9f%a5-p-%e9%ab%98%e4%bd%8dq-%e4%bd%8e%e4%bd%8d" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>已知的 p 高位不满足 unknown_bits / p_bits &lt;= 0.44，且知道 q 的低位，低位数 x</p>
<p>解题方法省个流就是：
</p>
$$
p_{\text{low}} = p \bmod 2^{x} = \left( n \cdot q_{\text{low}}^{-1} \right) \bmod 2^{x}
$$<p>
然后用 small_roots 算出中间的未知数然后加起来就可以了</p>
<div class="code-shell">
    <span class="code-lang">python</span>
    <div class="code-block">
        <div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">Crypto.Util.number</span> <span class="kn">import</span> <span class="n">getPrime</span><span class="p">,</span> <span class="n">bytes_to_long</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">secret</span> <span class="kn">import</span> <span class="n">flag</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="n">getPrime</span><span class="p">(</span><span class="mi">1024</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">q</span> <span class="o">=</span> <span class="n">getPrime</span><span class="p">(</span><span class="mi">1024</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">n</span> <span class="o">=</span> <span class="n">p</span> <span class="o">*</span> <span class="n">q</span>
</span></span><span class="line"><span class="cl"><span class="n">e</span> <span class="o">=</span> <span class="mi">65537</span>
</span></span><span class="line"><span class="cl"><span class="n">hint1</span> <span class="o">=</span> <span class="n">p</span> <span class="o">&gt;&gt;</span> <span class="mi">724</span>
</span></span><span class="line"><span class="cl"><span class="n">hint2</span> <span class="o">=</span> <span class="n">q</span> <span class="o">%</span> <span class="p">(</span><span class="mi">2</span> <span class="o">**</span> <span class="mi">265</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span> <span class="o">=</span> <span class="nb">pow</span><span class="p">(</span><span class="n">bytes_to_long</span><span class="p">(</span><span class="n">flag</span><span class="p">),</span> <span class="n">e</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">hint1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">hint2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">c</span><span class="p">)</span></span></span></code></pre></td></tr></table>
</div>
</div>
    </div>
</div>
<p>q 的低位 q_low
</p>
$$
q \bmod 2^{265} = q_{\text{low}}
$$<p>
所以：
</p>
$$
q = k \cdot 2^{265} + q_{\text{low}}
$$<p>
两边同时乘 q 可以得到：
</p>
$$
n = p \cdot \left( k \cdot 2^{265} + q_{\text{low}} \right) = k \cdot 2^{265} \cdot p + q_{\text{low}} \cdot p
$$<p>
同时除以 q_low：
</p>
$$
n \cdot q_{\text{low}}^{-1} = k \cdot 2^{265} \cdot p \cdot q_{\text{low}}^{-1} + p
$$<p>
同时取模 2^265^得到：
</p>
$$
p_{\text{low}} = p \bmod 2^{265} = \left( n \cdot q_{\text{low}}^{-1} \right) \bmod 2^{265}
$$<div class="code-shell">
    <span class="code-lang">python</span>
    <div class="code-block">
        <div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">Crypto.Util.number</span> <span class="kn">import</span><span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="n">p_high</span> <span class="o">=</span> <span class="mi">1514296530850131082973956029074258536069144071110652176122006763622293335057110441067910479</span>
</span></span><span class="line"><span class="cl"><span class="n">q_low</span> <span class="o">=</span> <span class="mi">40812438243894343296354573724131194431453023461572200856406939246297219541329623</span>
</span></span><span class="line"><span class="cl"><span class="n">n</span> <span class="o">=</span> <span class="mi">21815431662065695412834116602474344081782093119269423403335882867255834302242945742413692949886248581138784199165404321893594820375775454774521554409598568793217997859258282700084148322905405227238617443766062207618899209593375881728671746850745598576485323702483634599597393910908142659231071532803602701147251570567032402848145462183405098097523810358199597631612616833723150146418889589492395974359466777040500971885443881359700735149623177757865032984744576285054725506299888069904106805731600019058631951255795316571242969336763938805465676269140733371287244624066632153110685509892188900004952700111937292221969</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span> <span class="o">=</span> <span class="mi">19073695285772829730103928222962723784199491145730661021332365516942301513989932980896145664842527253998170902799883262567366661277268801440634319694884564820420852947935710798269700777126717746701065483129644585829522353341718916661536894041337878440111845645200627940640539279744348235772441988748977191513786620459922039153862250137904894008551515928486867493608757307981955335488977402307933930592035163126858060189156114410872337004784951228340994743202032248681976932591575016798640429231399974090325134545852080425047146251781339862753527319093938929691759486362536986249207187765947926921267520150073408188188</span>
</span></span><span class="line"><span class="cl"><span class="n">e</span> <span class="o">=</span> <span class="mi">65537</span>
</span></span><span class="line"><span class="cl"><span class="n">p_low</span><span class="o">=</span><span class="p">(</span><span class="n">n</span><span class="o">//</span><span class="n">q_low</span><span class="p">)</span><span class="o">%</span><span class="p">(</span><span class="mi">2</span><span class="o">**</span><span class="mi">256</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">p_low</span><span class="p">)</span></span></span></code></pre></td></tr></table>
</div>
</div>
    </div>
</div>
<p>现在有低位 256 和高位 300，所以目前未知位为 459，最多未知位为 1024 * 0.44 = 454，所以要暴力枚举五位</p>
<div class="code-shell">
    <span class="code-lang">python</span>
    <div class="code-block">
        <div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">Crypto.Util.number</span> <span class="kn">import</span><span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="n">p_high</span> <span class="o">=</span> <span class="mi">1514296530850131082973956029074258536069144071110652176122006763622293335057110441067910479</span>
</span></span><span class="line"><span class="cl"><span class="n">q_low</span> <span class="o">=</span> <span class="mi">40812438243894343296354573724131194431453023461572200856406939246297219541329623</span>
</span></span><span class="line"><span class="cl"><span class="n">n</span> <span class="o">=</span> <span class="mi">21815431662065695412834116602474344081782093119269423403335882867255834302242945742413692949886248581138784199165404321893594820375775454774521554409598568793217997859258282700084148322905405227238617443766062207618899209593375881728671746850745598576485323702483634599597393910908142659231071532803602701147251570567032402848145462183405098097523810358199597631612616833723150146418889589492395974359466777040500971885443881359700735149623177757865032984744576285054725506299888069904106805731600019058631951255795316571242969336763938805465676269140733371287244624066632153110685509892188900004952700111937292221969</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span> <span class="o">=</span> <span class="mi">19073695285772829730103928222962723784199491145730661021332365516942301513989932980896145664842527253998170902799883262567366661277268801440634319694884564820420852947935710798269700777126717746701065483129644585829522353341718916661536894041337878440111845645200627940640539279744348235772441988748977191513786620459922039153862250137904894008551515928486867493608757307981955335488977402307933930592035163126858060189156114410872337004784951228340994743202032248681976932591575016798640429231399974090325134545852080425047146251781339862753527319093938929691759486362536986249207187765947926921267520150073408188188</span>
</span></span><span class="line"><span class="cl"><span class="n">e</span> <span class="o">=</span> <span class="mi">65537</span>
</span></span><span class="line"><span class="cl"><span class="n">q_low_inv</span><span class="o">=</span><span class="nb">pow</span><span class="p">(</span><span class="n">q_low</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="o">**</span><span class="mi">265</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p_low</span> <span class="o">=</span> <span class="p">(</span><span class="n">n</span><span class="o">*</span><span class="n">q_low_inv</span><span class="p">)</span><span class="o">%</span><span class="p">(</span><span class="mi">2</span><span class="o">**</span><span class="mi">265</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">p_low</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">PR</span><span class="o">.&lt;</span><span class="n">x</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">PolynomialRing</span><span class="p">(</span><span class="n">Zmod</span><span class="p">(</span><span class="n">n</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">p_high</span><span class="o">=</span><span class="n">p_high</span> <span class="o">&lt;&lt;</span> <span class="mi">724</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">32</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">f</span> <span class="o">=</span> <span class="n">p_high</span> <span class="o">+</span> <span class="n">p_low</span> <span class="o">+</span> <span class="p">(</span><span class="n">x</span> <span class="o">*</span> <span class="mi">32</span> <span class="o">+</span> <span class="n">i</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="mi">2</span><span class="o">**</span><span class="mi">265</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">f</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">monic</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="n">p</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">small_roots</span><span class="p">(</span><span class="mi">2</span><span class="o">**</span><span class="mi">454</span><span class="p">,</span><span class="mf">0.4</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">p</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">x0</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">        <span class="n">p</span><span class="o">=</span><span class="p">(</span><span class="n">x0</span><span class="o">*</span><span class="mi">32</span> <span class="o">+</span> <span class="n">i</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="mi">2</span><span class="o">**</span><span class="mi">265</span><span class="p">)</span> <span class="o">+</span> <span class="n">p_high</span> <span class="o">+</span> <span class="n">p_low</span>
</span></span><span class="line"><span class="cl">        <span class="k">break</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">q</span><span class="o">=</span><span class="n">n</span><span class="o">//</span><span class="n">p</span>
</span></span><span class="line"><span class="cl"><span class="n">phi</span><span class="o">=</span><span class="p">(</span><span class="n">p</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="p">(</span><span class="n">q</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">d</span><span class="o">=</span><span class="nb">pow</span><span class="p">(</span><span class="n">e</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="n">phi</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">long_to_bytes</span><span class="p">(</span><span class="nb">pow</span><span class="p">(</span><span class="n">c</span><span class="p">,</span><span class="n">d</span><span class="p">,</span><span class="n">n</span><span class="p">)))</span></span></span></code></pre></td></tr></table>
</div>
</div>
    </div>
</div>
<p>md 还能有这种报错的，夸张哦 😓</p>
<h3 id="已知密文-m-高位">已知密文 m 高位<a href="#%e5%b7%b2%e7%9f%a5%e5%af%86%e6%96%87-m-%e9%ab%98%e4%bd%8d" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>怎么感觉像照着抄啊我干</p>
<p>m 和 c 的关系是
</p>
$$
c = m^e \mod n
$$<p>
又因为：
</p>
$$
m = m_{\text{high}} + x \quad (\text{$x$ 是低位未知})
$$<p>
所以把 c 移过来可以变成：
</p>
$$
f(x) = (m_{\text{high}} + x)^e - c \equiv 0 \mod n
$$<p>
然后直接套公式秒了</p>
<h3 id="已知-d-的低位求-pq">已知 d 的低位求 pq<a href="#%e5%b7%b2%e7%9f%a5-d-%e7%9a%84%e4%bd%8e%e4%bd%8d%e6%b1%82-pq" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>已知了 d 的低位 d_low 和低位 bits 数 x 还有 e</p>
<p>因为：
</p>
$$
ed \equiv 1 \pmod{(p-1)(q-1)}
$$<p>
所以：ed = 1 + k * (p-1) * (q-1)</p>
<p>然后对两边取模 2^x^，所以:
</p>
$$
ed_{\text{low}} \equiv 1 + k(p-1)(q-1) \pmod{2^x}
$$<p>
把 q 换成 n/p，这个式子就为
</p>
$$
p \cdot ed_{low} \equiv p + k(n \cdot p - p^{2} - n + p) \pmod{2^{x}}
$$<p>
然后 solve_mod 解模方程（sagemath 太好用了家人们）</p>
<h2 id="franklin-reiter-相关消息攻击--coppersmiths-short-pad-attack-短填充攻击">Franklin-Reiter 相关消息攻击 &amp; Coppersmith&rsquo;s Short Pad Attack 短填充攻击<a href="#franklin-reiter-%e7%9b%b8%e5%85%b3%e6%b6%88%e6%81%af%e6%94%bb%e5%87%bb--coppersmiths-short-pad-attack-%e7%9f%ad%e5%a1%ab%e5%85%85%e6%94%bb%e5%87%bb" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<h3 id="攻击原理-1">攻击原理<a href="#%e6%94%bb%e5%87%bb%e5%8e%9f%e7%90%86-1" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>由于 m1 和 m2 存在线性关系并且在相同 N 下进行的 RSA 加密，</p>
<p>假设
</p>
$$
m_1 = k\ * \ m_2 \ +\ b
$$<p>
且
</p>
$$
m_1\ \equiv \ a\ mod \ N\\
m_2\ \equiv \ a\ mod \ N
$$<p>
这样就可以列出两个和 m2 相关的方程
</p>
$$
f(x)\ =\ x\ -\ a\\f(x)= k\ * \ x \ +\ b\ -\ a
$$<p>
这样这两个式子取 <strong>x = m2</strong> 时都会等于 0，在数学意义下有个 <strong>(x-m2)</strong> 的因式，所以直接取这两个方程的公因数就可以找到 m2</p>
<p>顺便学习一下 sagemath</p>
<div class="code-shell">
    <span class="code-lang">python</span>
    <div class="code-block">
        <div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">R</span><span class="o">.&lt;</span><span class="n">X</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">Zmod</span><span class="p">(</span><span class="n">n</span><span class="p">)[]</span><span class="c1">#定义多项式环</span>
</span></span><span class="line"><span class="cl"><span class="o">.</span><span class="n">coefficients</span><span class="p">()</span><span class="c1">#以列表形式返回多项式的常数项（从低项到高项的升序排列，即7x^5+3x^4+4返回[4,3,7]）</span>
</span></span><span class="line"><span class="cl"><span class="o">.</span><span class="n">monic</span><span class="p">()</span><span class="c1">#除以最高项的系数</span>
</span></span><span class="line"><span class="cl"><span class="s1">&#39;&#39;&#39;
</span></span></span><span class="line"><span class="cl"><span class="s1">4x^3+2x^2+x
</span></span></span><span class="line"><span class="cl"><span class="s1">返回：
</span></span></span><span class="line"><span class="cl"><span class="s1">x^3+1/2x^2+1/4x
</span></span></span><span class="line"><span class="cl"><span class="s1">&#39;&#39;&#39;</span>
</span></span><span class="line"><span class="cl"><span class="c1">#多项式求公因数用欧几里得算法递归</span>
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">gcd</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">b</span> <span class="o">==</span> <span class="mi">0</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">a</span><span class="o">.</span><span class="n">monic</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">gcd</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">a</span> <span class="o">%</span> <span class="n">b</span><span class="p">)</span></span></span></code></pre></td></tr></table>
</div>
</div>
    </div>
</div>
<h3 id="做下例题">做下例题<a href="#%e5%81%9a%e4%b8%8b%e4%be%8b%e9%a2%98" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<div class="code-shell">
    <span class="code-lang">python</span>
    <div class="code-block">
        <div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">Crypto.Util.number</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">secret</span> <span class="kn">import</span> <span class="n">flag</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">Crypto.Util.number</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">m1</span> <span class="o">=</span> <span class="n">bytes_to_long</span><span class="p">(</span><span class="n">flag</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">N</span> <span class="o">=</span> <span class="n">getPrime</span><span class="p">(</span><span class="mi">512</span><span class="p">)</span><span class="o">*</span><span class="n">getPrime</span><span class="p">(</span><span class="mi">512</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">e</span> <span class="o">=</span> <span class="mi">17</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">c1</span> <span class="o">=</span> <span class="nb">pow</span><span class="p">(</span><span class="n">m1</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="n">N</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">a</span> <span class="o">=</span> <span class="n">getRandomNBitInteger</span><span class="p">(</span><span class="mi">512</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">b</span> <span class="o">=</span> <span class="n">getRandomNBitInteger</span><span class="p">(</span><span class="mi">512</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">m2</span> <span class="o">=</span> <span class="n">a</span> <span class="o">*</span> <span class="n">m1</span> <span class="o">+</span> <span class="n">b</span>
</span></span><span class="line"><span class="cl"><span class="n">c2</span> <span class="o">=</span> <span class="nb">pow</span><span class="p">(</span><span class="n">m2</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="n">N</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;N=</span><span class="si">{</span><span class="n">N</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">,</span> <span class="sa">f</span><span class="s1">&#39;a=</span><span class="si">{</span><span class="n">a</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">,</span> <span class="sa">f</span><span class="s1">&#39;b=</span><span class="si">{</span><span class="n">b</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">,</span> <span class="sa">f</span><span class="s1">&#39;c1=</span><span class="si">{</span><span class="n">c1</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">,</span> <span class="sa">f</span><span class="s1">&#39;c2=</span><span class="si">{</span><span class="n">c2</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)</span></span></span></code></pre></td></tr></table>
</div>
</div>
    </div>
</div>
<div class="code-shell">
    <span class="code-lang">python</span>
    <div class="code-block">
        <div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">N</span><span class="o">=</span><span class="mi">123659932061175480826793608011321410436349950741155126876095701055301878519455031361569954900678263326118459719432097093055918891948664714258046001339215600541946755989049122600427628642622036472692779340339300158628581419220590868242848311473965406365501747491282544140645468809520929307937285660479491241363</span>
</span></span><span class="line"><span class="cl"><span class="n">a</span><span class="o">=</span><span class="mi">12795184347649957548397347648657609712242281197428253341891395348966629724842748696386579533843100833039565312645558384706282291396553602742473087674306336</span>
</span></span><span class="line"><span class="cl"><span class="n">b</span><span class="o">=</span><span class="mi">12652561268961103936837420866306660440380907636430718507525953046969196471975210807471094652190751376751348655252244311630569860771118936181419956587387282</span>
</span></span><span class="line"><span class="cl"><span class="n">c1</span><span class="o">=</span><span class="mi">51991948160397341594095534046308905334052328129886214140433481879034095448631790463996064234310860642758645828216350970768732856439017324754993220774971081882007838091737307185049230846102962234452369235186705221800322142645874117556212685451861172069436515378795560228077509937484022552758984136308761496373</span>
</span></span><span class="line"><span class="cl"><span class="n">c2</span><span class="o">=</span><span class="mi">102367269426206577837660468860715696190840895268468904172938303357188227693435122799965957675733814903345970317009686706066325312156008609593926539768689081990544088825413585508055156925413722623286655819700429518477974133941543843635128782119973290018886257977205103150970429699110833604623614038282346303825</span>
</span></span><span class="line"><span class="cl"><span class="n">e</span><span class="o">=</span><span class="mi">17</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">Crypto.Util.number</span> <span class="kn">import</span><span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">s</span><span class="p">(</span><span class="n">N</span><span class="p">,</span><span class="n">e</span><span class="p">,</span><span class="n">c1</span><span class="p">,</span><span class="n">c2</span><span class="p">,</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">R</span><span class="o">.&lt;</span><span class="n">X</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">Zmod</span><span class="p">(</span><span class="n">N</span><span class="p">)[]</span>
</span></span><span class="line"><span class="cl">    <span class="n">f1</span> <span class="o">=</span> <span class="n">X</span><span class="o">^</span><span class="n">e</span> <span class="o">-</span> <span class="n">c1</span>
</span></span><span class="line"><span class="cl">    <span class="n">f2</span> <span class="o">=</span> <span class="p">(</span><span class="n">X</span><span class="o">*</span><span class="n">a</span><span class="o">+</span> <span class="n">b</span><span class="p">)</span><span class="o">^</span><span class="n">e</span> <span class="o">-</span> <span class="n">c2</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">Integer</span><span class="p">(</span><span class="o">-</span><span class="p">(</span><span class="n">gcd</span><span class="p">(</span><span class="n">f1</span><span class="p">,</span><span class="n">f2</span><span class="p">))</span><span class="o">.</span><span class="n">coefficients</span><span class="p">()[</span><span class="mi">0</span><span class="p">])</span> 
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">gcd</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">b</span> <span class="o">==</span> <span class="mi">0</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">a</span><span class="o">.</span><span class="n">monic</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">gcd</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">a</span> <span class="o">%</span> <span class="n">b</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">m</span><span class="o">=</span><span class="n">s</span><span class="p">(</span><span class="n">N</span><span class="p">,</span><span class="n">e</span><span class="p">,</span><span class="n">c1</span><span class="p">,</span><span class="n">c2</span><span class="p">,</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">long_to_bytes</span><span class="p">(</span><span class="n">m</span><span class="p">))</span></span></span></code></pre></td></tr></table>
</div>
</div>
    </div>
</div>
<div class="code-shell">
    <span class="code-lang">python</span>
    <div class="code-block">
        <div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">Crypto.Util.number</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">secret</span> <span class="kn">import</span> <span class="n">flag</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">num1</span> <span class="o">=</span> <span class="n">getPrime</span><span class="p">(</span><span class="mi">512</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">num2</span> <span class="o">=</span> <span class="n">getPrime</span><span class="p">(</span><span class="mi">512</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="k">while</span> <span class="n">num1</span><span class="o">&lt;</span><span class="n">num2</span> <span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">num2</span> <span class="o">=</span> <span class="n">getPrime</span><span class="p">(</span><span class="mi">512</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">ring</span> <span class="o">=</span> <span class="n">RealField</span><span class="p">(</span><span class="mi">1050</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">num3</span> <span class="o">=</span> <span class="n">ring</span><span class="p">(</span><span class="n">num1</span><span class="p">)</span> <span class="o">/</span><span class="n">ring</span><span class="p">(</span><span class="n">num2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;num3=&#34;</span><span class="p">,</span><span class="n">num3</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="n">getPrime</span><span class="p">(</span><span class="mi">512</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">q</span> <span class="o">=</span> <span class="n">getPrime</span><span class="p">(</span><span class="mi">512</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">n</span><span class="o">=</span><span class="n">p</span><span class="o">*</span><span class="n">q</span>
</span></span><span class="line"><span class="cl"><span class="n">e</span><span class="o">=</span><span class="mi">65537</span>
</span></span><span class="line"><span class="cl"><span class="n">m</span> <span class="o">=</span> <span class="n">bytes_to_long</span><span class="p">(</span><span class="n">flag</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">=</span><span class="nb">pow</span><span class="p">(</span><span class="n">m</span><span class="p">,</span><span class="n">e</span><span class="p">,</span><span class="n">n</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;n=&#34;</span><span class="p">,</span><span class="n">n</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;c=&#34;</span><span class="p">,</span><span class="n">c</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">n2</span> <span class="o">=</span> <span class="n">getPrime</span><span class="p">(</span><span class="mi">512</span><span class="p">)</span> <span class="o">*</span> <span class="n">getPrime</span><span class="p">(</span><span class="mi">512</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">e1</span> <span class="o">=</span> <span class="n">randint</span><span class="p">(</span><span class="mi">1000</span><span class="p">,</span><span class="mi">2000</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">e2</span> <span class="o">=</span> <span class="n">randint</span><span class="p">(</span><span class="mi">1000</span><span class="p">,</span><span class="mi">2000</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">c1</span> <span class="o">=</span> <span class="nb">pow</span><span class="p">(</span><span class="n">p</span><span class="o">+</span><span class="n">num1</span><span class="p">,</span><span class="n">e1</span><span class="p">,</span><span class="n">n2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">c2</span> <span class="o">=</span> <span class="nb">pow</span><span class="p">(</span><span class="n">p</span><span class="o">+</span><span class="n">num2</span><span class="p">,</span><span class="n">e2</span><span class="p">,</span><span class="n">n2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">q1</span> <span class="o">=</span> <span class="n">getPrime</span><span class="p">(</span><span class="mi">512</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">leak1</span> <span class="o">=</span> <span class="nb">pow</span><span class="p">(</span><span class="n">q</span><span class="o">+</span><span class="n">q1</span><span class="p">,</span><span class="mi">2024</span><span class="p">,</span><span class="n">n</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">leak2</span> <span class="o">=</span> <span class="nb">pow</span><span class="p">(</span><span class="n">q1</span><span class="o">+</span><span class="mi">2024</span><span class="p">,</span><span class="n">q</span><span class="p">,</span><span class="n">n</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;n2=&#34;</span><span class="p">,</span><span class="n">n2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;e1=&#34;</span><span class="p">,</span><span class="n">e1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;e2=&#34;</span><span class="p">,</span><span class="n">e2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;c1=&#34;</span><span class="p">,</span><span class="n">c1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;c2=&#34;</span><span class="p">,</span><span class="n">c2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;leak1=&#34;</span><span class="p">,</span><span class="n">leak1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;leak2=&#34;</span><span class="p">,</span><span class="n">leak2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">num3= 1.36557212221826657073387899060669771982679822943621690677450888408226656788387273887547841291114809989272635809810564202247340711087479554863446719786359395466961253205133910506682801159622545780721946115442033391600881399634390008053822158098121985270501317972263356522400827768601773721146954464269212959784543085
</span></span></span><span class="line"><span class="cl"><span class="s2">n= 85105083975491693151454182116844944807066048677068373328227644321539783064315677834754866742549592569194223084173286381150626593510265361114796714226058887906219454795525438819082646860141163940340082006344850825956811992304447978369108606993344902286569100146695092703383844402883938506877787042873586279543
</span></span></span><span class="line"><span class="cl"><span class="s2">c= 8090472119640930864901421058741085326954308673260202542020919764880488559370287585797498390920330336595858609617432370825503480936376306766495089200286004922821787548265246289552343468177624634434613746605553770994437785042510225956023382347023663125411103947669109085411939772215657220674436476279268458980
</span></span></span><span class="line"><span class="cl"><span class="s2">n2= 101642316595332652021348165259853423287787139517550249986161819826180514401858258316466101056877182367161299111697465439636861942636526396547011727147471566130633614685728563576613692851860684686033186826342178072882901576159305747639645374751566751967096281105148714033096611618024355982220235949274576036321
</span></span></span><span class="line"><span class="cl"><span class="s2">e1= 1630
</span></span></span><span class="line"><span class="cl"><span class="s2">e2= 1866
</span></span></span><span class="line"><span class="cl"><span class="s2">c1= 8857135083997055103287497833179378469532619748945804429057682575070405217145941944821968708809563240261403711644389684947851643865895254406194464015430673347359589677809515117412321862622147634752091324365628790687343748145339949310696116239361890881096088375070083053010564890401663562726144984405628773323
</span></span></span><span class="line"><span class="cl"><span class="s2">c2= 44531030636557714647477473185500183066851251320453194953972504422367649302810396344051696851757189817391648356459225688318373454949578822468293099948132700460437006478679492801335689493431764882835346904225119630026545592437198370606462285405519745361570058335573353886454277790277663038008240372746639859253
</span></span></span><span class="line"><span class="cl"><span class="s2">leak1= 82301473255013183706458389946960254392188270550712533886416705365418418731488346328643954589202172816597173052792573628245245948345810581701878535280775967863966009605872386693838526935762655380705962833467046779524956212498594045378770790026387120339093736625186401934354434702063802537686761251873173518029
</span></span></span><span class="line"><span class="cl"><span class="s2">leak2= 43580171648136008789232340619597144591536098696024883687397347933098380327258730482377138309020375265135558484586783368757872008322883985094403855691297725907800406097129735499961231236473313141257901326737291586051506797429883866846199683028143924054925109557329949641367848264351523500925115860458645738192
</span></span></span><span class="line"><span class="cl"><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2">&#34;&#34;&#34;</span></span></span></code></pre></td></tr></table>
</div>
</div>
    </div>
</div>
<p>DASTF 的题，先连分数逼近来解开 num1 和 num2，然后用相关消息攻击，情报有误，这是短填充攻击</p>
<div class="code-shell">
    <span class="code-lang">python</span>
    <div class="code-block">
        <div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">num3</span><span class="o">=</span> <span class="mf">1.36557212221826657073387899060669771982679822943621690677450888408226656788387273887547841291114809989272635809810564202247340711087479554863446719786359395466961253205133910506682801159622545780721946115442033391600881399634390008053822158098121985270501317972263356522400827768601773721146954464269212959784543085</span>
</span></span><span class="line"><span class="cl"><span class="n">n</span><span class="o">=</span> <span class="mi">85105083975491693151454182116844944807066048677068373328227644321539783064315677834754866742549592569194223084173286381150626593510265361114796714226058887906219454795525438819082646860141163940340082006344850825956811992304447978369108606993344902286569100146695092703383844402883938506877787042873586279543</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">=</span> <span class="mi">8090472119640930864901421058741085326954308673260202542020919764880488559370287585797498390920330336595858609617432370825503480936376306766495089200286004922821787548265246289552343468177624634434613746605553770994437785042510225956023382347023663125411103947669109085411939772215657220674436476279268458980</span>
</span></span><span class="line"><span class="cl"><span class="n">n2</span><span class="o">=</span> <span class="mi">101642316595332652021348165259853423287787139517550249986161819826180514401858258316466101056877182367161299111697465439636861942636526396547011727147471566130633614685728563576613692851860684686033186826342178072882901576159305747639645374751566751967096281105148714033096611618024355982220235949274576036321</span>
</span></span><span class="line"><span class="cl"><span class="n">e1</span><span class="o">=</span> <span class="mi">1630</span>
</span></span><span class="line"><span class="cl"><span class="n">e2</span><span class="o">=</span> <span class="mi">1866</span>
</span></span><span class="line"><span class="cl"><span class="n">e</span><span class="o">=</span><span class="mi">65537</span>
</span></span><span class="line"><span class="cl"><span class="n">c1</span><span class="o">=</span> <span class="mi">8857135083997055103287497833179378469532619748945804429057682575070405217145941944821968708809563240261403711644389684947851643865895254406194464015430673347359589677809515117412321862622147634752091324365628790687343748145339949310696116239361890881096088375070083053010564890401663562726144984405628773323</span>
</span></span><span class="line"><span class="cl"><span class="n">c2</span><span class="o">=</span> <span class="mi">44531030636557714647477473185500183066851251320453194953972504422367649302810396344051696851757189817391648356459225688318373454949578822468293099948132700460437006478679492801335689493431764882835346904225119630026545592437198370606462285405519745361570058335573353886454277790277663038008240372746639859253</span>
</span></span><span class="line"><span class="cl"><span class="n">leak1</span><span class="o">=</span> <span class="mi">82301473255013183706458389946960254392188270550712533886416705365418418731488346328643954589202172816597173052792573628245245948345810581701878535280775967863966009605872386693838526935762655380705962833467046779524956212498594045378770790026387120339093736625186401934354434702063802537686761251873173518029</span>
</span></span><span class="line"><span class="cl"><span class="n">leak2</span><span class="o">=</span> <span class="mi">43580171648136008789232340619597144591536098696024883687397347933098380327258730482377138309020375265135558484586783368757872008322883985094403855691297725907800406097129735499961231236473313141257901326737291586051506797429883866846199683028143924054925109557329949641367848264351523500925115860458645738192</span>
</span></span><span class="line"><span class="cl"><span class="n">t</span><span class="o">=</span><span class="n">continued_fraction</span><span class="p">(</span><span class="n">num3</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1000</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">num1</span><span class="o">=</span><span class="n">t</span><span class="o">.</span><span class="n">numerator</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">is_prime</span><span class="p">(</span><span class="n">num1</span><span class="p">)</span> <span class="ow">and</span> <span class="n">num1</span><span class="o">.</span><span class="n">nbits</span><span class="p">()</span><span class="o">==</span><span class="mi">512</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">num2</span><span class="o">=</span><span class="n">t</span><span class="o">.</span><span class="n">denominator</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="n">num1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="n">num2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">break</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">Crypto.Util.number</span> <span class="kn">import</span><span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">s</span><span class="p">(</span><span class="n">n</span><span class="p">,</span><span class="n">e1</span><span class="p">,</span><span class="n">e2</span><span class="p">,</span><span class="n">c1</span><span class="p">,</span><span class="n">c2</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">R</span><span class="o">.&lt;</span><span class="n">X</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">Zmod</span><span class="p">(</span><span class="n">n</span><span class="p">)[]</span>
</span></span><span class="line"><span class="cl">    <span class="n">f1</span> <span class="o">=</span> <span class="p">(</span><span class="n">X</span><span class="o">+</span><span class="n">num1</span><span class="p">)</span><span class="o">**</span><span class="n">e1</span> <span class="o">-</span> <span class="n">c1</span>
</span></span><span class="line"><span class="cl">    <span class="n">f2</span> <span class="o">=</span> <span class="p">(</span><span class="n">X</span><span class="o">+</span><span class="n">num2</span><span class="p">)</span><span class="o">**</span><span class="n">e2</span> <span class="o">-</span> <span class="n">c2</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">Integer</span><span class="p">(</span><span class="o">-</span><span class="p">(</span><span class="n">gcd</span><span class="p">(</span><span class="n">f1</span><span class="p">,</span><span class="n">f2</span><span class="p">))</span><span class="o">.</span><span class="n">coefficients</span><span class="p">()[</span><span class="mi">0</span><span class="p">])</span> 
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">gcd</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">b</span> <span class="o">==</span> <span class="mi">0</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">a</span><span class="o">.</span><span class="n">monic</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">gcd</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">a</span> <span class="o">%</span> <span class="n">b</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">=</span><span class="n">s</span><span class="p">(</span><span class="n">n2</span><span class="p">,</span><span class="n">e1</span><span class="p">,</span><span class="n">e2</span><span class="p">,</span><span class="n">c1</span><span class="p">,</span><span class="n">c2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">q</span><span class="o">=</span><span class="n">n</span><span class="o">//</span><span class="n">p</span>
</span></span><span class="line"><span class="cl"><span class="n">d</span><span class="o">=</span><span class="nb">pow</span><span class="p">(</span><span class="n">e</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">,(</span><span class="n">p</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="p">(</span><span class="n">q</span><span class="o">-</span><span class="mi">1</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">m</span><span class="o">=</span><span class="nb">pow</span><span class="p">(</span><span class="n">c</span><span class="p">,</span><span class="n">d</span><span class="p">,</span><span class="n">n</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">long_to_bytes</span><span class="p">(</span><span class="n">m</span><span class="p">))</span></span></span></code></pre></td></tr></table>
</div>
</div>
    </div>
</div>
]]></content>
		</item>
		
		<item>
			<title></title>
			<link>https://p3r0x.github.io/p/</link>
			<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>Perox</author><guid>https://p3r0x.github.io/p/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<h1 id="格密码相关">格密码相关<a href="#%e6%a0%bc%e5%af%86%e7%a0%81%e7%9b%b8%e5%85%b3" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h1>
<h2 id="整数规划ip">整数规划（IP）<a href="#%e6%95%b4%e6%95%b0%e8%a7%84%e5%88%92ip" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<h3 id="定义">定义<a href="#%e5%ae%9a%e4%b9%89" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>给定m个关于n个变量的有理数线性不等式，判断是否存在整数解，等价于矩阵
</p>
$$
A \ \in\Q^{m×n},b\ \in\ Q^{m}\\
存在z\ \in\ Z^{n}\ Az\ \textless\ b
$$<p>
等价于：判断此集合是否为空集</p>
<img src="Snipaste_2026-01-13_15-21-16.png" style="zoom:30%;" />
<h1 id="2">2<a href="#2" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h1>
<p>凸组合：对任意两点x,y，以及λ∈[0,1]，凸组合就是λx+(1-y)λ</p>
<p>凸性：对集合内任意两点x,y的凸组合，仍然属于该集合</p>
<p>凸体指任意两点的凸组合仍在集合中；凸体还要求有界且内部非空</p>
]]></content>
		</item>
		
		<item>
			<title></title>
			<link>https://p3r0x.github.io/p/</link>
			<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>Perox</author><guid>https://p3r0x.github.io/p/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<h1 id="时间复杂度">时间复杂度<a href="#%e6%97%b6%e9%97%b4%e5%a4%8d%e6%9d%82%e5%ba%a6" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h1>
<p>输入规模为n时，运行时间随n增长的数量级，是增长趋势</p>
<p>数据越大跑得越慢</p>
<p>时间复杂度增长的速度，和函数增长速度一样
</p>
$$
O_{log\ n}<O_{n}<O_{n^x}<O_{a^n}<O_{n!}
$$<h1 id="多项式时间复杂度">多项式时间复杂度<a href="#%e5%a4%9a%e9%a1%b9%e5%bc%8f%e6%97%b6%e9%97%b4%e5%a4%8d%e6%9d%82%e5%ba%a6" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h1>
<p>形如：
</p>
$$
m(n)=O_{n^k} \
$$<p>
k为常量</p>
<h1 id="非多项式时间复杂度">非多项式时间复杂度<a href="#%e9%9d%9e%e5%a4%9a%e9%a1%b9%e5%bc%8f%e6%97%b6%e9%97%b4%e5%a4%8d%e6%9d%82%e5%ba%a6" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h1>
<p>就是除了多项式复杂度以外的，比如指数型和阶乘型</p>
<h1 id="p问题">P问题<a href="#p%e9%97%ae%e9%a2%98" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h1>
<p>能在多项式时间内可以解决的问题</p>
<p>p就是可以被算出来的问题</p>
<h1 id="np-conp">NP coNP<a href="#np-conp" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h1>
<p>指在多项式时间内验证的决策问题，人话就是基本算不出来，但是很好判断</p>
<p>给出一个困难的问题和一个回答，可以很好判断这个回答是不是这个问题的答案，证明有解更简单，证明无解很困难，</p>
<p>coNP和NP差不多，但是属于NP的反面，更好证明无解，证明有解很难</p>
<p><img src="Snipaste_2026-01-13_21-19-10.png" alt=""></p>
<h1 id="am">AM<a href="#am" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h1>
<h1 id="coam">coAm<a href="#coam" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h1>
]]></content>
		</item>
		
		<item>
			<title></title>
			<link>https://p3r0x.github.io/p/</link>
			<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>Perox</author><guid>https://p3r0x.github.io/p/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<div class="code-shell">
    <span class="code-lang">html</span>
    <div class="code-block">
        <div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;code-fun&#34;</span> <span class="na">data-tip</span><span class="o">=</span><span class="s">&#34;测试功能&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span></span></span></code></pre></td></tr></table>
</div>
</div>
    </div>
</div>
<p>这个是加吐槽，针对代码块</p>
]]></content>
		</item>
		
	</channel>
</rss>
