2013-08-22 50 views
2

我想使用ASCII值將字符加密(RSA)爲整數。例如。 'a'加密爲48.C++中的RSA加密

對於加密:c=pow(m,e)%n其中c是密文,m是純文本,(e,n)是公鑰。

如果POW(M,E)是大說67^7,它不適合在INT。但是如果我使用double,我不能用模數%運算符來使用它。所以我寫了使用for循環此功能加密:

int encrypt(int m, int e, int n) 
{ 
    int res=m, i; 
    for(i=0; i<e-1;i++) 
     res=(res*res)%n; 
    return res; 
} 

它工作了67^7mod11是67,但後來我才知道這是不是實際上是正確的。我哪裏錯了?

+2

你是做'E-1' squarings,所以你計算'平方公尺(2 ^(E -1))'modulo'n'。對於通過重複乘法算法進行的簡單求冪,您希望'res =(res * m)%n;'。 –

+0

你可以寫這個答案,我可以接受它嗎? –

+0

+1 to @DanielFischer。我即將開始進行模連鎖,只是看到他已經擁有了它,但在迭代中丟失了一個循環並使用了錯誤的乘法器。咄。好的趕上! – WhozCraig

回答

5

你的循環

for(i=0; i<e-1;i++) 
    res=(res*res)%n; 

廣場e-1次模n,這意味着它計算m^(2^(e-1))n。爲了計算m^en用簡單的算法,使用

for(i = 0; i < e-1; ++i) 
    res = (res*m) % n; 

代替。

對於稍快算法當指數較大時,可以通過反覆平方冪使用:

res = 1; 
while (e > 0) { 
    if (e % 2 != 0) { 
     res = (m*res) % n; 
    } 
    m = (m*m) % n; 
    e /= 2; 
} 
return res; 
0

通常在使用加密參數時,使用「big int」而不是int。 正是因爲這個原因。

有一些建議位置: Bigint (bigbit) library

+0

我不應該使用外部庫。我現在正在家裏嘗試,但必須在沒有互聯網接入的大學的Fedora上執行它。 –

+0

那麼所有我可以說的是實現大int ... 無論如何,這將是混亂的做法,特別是如果你要用電腦密碼術搞笑。 – TomF