Schmidt-Samoa密码系统
Schmidt-Samoa密码系统,像rabin加密一样,其安全性基于整数因式分解的难度。但 Rabin 解密时会得到四个解,而 Schmidt-Samor 得到的是唯一解。
密钥生成
1.选取两个大的质数p和q并进行计算
N
=
p
2
q
N = p^2q
N=p2q
2. 计算
d
=
i
n
v
e
r
t
(
N
,
φ
(
p
q
)
)
d = invert(N,φ(pq))
d=invert(N,φ(pq))
加密
对消息m,计算密文 C = m N m o d N C=m^N mod N C=mNmodN
解密
计算明文 m = C d m = C^d m=Cd m o d mod mod p q pq pq
举例:
- p = 7 , q = 11 , N = p 2 q = 539 p = 7,q = 11,N = p^2q = 539 p=7,q=11,N=p2q=539 , d = N − 1 d = N^{-1} d=N−1 m o d mod mod l c m ( p − 1 , q − 1 ) = 29 lcm(p-1,q-1) = 29 lcm(p−1,q−1)=29
- m = 32 m = 32 m=32, c = m N c = m^N c=mN m o d mod mod N = 373 N = 373 N=373
验证:
- m = c d m = c^d m=cd m o d mod mod p q = 37 3 29 pq = 373^{29} pq=37329 m o d mod mod p q = 37 3 29 m o d 77 = 32 pq = 373^{29} mod 77 = 32 pq=37329mod77=32
关于获取pq的问题
由 N = p 2 ∗ q N = p^2*q N=p2∗q, d ∗ N = 1 m o d ( q − 1 ) ( p − 1 ) d*N = 1 mod (q-1)(p-1) d∗N=1mod(q−1)(p−1),通过欧拉定理可以得到:
a ( p − 1 ) ( q − 1 ) ≡ 1 a^{(p-1)(q-1)}≡1 a(p−1)(q−1)≡1 m o d mod mod p q pq pq
所以:
a N ∗ d = a 1 + k ∗ ( q − 1 ) ( p − 1 ) ≡ a ∗ a k ∗ ( q − 1 ) ( p − 1 ) = a a^{N*d} = a^{1+k*(q-1)(p-1)} ≡a*a^{k*(q-1)(p-1)}= a aN∗d=a1+k∗(q−1)(p−1)≡a∗ak∗(q−1)(p−1)=a m o d mod mod p q pq pq
所以:
k ∗ p q = a N ∗ d − a k*pq = a^{N*d} - a k∗pq=aN∗d−a
p q = g c d ( a N ∗ d − a , N ) pq = gcd(a^{N*d} - a,N) pq=gcd(aN∗d−a,N)
因为a的取值可以是 a = 2,3,4,5…,这里方便计算我们取 2
题目:
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
解题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))