【发布时间】:2015-05-21 04:19:22
【问题描述】:
我正在努力磨练我的 C 技能并更好地了解 RSA,因此我自己尝试制作自己的生成器。我已经生成了两个基本素数 p 和 q,计算了值 o = (p-1) * (q-1)。这些工作正常。下一步是我遇到问题的地方。我非常接近,但我似乎找不到计算 1 mod r 值的加密和解密因子的正确方法。任何产生这个的帮助都会很棒。 (或者只是自己编写代码,我可以从中学习)另外,如果还有其他问题,请告诉我!
这是我的代码:
#include<stdio.h>
#include<time.h>
#include"../hdr/test.h" //fake header just to satisfy my makefile
//Receives: number that was generated in main
//Returns: 1 for false, 0 for true
//Purpose: checks if the numbers is prime and returns 1 or 0
int isPrime(int number)
{
if (number <= 1)
return 0;
int i;
for (i=2; i<number; i++) {
if (number % i == 0)
return 0;
}
return 1;
}
/*Receives: an integer ((p-1) * (q-1))
Returns: integer (e)
Purpose: Generates the relatively prime number to ((p-1) * (q-1))*/
int gen_E(int o)
{
puts("Generating E...");
int e;
do {e = rand() % o;} while (GCD(e, o) != 1);
return e;
}
/*Receives: integer E and O from the main
Returns: newly calculated integer D
Purpose: Generates D for the private key*/
int gen_D(int e, int o)
{
puts("Generating D...");
int e = a;
int o = b;
int phin, d;
for (phin = 1; phin < o; phin ++)
for (d = 1; d < 998001; d ++)
if ((e * d) == (o * phin) + 1) return d;
}
/*Receives: integer E and O from main
Returns: greatest common divisor's remainder
Purpose: Calculate if the two numbers share a divisor.*/
int GCD(int e, int o)
{
int c;
while (e != 0) {
c = e; e = o%e; o = c;
}
return o;
}
int main()
{
puts("Generating Prime P...");
srand(time(NULL));
int p = rand() % 1000;
while (isPrime(p) != 1) {
p = rand() % 1000;
}
puts("Generating Prime Q...");
int q = rand() % 1000;
while (isPrime(q) != 1) {
q = rand() % 1000;
}
int n = p * q;
int o = (p - 1) * (q - 1);
int e = gen_E(o);
int d = gen_D(e, o);
printf("p: %d\nq: %d\nn: %d\no: %d\ne: %d\nd: %d\n", p, q, n, o, e, d);
printf("KU = {%d, %d}\n", e, n);
printf("KR = {%d, %d}\n", d, n);
}
【问题讨论】:
-
现在您需要
<stdlib.h>来获取srand()、rand()的原型。但我的主要观点仍然存在:不要对 C 代码使用 C++ 编译器。 -
哦,哇,我使用的是 g++ 而不是 gcc。感谢您指出这一点,从未注意到。
-
请注意,对于如此小的质数,任何给定消息都很有可能与其中一个发生冲突(这将导致加密/解密无法工作)。
标签: c cryptography rsa