我正在尝试实现一个简单的RSA加密/解密过程,我很确定我已经以正确的方式获得了方程式。虽然加密后似乎没有打印出正确的解密值。有什么想法?。
//test program
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;
int gcd(int a, int b);
int main(){
char character = 'A'; //character that is to be encrypted
int p = 7;
int q = 5;
int e = 0; // just initializing to 0, assigning actual e value in the 1st for loop
int n = p*q;
int phi = (p-1)*(q-1);
int d = 0; // " " 2nd for loop
//---------------------------finding 'e' with phi. where "1 < e < phi(n)"
for (int i=2; i < phi; i++){
if (gcd(i,phi) == 1){ //if gcd is 1
e = i;
break;
}
}
//----------------------------
//---------------------------finding 'd'
for (int i = 2; i < phi; i++){
int temp = (e*i)%phi;
if (temp == 1){
d = i;
break;
}
}
printf("n:%d , e:%d , phi:%d , d:%d \n",n,e,phi,d);
printf("\npublic key is:[%d,%d]\n",e,n);
printf("private key is:[%d,%d]\n",d,n);
int m = static_cast<int>(character); //converting to a number
printf("\nconverted character num:%d\n",m);
//Encryption part ie. c = m^e MOD n
int power = pow(m,e); // m^e
int c = power%n; // c = m^e MOD n. ie. encrypted character
printf("\n\nEncrypted character number:%d\n",c);
//decryption part, ie. m = c^d MOD n
power = pow(c,d);
int m2 = power%n;
printf("\n\ndecrypted character number:%d\n",m2);
return 0;
}
int gcd(int a, int b){
int r;
if (a < 0) a = -a;
if (b < 0) b = -b;
if (b > a) {
r = b; b = a; a = r;
}
while (b > 0) {
r = a % b;
a = b;
b = r;
}
return a;
}
(正在使用的素数是5和7,用于测试)
这里我将字符'A'转换为其数值,当然是65.当我使用c = m^e MOD n
加密此值时(其中m是转换后的值,即65),它给出了c作为25。
现在,为了扭转这个过程,我做了m = c^d MOD n
,它给了我m
30 ...这真的不正确,因为它应该是65,不是吗?
我哪里出错?
[编辑]
我的d
计算是否正确?
答案 0 :(得分:6)
加密邮件m
必须小于n
。您不能使用大于n的值,因为计算是以模n完成的。在您的情况下m=65
和n=35
。因此,您实际上正在以n
为模型获得正确的答案,因为65 % 35 == 30
。
答案 1 :(得分:2)
这是因为m
大于或等于n
,就像@interjay已经回答的那样。
但我发现你的代码存在另一个问题,我的gcc4.1.2编译器输出24
表示加密值不是25
。这是因为您使用pow()
函数,然后将结果(类型为double)转换为导致精度损失的int。
请勿使用pow()
功能,而是使用 square and multiply modulo n 算法来计算c = m^e MOD n
和m = c^d MOD n
。它比pow()
快,你不需要不安全地将结果转发为整数。