这真的是出于我的深度,但我只是非常好奇,我不得不试一试。
爱德华弗伦克尔写了这篇非常简单的article in slate。他解释了RSA如何以非常简单的方式工作并举例说明。我想在R
中尝试一下,看看我是否可以复制它。
我从他的素数3和5的例子开始。"然后(p-1)(q-1)+ 1 =(3-1)(5-1)+ 1 = 9" 。然后可以将9分成3 * 3。所以
p = 3
q = 5
N = 15
r = 3
s = 3
到目前为止这么好,除了它不起作用。我的猜测是因为N
是因子3,所以这只是回到费马的原始小定理。
好的,所以RSA方程的结果需要是:1)不是素数,2)可以计入两个不是N
因子的数字。事实证明,这里没有很少的例子,我现在可以看到为什么Frenkel没有在文章的这一部分中用另一个例子来阐述它!
我终于确定了
p = 31
q = 37
N = 1147
r = 23
s = 47
当然这些数字对于R
int
来说太大了,所以我使用了gmp
包。现在如果我拿一个样本号进行解码,比如24,我就明白了。
library(gmp)
as.bigz(24^r) %% N
# Big Integer ('bigz') :
# [1] 331
as.bigz(331^s) %% N
# Big Integer ('bigz') :
# [1] 465
这回到了我能够达到的数学水平,即465不等于24。
我哪里出错?
答案 0 :(得分:1)
我不了解您的实施情况,但您在使用bigz
时犯了一个常见错误。 as.bigz(x^y)
仅作用于" base"价值x^y
的实施。您需要编写x^(bigz(y))
来强制实际计算为大整数类。考虑:
> foo <- as.bigz(23^875)
> bar <- 23^(as.bigz(875))
> foo-bar
Big Integer ('bigz') :
[1] 173766203193809456599982445949435627061939786100117250547173286503262376022458008465094333630120854338003194362163007597987225472483598640843335685441710193966274131338557192586399006789292714554767500194796127964596906605976605873665859580600161998556511368530960400907199253450604168622770350228527124626728538626805418833470107651091641919900725415994689920112219170907023561354484047025713734651608777544579846111001059482132180956689444108315785401642188044178788629853592228467331730519810763559577944882016286493908631503101121166109571682295769470379514531105239965209245314082665518579335511291525230373316486697786532335206274149240813489201828773854353041855598709390675430960381072270432383913542702130202430186637321862331068861776780211082856984506050024895394320139435868484643843368002496089956046419964019877586845530207748994394501505588146979082629871366088121763790555364513243984244004147636040219136443410377798011608722717131323621700159335786445601947601694025107888293017058178562647175461026384343438874861406516767158373279032321096262126551620255666605185789463207944391905756886829667520553014724372245300878786091700563444079107099009003380230356461989260377273986023281444076082783406821221904389928892660558992836584689744476863579307237496414568003846808286835850208746181481557645824713444905818642923064268658195509625918466444650382085475088234562378101921214427179437742847283767434306518359957311828817552403374413253648610960585668783098363467119582330958796937261035413592452252131671852390671592802688749850788514826262090255205005577571366541443538143160704804527447401296583096054981769466917484102135185441507991470784562950910215560441960379597002170300547435187143508062255844395408792944293400831831795566646329416511193212832923226323120404081092400841930612946287554533690559338257386838001380803072132077309936022498050235973754946108111287350398641170739150864953041877814592188607283695369537692538586785411834112926217758723900966685098645453563475609351753530469557589057290519159806133678120681750553758265808719760526017648046327072778049156254469071817016393730845185472213535888596169326926919296583452231894742256653465765066432901458967285013809247464106996628890408157081411997684227122115338859158363030326291909119925357416316195562067909241887465686042001962647100968496756163689270274883225844011829128304727462911444081923209114398978559088569
# easier way to verify they're different:
> log10(foo)
[1] 2408.24
> log10(bar)
[1] 1191.512