为什么这个小小的RSA实现会产生错误的结果

Why does this tiny RSA implementation give wrong results?

本文关键字:错误 结果 实现 小小的 RSA 为什么      更新时间:2023-10-16

我正在尝试实现一个简单的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:%dn",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("nnEncrypted character number:%dn",c);
    //decryption part,  ie. m = c^d MOD n
    power = pow(c,d);
    int m2 = power%n; 
    printf("nndecrypted character number:%dn",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的计算正确吗?

加密消息m必须小于n。不能使用大于n的值,因为计算是以n为模进行的。在您的情况下,是m=65n=35。所以你实际上得到了模n的正确答案,因为65 % 35 == 30

它是由m大于或等于n引起的,就像@interjay已经回答了一样。

但我发现您的代码还有另一个问题,我的gcc4.1.2编译器为加密值输出24,而不是25。这是因为您使用pow()函数,然后将结果(类型为double)转换为int,导致精度损失

不要使用pow()函数,而是使用平方和乘模n算法来计算c = m^e MOD nm = c^d MOD n。它比pow()更快,并且您不需要不安全地将结果向下转换为整数。