前言

上一节的 Diffie-Hellman 依靠离散对数问题,让双方能够在公开信道中建立共享秘密。RSA 走的是另一条路线:它把两个大素数相乘得到公开模数,再利用模运算中一种“容易正向计算、缺少陷门时难以逆转”的结构构造公钥与私钥。

RSA 的公式经常被压缩成两行:

C = M e   m o d   n C=M^e\bmod n C=Memodn

M = C d   m o d   n M=C^d\bmod n M=Cdmodn

真正需要理解的并不是背下 e e e d d d n n n,而是回答下面几个问题:

  • 为什么公钥指数 e e e 和私钥指数 d d d 必须互为模逆;
  • 为什么模逆不是普通意义上的倒数;
  • 为什么先做 e e e 次幂、再做 d d d 次幂能够回到原消息;
  • 数千位指数为什么仍能高效计算;
  • 私钥运算为什么可以借助中国剩余定理加速。

本文从互质、欧拉函数和模逆开始,使用一组可手算的小参数完整生成 RSA 密钥,并把正确性证明、快速模幂和 CRT 加速串成一条主线。文中的小素数只用于教学,绝不能用于真实系统。

Crypto 专栏:https://blog.csdn.net/r_feynman_/category_13190241.html

Crypto 密码解析实战靶场:https://blog.csdn.net/r_feynman_/category_13194584.html


一、RSA 建立在哪些数学对象上

1.1 从两个素数得到模数

选择两个不同的大素数 p p p q q q,计算:

n = p q n=pq n=pq

n n n 称为 RSA 模数。公钥会公开 n n n,私钥则必须保护与 p p p q q q 有关的信息。

为什么不直接公开 p p p q q q?因为知道分解后,就能计算欧拉函数:

φ ( n ) = φ ( p q ) = ( p − 1 ) ( q − 1 ) \varphi(n)=\varphi(pq)=(p-1)(q-1) φ(n)=φ(pq)=(p1)(q1)

进而求出私钥指数。RSA 的陷门正藏在这里:

  • p , q p,q p,q 计算 n n n 很容易;
  • 对足够大的合规 RSA 模数,从 n n n 恢复 p , q p,q p,q 被认为很困难;
  • 持有 p , q p,q p,q 的合法用户可以轻松构造私钥。

这里要避免一句过度简化的话:“破解 RSA 等价于分解 n n n。”已知的通用私钥恢复方式确实与分解高度相关,但严谨地说,不能把所有 RSA 安全命题都直接写成已证明的数学等价。工程安全还取决于填充、随机数、密钥长度、实现和协议使用方式。


1.2 互质为什么重要

若两个整数 a , b a,b a,b 的最大公约数为 1 1 1,记作:

gcd ⁡ ( a , b ) = 1 \gcd(a,b)=1 gcd(a,b)=1

则称 a a a b b b 互质。

RSA 选择公钥指数 e e e 时要求:

1 < e < φ ( n ) , gcd ⁡ ( e , φ ( n ) ) = 1 1<e<\varphi(n),\qquad \gcd(e,\varphi(n))=1 1<e<φ(n),gcd(e,φ(n))=1

这不是形式要求,而是为了保证 e e e 在模 φ ( n ) \varphi(n) φ(n) 意义下存在乘法逆元。若 e e e φ ( n ) \varphi(n) φ(n) 不互质,就无法找到满足要求的私钥指数 d d d

例如模 12 12 12 下, 5 5 5 存在逆元,因为:

5 × 5 = 25 ≡ 1 ( m o d 12 ) 5\times5=25\equiv1\pmod {12} 5×5=251(mod12)

6 6 6 不存在逆元。因为 6 x 6x 6x 永远是 6 6 6 的倍数,不可能模 12 12 12 1 1 1


1.3 欧拉函数到底在数什么

欧拉函数 φ ( n ) \varphi(n) φ(n) 表示 1 1 1 n n n 之间与 n n n 互质的整数个数。若 p p p 是素数,则:

φ ( p ) = p − 1 \varphi(p)=p-1 φ(p)=p1

因为 1 , 2 , … , p − 1 1,2,\ldots,p-1 1,2,,p1 都与 p p p 互质。

p , q p,q p,q 是不同素数,则:

φ ( p q ) = ( p − 1 ) ( q − 1 ) \varphi(pq)=(p-1)(q-1) φ(pq)=(p1)(q1)

也可以从排除法理解。在 1 1 1 p q pq pq 的整数中,去掉 p p p 的倍数和 q q q 的倍数,再修正被重复排除的 p q pq pq,最终得到:

p q − q − p + 1 = ( p − 1 ) ( q − 1 ) pq-q-p+1=(p-1)(q-1) pqqp+1=(p1)(q1)

RSA 并不是“因为有欧拉函数所以安全”,而是利用了一个不对称性:知道 p , q p,q p,q 时计算 φ ( n ) \varphi(n) φ(n) 很容易;只公开 n n n 时,想得到同样的信息通常要面对大整数分解问题。


二、欧拉定理如何支撑 RSA

2.1 欧拉定理

若:

gcd ⁡ ( a , n ) = 1 \gcd(a,n)=1 gcd(a,n)=1

则欧拉定理给出:

a φ ( n ) ≡ 1 ( m o d n ) a^{\varphi(n)}\equiv1\pmod n aφ(n)1(modn)

它说明,在模 n n n 的可逆元素集合中,把元素连续相乘到特定周期后会回到单位元 1 1 1

例:取 ( n = 6 ) (n=6) (n=6) φ ( 6 ) = 2 \varphi(6)=2 φ(6)=2,模6可逆元为 1 , 5 {1,5} 1,5。取 ( a = 5 ) (a=5) (a=5) 5 2 = 25 ≡ 1 ( m o d 6 ) 5^2=25\equiv 1\pmod 6 52=251(mod6),自乘2次后回到单位元 1 1 1

假设某个指数可以写成:

e d = 1 + k φ ( n ) ed=1+k\varphi(n) ed=1+kφ(n)

对于与 n n n 互质的消息 M M M,有:

M e d = M 1 + k φ ( n ) M^{ed}=M^{1+k\varphi(n)} Med=M1+kφ(n)

拆开后得到:

M e d = M ( M φ ( n ) ) k M^{ed}=M\left(M^{\varphi(n)}\right)^k Med=M(Mφ(n))k

根据欧拉定理:

M φ ( n ) ≡ 1 ( m o d n ) M^{\varphi(n)}\equiv1\pmod n Mφ(n)1(modn)

所以:

M e d ≡ M ⋅ 1 k ≡ M ( m o d n ) M^{ed}\equiv M\cdot1^k\equiv M\pmod n MedM1kM(modn)

这正是 RSA 解密正确性的核心。


2.2 e d ≡ 1 ed\equiv1 ed1 到底表示什么

RSA 要求:

e d ≡ 1 ( m o d φ ( n ) ) ed\equiv1\pmod {\varphi(n)} ed1(modφ(n))

含义不是普通等式 e d = 1 ed=1 ed=1,而是 e d − 1 ed-1 ed1 能被 φ ( n ) \varphi(n) φ(n) 整除。因此存在整数 k k k,使得:

e d − 1 = k φ ( n ) ed-1=k\varphi(n) ed1=kφ(n)

也就是:

e d = 1 + k φ ( n ) ed=1+k\varphi(n) ed=1+kφ(n)

这一步把“公私钥指数互为模逆”与欧拉定理连接了起来。


2.3 消息与 n n n 不互质怎么办

只用欧拉定理证明时,会带上 gcd ⁡ ( M , n ) = 1 \gcd(M,n)=1 gcd(M,n)=1 的条件。但 RSA 正确性并不只覆盖与 n n n 互质的消息。

更完整的证明可以分别在模 p p p、模 q q q 下进行。以模 p p p 为例:

  • M ≡ 0 ( m o d p ) M\equiv0\pmod p M0(modp),显然 M e d ≡ M ≡ 0 ( m o d p ) M^{ed}\equiv M\equiv0\pmod p MedM0(modp)
  • M ≢ 0 ( m o d p ) M\not\equiv0\pmod p M0(modp),由费马小定理可得 M p − 1 ≡ 1 ( m o d p ) M^{p-1}\equiv1\pmod p Mp11(modp)

由于 p − 1 p-1 p1 q − 1 q-1 q1 都整除 φ ( n ) \varphi(n) φ(n),可推出:

M e d ≡ M ( m o d p ) M^{ed}\equiv M\pmod p MedM(modp)

同理:

M e d ≡ M ( m o d q ) M^{ed}\equiv M\pmod q MedM(modq)

p p p q q q 互质,根据中国剩余定理:

M e d ≡ M ( m o d p q ) M^{ed}\equiv M\pmod {pq} MedM(modpq)

即:

M e d ≡ M ( m o d n ) M^{ed}\equiv M\pmod n MedM(modn)


2.4 为什么有时使用 Carmichael 函数

工程和标准中也常使用 Carmichael 函数 λ ( n ) \lambda(n) λ(n)。对于 RSA 的模数 n = p q n=pq n=pq(两个不同奇素数 p , q p,q p,q):
λ ( n ) = lcm ⁡ ( p − 1 , q − 1 ) \lambda(n)=\operatorname{lcm}(p-1,q-1) λ(n)=lcm(p1,q1)

lcm ⁡ \operatorname{lcm} lcm 代表最小公倍数。相比于欧拉函数

φ ( n ) = ( p − 1 ) ( q − 1 ) \varphi(n)=(p-1)(q-1) φ(n)=(p1)(q1)
λ ( n ) \lambda(n) λ(n) 求出的是 n n n 所有可逆元统一的最小周期,是比 φ ( n ) \varphi(n) φ(n) 更紧、更小的上界

欧拉定理只能保证:任意可逆元满足 a φ ( n ) ≡ 1 ( m o d n ) a^{\varphi(n)}\equiv 1\pmod n aφ(n)1(modn)
而 Carmichael 定理证明:所有可逆元其实不用乘到 φ ( n ) \varphi(n) φ(n),只需要乘到 lcm ⁡ ( p − 1 , q − 1 ) \operatorname{lcm}(p-1,q-1) lcm(p1,q1) 就一定回归 1 1 1

例:取 p = 7 , q = 13 p=7,q=13 p=7,q=13 p − 1 = 6 ,   q − 1 = 12 p-1=6,\ q-1=12 p1=6, q1=12 φ ( n ) = 6 × 12 = 72 \varphi(n)=6\times12=72 φ(n)=6×12=72 λ ( n ) = lcm ⁡ ( 6 , 12 ) = 12 \lambda(n)=\operatorname{lcm}(6,12)=12 λ(n)=lcm(6,12)=12。模 n n n 下全部可逆元,12次方就模 n n n 等于1,无需72次方。

因此工程密钥可以放宽为更优条件:
e d ≡ 1 ( m o d λ ( n ) ) ed\equiv1\pmod {\lambda(n)} ed1(modλ(n))
数学上满足:
λ ( n ) ∣ φ ( n ) \lambda(n)\mid\varphi(n) λ(n)φ(n)
也就是说 λ ( n ) \lambda(n) λ(n) 一定是 φ ( n ) \varphi(n) φ(n) 的约数。

使用 φ ( n ) \varphi(n) φ(n) 计算简单、适合入门推导;使用 λ ( n ) \lambda(n) λ(n) 是 RSA 真实标准采用的规则,更贴合模运算的真实群周期结构。两种写法本质服务同一套 RSA 算法,并不存在两套不同 RSA。


三、模逆与扩展欧几里得算法

3.1 模逆不是小数倒数

若整数 x x x 满足:

a x ≡ 1 ( m o d m ) ax\equiv1\pmod m ax1(modm)

则称 x x x a a a 在模 m m m 下的乘法逆元,记作:

x ≡ a − 1 ( m o d m ) x\equiv a^{-1}\pmod m xa1(modm)

它表示“找到一个整数,乘上 a a a 后模 m m m 1 1 1”,而不是计算实数 1 / a 1/a 1/a

逆元存在的充要条件是:

gcd ⁡ ( a , m ) = 1 \gcd(a,m)=1 gcd(a,m)=1

RSA 私钥指数正是:

d ≡ e − 1 ( m o d φ ( n ) ) d\equiv e^{-1}\pmod {\varphi(n)} de1(modφ(n))


3.2 Bézout 等式把求逆变成求系数

若:

gcd ⁡ ( a , b ) = g \gcd(a,b)=g gcd(a,b)=g

则存在整数 x , y x,y x,y,使得:

a x + b y = g ax+by=g ax+by=g

g = 1 g=1 g=1 时:

a x + b y = 1 ax+by=1 ax+by=1

两边模 b b b

a x ≡ 1 ( m o d b ) ax\equiv1\pmod b ax1(modb)

因此 x x x 就是 a a a b b b 的逆元。扩展欧几里得算法不仅计算最大公约数,还能把这个 x x x y y y 一并求出来。


3.3 手算 17 − 1   m o d   3120 17^{-1}\bmod3120 171mod3120

先做欧几里得除法:

3120 = 17 × 183 + 9 3120=17\times183+9 3120=17×183+9

17 = 9 × 1 + 8 17=9\times1+8 17=9×1+8

9 = 8 × 1 + 1 9=8\times1+1 9=8×1+1

从最后一行反向代回:

1 = 9 − 8 1=9-8 1=98

又因为:

8 = 17 − 9 8=17-9 8=179

所以:

1 = 2 × 9 − 17 1=2\times9-17 1=2×917

再代入:

9 = 3120 − 17 × 183 9=3120-17\times183 9=312017×183

得到:

1 = 2 × 3120 − 367 × 17 1=2\times3120-367\times17 1=2×3120367×17

因此:

− 367 × 17 ≡ 1 ( m o d 3120 ) -367\times17\equiv1\pmod {3120} 367×171(mod3120)

− 367 -367 367 是一个逆元代表。把它转换到 0 0 0 3119 3119 3119 的范围:

d = − 367 + 3120 = 2753 d=-367+3120=2753 d=367+3120=2753

验证:

17 × 2753 = 46801 = 15 × 3120 + 1 17\times2753=46801=15\times3120+1 17×2753=46801=15×3120+1

所以:

17 × 2753 ≡ 1 ( m o d 3120 ) 17\times2753\equiv1\pmod {3120} 17×27531(mod3120)


四、完整生成一组可手算的 RSA 密钥

4.1 选择素数并计算模数

取教学参数:

p = 61 , q = 53 p=61,\qquad q=53 p=61,q=53

模数为:

n = p q = 61 × 53 = 3233 n=pq=61\times53=3233 n=pq=61×53=3233

欧拉函数为:

φ ( n ) = ( 61 − 1 ) ( 53 − 1 ) = 60 × 52 = 3120 \varphi(n)=(61-1)(53-1)=60\times52=3120 φ(n)=(611)(531)=60×52=3120


4.2 选择公钥指数

选择:

e = 17 e=17 e=17

检查:

gcd ⁡ ( 17 , 3120 ) = 1 \gcd(17,3120)=1 gcd(17,3120)=1

因此 17 17 17 在模 3120 3120 3120 下存在逆元。

真实系统中经常看到:

e = 65537 = 2 16 + 1 e=65537=2^{16}+1 e=65537=216+1

它的二进制中只有两个 1 1 1,公开运算效率较好,同时避免了过小指数的一些直接风险。但 65537 65537 65537 并不是“自动安全按钮”,密钥生成和填充仍必须正确。


4.3 计算私钥指数

上一节已经求出:

d = 2753 d=2753 d=2753

于是公钥可以表示为:

( n , e ) = ( 3233 , 17 ) (n,e)=(3233,17) (n,e)=(3233,17)

私钥的核心参数为:

( n , d ) = ( 3233 , 2753 ) (n,d)=(3233,2753) (n,d)=(3233,2753)

实际私钥通常还保存 p , q , d P , d Q , q inv p,q,d_P,d_Q,q_{\text{inv}} p,q,dP,dQ,qinv 等参数,用于 CRT 加速。只保存 ( n , d ) (n,d) (n,d) 在数学上足以执行私钥运算,但不是常见的高效存储形式。


4.4 加密和解密一个整数

设编码后的消息整数为:

M = 65 M=65 M=65

必须满足:

0 ≤ M < n 0\le M<n 0M<n

加密:

C = 65 17   m o d   3233 = 2790 C=65^{17}\bmod3233=2790 C=6517mod3233=2790

解密:

M ′ = 2790 2753   m o d   3233 = 65 M'=2790^{2753}\bmod3233=65 M=27902753mod3233=65

于是:

M ′ = M M'=M M=M

这里的“整数消息”只是 RSA 原语的输入。真实文本、文件和协议消息要先经过严格编码与填充,不能直接把字节串当整数后执行裸 RSA。OAEP 和 PSS 将在下一篇展开。


五、快速模幂:大指数为什么算得动

5.1 直接乘 d d d 次不可行

朴素计算:

a d = a × a × ⋯ × a ⏟ d  次 a^d=\underbrace{a\times a\times\cdots\times a}_{d\text{ 次}} ad=d  a×a××a

会产生巨大的中间整数,运算次数也与 d d d 成正比。RSA 私钥指数通常有上千位,不能这样计算。

快速模幂利用两点:

  1. 每一步都立即取模,控制中间数大小;
  2. 把指数写成二进制,通过不断平方与选择性相乘完成计算。

5.2 平方—乘算法

例如:

17 = ( 10001 ) 2 = 16 + 1 17=(10001)_2=16+1 17=(10001)2=16+1

因此:

65 17 = 65 16 × 65 65^{17}=65^{16}\times65 6517=6516×65

连续平方并取模:

65 2   m o d   3233 = 992 65^2\bmod3233=992 652mod3233=992

65 4   m o d   3233 = 992 2   m o d   3233 = 1232 65^4\bmod3233=992^2\bmod3233=1232 654mod3233=9922mod3233=1232

65 8   m o d   3233 = 1232 2   m o d   3233 = 1547 65^8\bmod3233=1232^2\bmod3233=1547 658mod3233=12322mod3233=1547

65 16   m o d   3233 = 1547 2   m o d   3233 = 789 65^{16}\bmod3233=1547^2\bmod3233=789 6516mod3233=15472mod3233=789

最后:

65 17   m o d   3233 = 789 × 65   m o d   3233 = 2790 65^{17}\bmod3233=789\times65\bmod3233=2790 6517mod3233=789×65mod3233=2790

指数有 t t t 个二进制位时,平方—乘算法只需要 O ( t ) O(t) O(t) 次模乘,而不是执行指数数值那么多次乘法。


5.3 Python 内置三参数 pow

Python 中应使用:

result = pow(base, exponent, modulus)

不要先计算:

result = (base ** exponent) % modulus

前者直接执行高效模幂,后者可能先构造极大的完整幂。

下面用教学代码复现密钥生成与加解密:

from math import gcd

p = 61
q = 53
n = p * q
phi = (p - 1) * (q - 1)

e = 17
assert gcd(e, phi) == 1

d = pow(e, -1, phi)

message = 65
ciphertext = pow(message, e, n)
recovered = pow(ciphertext, d, n)

print("n =", n)
print("phi(n) =", phi)
print("public key =", (n, e))
print("private exponent d =", d)
print("ciphertext =", ciphertext)
print("recovered =", recovered)

输出:

n = 3233
phi(n) = 3120
public key = (3233, 17)
private exponent d = 2753
ciphertext = 2790
recovered = 65

以上代码只用于理解数学关系,没有安全素数生成、填充、侧信道防护和密钥保护,不能用于生产环境。


六、CRT 如何加速私钥运算

6.1 把一次模 n n n 运算拆成两次小运算

RSA 解密需要计算:

M = C d   m o d   n M=C^d\bmod n M=Cdmodn

因为 n = p q n=pq n=pq,可以分别计算:

m 1 = C d P   m o d   p m_1=C^{d_P}\bmod p m1=CdPmodp

m 2 = C d Q   m o d   q m_2=C^{d_Q}\bmod q m2=CdQmodq

其中:

d P = d   m o d   ( p − 1 ) d_P=d\bmod(p-1) dP=dmod(p1)

d Q = d   m o d   ( q − 1 ) d_Q=d\bmod(q-1) dQ=dmod(q1)

对示例参数:

d P = 2753   m o d   60 = 53 d_P=2753\bmod60=53 dP=2753mod60=53

d Q = 2753   m o d   52 = 49 d_Q=2753\bmod52=49 dQ=2753mod52=49

再预计算:

q inv = q − 1   m o d   p = 53 − 1   m o d   61 = 38 q_{\text{inv}}=q^{-1}\bmod p=53^{-1}\bmod61=38 qinv=q1modp=531mod61=38


6.2 合并两个余数

已知:

M ≡ m 1 ( m o d p ) M\equiv m_1\pmod p Mm1(modp)

M ≡ m 2 ( m o d q ) M\equiv m_2\pmod q Mm2(modq)

可以计算:

h = q inv ( m 1 − m 2 )   m o d   p h=q_{\text{inv}}(m_1-m_2)\bmod p h=qinv(m1m2)modp

再得到:

M = m 2 + h q M=m_2+hq M=m2+hq

这个 M M M 同时满足模 p p p 和模 q q q 的两个同余式,因此就是模 n n n 下的结果。

对于相同安全强度,模 p p p、模 q q q 的操作数长度约为模 n n n 的一半。大整数乘法和模幂不是线性成本,因此 CRT 通常能显著加速 RSA 私钥运算。


6.3 CRT 既是优化点,也是防护点

CRT 实现若受到硬件故障、电压毛刺或故意注入的计算错误,错误签名可能泄露素因子。典型情况下,攻击者将正确与错误结果做差并计算最大公约数,就可能得到 p p p q q q

因此生产实现通常需要:

  • 对 CRT 结果进行重新验证;
  • 使用指数盲化、消息盲化降低侧信道风险;
  • 采用成熟密码库的常数时间实现;
  • 不输出能够区分内部失败原因的细粒度错误。

“数学公式正确”只是第一层,安全实现还必须处理故障与侧信道。


七、RSA 数学原语的边界

7.1 裸 RSA 是确定性的

固定公钥下,同一个 M M M 总会得到同一个 C C C

C = M e   m o d   n C=M^e\bmod n C=Memodn

攻击者可以猜测候选消息并自行加密比较,无法达到现代加密要求的语义安全。


7.2 RSA 保留乘法结构

若:

C 1 = M 1 e   m o d   n , C 2 = M 2 e   m o d   n C_1=M_1^e\bmod n,\qquad C_2=M_2^e\bmod n C1=M1emodn,C2=M2emodn

则:

C 1 C 2 ≡ ( M 1 M 2 ) e ( m o d n ) C_1C_2\equiv(M_1M_2)^e\pmod n C1C2(M1M2)e(modn)

这意味着裸 RSA 具有可塑性。攻击者未必知道明文,却可能系统性改变解密结果。


7.3 RSA 不能直接加密大文件

RSA 输入整数必须小于 n n n。加入 OAEP 后,可承载消息还要扣除哈希和编码开销。以 2048 位 RSA 和 SHA-256 为例,OAEP 最大明文长度为:

256 − 2 × 32 − 2 = 190  字节 256-2\times32-2=190\text{ 字节} 2562×322=190 字节

所以实际系统通常使用混合加密:随机生成对称密钥,用 RSA-OAEP 加密这把短密钥,再用 AEAD 加密业务数据。


7.4 不要自行实现生产 RSA

安全 RSA 还涉及:

  • 高质量素数与随机数生成;
  • 密钥长度和参数检查;
  • OAEP、PSS 等标准编码;
  • 常数时间模幂与盲化;
  • CRT 故障检测;
  • 统一错误处理和密钥安全存储。

教学实现可以帮助理解公式,但生产系统应使用经过审计的密码库和明确的协议规范。


八、总结

RSA 的核心并不是“用公钥加密、私钥解密”这句口号,而是一组相互咬合的数学关系:

  1. 选择不同大素数 p , q p,q p,q,构造 n = p q n=pq n=pq
  2. 通过 p , q p,q p,q 计算 φ ( n ) = ( p − 1 ) ( q − 1 ) \varphi(n)=(p-1)(q-1) φ(n)=(p1)(q1)
  3. 选择与 φ ( n ) \varphi(n) φ(n) 互质的公钥指数 e e e
  4. 计算模逆 d ≡ e − 1 ( m o d φ ( n ) ) d\equiv e^{-1}\pmod{\varphi(n)} de1(modφ(n))
  5. 利用 e d = 1 + k φ ( n ) ed=1+k\varphi(n) ed=1+kφ(n) 和欧拉定理说明运算可逆;
  6. 使用快速模幂高效处理大指数;
  7. 使用 CRT 把私钥运算拆到模 p p p、模 q q q 下加速。

但这些内容只定义了 RSA 的数学原语。裸 RSA 不随机、具有代数可塑性,也没有规定文本如何编码。下一篇将进入真正可部署的 RSA 方案:加密为什么需要 OAEP,签名为什么需要 PSS,以及“私钥加密就是签名”这句话究竟错在哪里。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐