为什么这个小小的RSA实现会产生错误的结果
Why does this tiny RSA implementation give wrong results?
我正在尝试实现一个简单的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=65
和n=35
。所以你实际上得到了模n
的正确答案,因为65 % 35 == 30
。
它是由m
大于或等于n
引起的,就像@interjay已经回答了一样。
但我发现您的代码还有另一个问题,我的gcc4.1.2编译器为加密值输出24
,而不是25
。这是因为您使用pow()
函数,然后将结果(类型为double)转换为int,导致精度损失。
不要使用pow()
函数,而是使用平方和乘模n算法来计算c = m^e MOD n
和m = c^d MOD n
。它比pow()
更快,并且您不需要不安全地将结果向下转换为整数。
相关文章:
- 如何修复循环中的错误产生的错误结果?
- 添加可变参数函数的错误结果
- 使用特征 3 线性系统求解器的错误结果
- 按位包含 OR 的错误结果
- 如果我将索引变量更改为零,并且合并函数中的k = 0,则获得合并排序的错误结果
- STD :: FPCLASSIFY的错误结果使用Valgrind进行长时间的双重双重结果
- 视觉工作室的错误结果
- 将C#struct传递给C 不受管理的DLL返回错误结果
- 最长的常见子字错误结果
- 华氏度到摄氏度的错误结果
- UE4中简单坐标变换的错误结果
- 记忆错误结果的说明[编译器行为]
- 如何解决错误PRJ0002:错误结果 -1073741515从"cl.exe"返回?
- 错误 PRJ0002:错误结果 -1073741515 从"C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\cl.
- glGetUniformLocation OpenGL ES 2.0(在ipad 3 iOS 7.0.3上返回错误结果)
- 在模板函数中调用std::for_each时出现错误结果
- 使用copy和back_inserter将矢量附加到其自身时出现错误结果
- CUDA 线程在全局内存中的私有位置写入时出现错误结果
- 来自 c++ 代码的错误结果
- 使用浮点值和铸造的算术运算的错误结果 - 差异很大,我想这不是准确值的情况(429497)?