Schmidt-Samoa密码系统
Schmidt-Samoa密码系统,像rabin加密一样,其安全性基于整数因式分解的难度。但 Rabin 解密时会得到四个解,而 Schmidt-Samor 得到的是唯一解。
密钥生成
1.选取两个大的质数 \(p\) 和 \(q\) 并进行计算 $N = p^2 q $
2.计算 \(d = invert(N,\phi(p*q))\)
加密
对消息m,计算密文 \(C = m^N mod \;N\)
解密
计算明文,\(m = C^d mod (p*q)\)
举例:
- p = 7 , q = 11,N = \(p^2*q\) = 539,d = \(N^{-1}\) \(mod lcm (p-1,q-1)\) = 29
- m =32,c = \(m^N mod \;N\) = 373
验证:
- m = \(c^d mod\;p*q\) = \(373^{20}mod\;77\) = 32
关于获取pq的问题
由$N = p^2 q \(,\)dN = 1 mod;(p-1)(q-1)$,通过欧拉定理可以得到:
\(\mathrm{a}^{(\mathrm{p}-1)(\mathrm{q}-1)} \equiv 1 \bmod \mathrm{p*q}\)
所以:
\(\mathrm{a}^{\mathrm{N} * \mathrm{~d}}=\mathrm{a}^{1+\mathrm{k} *(\mathrm{q}-1)(\mathrm{p}-1)} \equiv \mathrm{a} * \mathrm{a}^{\mathrm{k} *(\mathrm{q}-1)(\mathrm{p}-1)}=\mathrm{a} \bmod \mathrm{p*q}\)
所以:
\(\begin{array}{l} \mathrm{k} * \mathrm{p*q}=\mathrm{a}^{\mathrm{N} * \mathrm{~d}}-\mathrm{a} \\ \mathrm{p*q}=\operatorname{gcd}\left(\mathrm{a}^{\mathrm{N} * \mathrm{~d}}-\mathrm{a}, \mathrm{N}\right) \end{array}\)
因为 a 的取值可以是 $ a=2,3,4,5 \ldots$ , 这里方便计算我们取 2
例题:
[GUET-CTF2019]Uncle Sam
题目:
from Crypto.Util.number import *
def generkey(k):
p, q = getPrime(k), getPrime(k)
pubkey = p**2 * q
n = pubkey
l = (p-1)*(q-1) / gcd(p-1, q-1)
privkey = inverse(n, l)
return pubkey, privkey
def encrypt(m, pubkey):
return pow(bytes_to_long(m), pubkey, pubkey)
# pubkey = 2188967977749378274223515689363599801320698247938997135947965550196681836543275429767581633044354412195352229175764784503562989045268075431206876726265968368605210824232207290410773979606662689866265612797103853982014198455433380266671856355564273196151136025319624636805659505233975208570409914054916955097594873702395812044506205943671404203774360656553350987491558491176962018842708476009578127303566834534914605109859995649555122751891647040448980718882755855420324482466559223748065037520788159654436293431470164057490350841209872489538460060216015196875136927502162027562546316560342464968237957692873588796640619530455268367136243313422579857823529592167101260779382665832380054690727358197646512896661216090677033395209196007249594394515130315041760988292009930675192749010228592156047159029095406021812884258810889225617544404799863903982758961208187042972047819358256866346758337277473016068375206319837317222523597
# privkey = 1430375790065574721602196196929651174572674429040725535698217207301881161695296519567051246290199551982286327831985649037584885137134580625982555634409225551121712376849579015320947279716204424716566222721338735256648873164510429206991141648646869378141312253135997851908862030990576004173514556541317395106924370019574216894560447817319669690140544728277302043783163888037836675290468320723215759693903569878293475447370766682477726453262771004872749335257953507469109966448126634101604029506006038527612917418016783711729800719387298398848370079742790126047329182349899824258355003200173612567191747851669220766603
# enc = 1491421391364871767357931639710394622399451019824572362288458431186299231664459957755422474433520889084351841298056066100216440853409346006657723086501921816381226292526490195810903459483318275931326433052468863850690793659405367902593999395060606972100169925074005992478583035226026829214443008941631771292291305226470216430735050944285543542354459162474346521327649934512511202470099020668235115245819634762067338432916012664452035696422865651002305445711778476072004708256200872226475346448360491248823843688268126341094612981308791499434770936360676087490303951728563482686307164877000300082742316368597958297217061375140696272398140310043942637287763946305961019518639745426370821124559939597559475362769382796386720030343305889701616194279058139516811941262747298761646317383112470923295543635754747288259324745583689440061956478083777663996487389553238481759103908588004219390662578446313004404784835263543083088327198
注意到 $ l=\operatorname{lcm}(p-1, q-1) $, 并且还给出了私钥 $ d $ 值位 $n $模 $l $ 下的逆元。查阅了相关资料,可 以得知这是$Schmidt-Samoa \(公钥密码体系。
这一加密体系中,加密过程是\) c \equiv m^{n}(\bmod n) \(,而解密函数则是\) m \equiv c^{d}(\bmod p q) $
下面简单地证明一下:
已知
\(\phi(n)=\phi\left(p^{2} q\right)=p(p-1)(q-1)\)
由费马小定理,可以推出
\(a^{p(p-1)(q-1)} \equiv 1 \quad(\bmod n)\)
又因为
\(d n \equiv 1 \quad(\bmod (p-1)(q-1))\)
所以
\(a^{n d} \equiv a^{n d} \bmod ((p-1)(q-1)) \equiv a\)
所以
\(a^{n d}-a \equiv 0 \quad(\bmod p q)\)
因此
\(p q=\operatorname{gcd}\left(a^{n d}-a, n\right)\)
由于 $a $ 是任意的数字,因此我们可以取$ a=2,3,4 \ldots $ 均可, 为方便起见这里取$ 2$
解题EXP:
from gmpy2 import*
from libnum import*
N = 2188967977749378274223515689363599801320698247938997135947965550196681836543275429767581633044354412195352229175764784503562989045268075431206876726265968368605210824232207290410773979606662689866265612797103853982014198455433380266671856355564273196151136025319624636805659505233975208570409914054916955097594873702395812044506205943671404203774360656553350987491558491176962018842708476009578127303566834534914605109859995649555122751891647040448980718882755855420324482466559223748065037520788159654436293431470164057490350841209872489538460060216015196875136927502162027562546316560342464968237957692873588796640619530455268367136243313422579857823529592167101260779382665832380054690727358197646512896661216090677033395209196007249594394515130315041760988292009930675192749010228592156047159029095406021812884258810889225617544404799863903982758961208187042972047819358256866346758337277473016068375206319837317222523597
#N = p^2*q
d = 1430375790065574721602196196929651174572674429040725535698217207301881161695296519567051246290199551982286327831985649037584885137134580625982555634409225551121712376849579015320947279716204424716566222721338735256648873164510429206991141648646869378141312253135997851908862030990576004173514556541317395106924370019574216894560447817319669690140544728277302043783163888037836675290468320723215759693903569878293475447370766682477726453262771004872749335257953507469109966448126634101604029506006038527612917418016783711729800719387298398848370079742790126047329182349899824258355003200173612567191747851669220766603
c = 1491421391364871767357931639710394622399451019824572362288458431186299231664459957755422474433520889084351841298056066100216440853409346006657723086501921816381226292526490195810903459483318275931326433052468863850690793659405367902593999395060606972100169925074005992478583035226026829214443008941631771292291305226470216430735050944285543542354459162474346521327649934512511202470099020668235115245819634762067338432916012664452035696422865651002305445711778476072004708256200872226475346448360491248823843688268126341094612981308791499434770936360676087490303951728563482686307164877000300082742316368597958297217061375140696272398140310043942637287763946305961019518639745426370821124559939597559475362769382796386720030343305889701616194279058139516811941262747298761646317383112470923295543635754747288259324745583689440061956478083777663996487389553238481759103908588004219390662578446313004404784835263543083088327198
pq = gcd(pow(2,d*N,N)-2,N)
m = pow(c,d,pq)
print(n2s(m))
标签:Samoa,mathrm,bmod,密码,mod,Schmidt,pubkey,equiv
From: https://www.cnblogs.com/vconlln/p/17066497.html