C 如何使RSA具有更大的p和q值?
我的项目是使用讲师自己给出的C语言编写的框架来实现RSA。我对C不是很熟悉,但我能做到。但问题是,它只在系统上处于:p的条件下工作C 如何使RSA具有更大的p和q值?,c,encryption,cryptography,rsa,C,Encryption,Cryptography,Rsa,我的项目是使用讲师自己给出的C语言编写的框架来实现RSA。我对C不是很熟悉,但我能做到。但问题是,它只在系统上处于:p的条件下工作uint是32位无符号类型。如果p和q大于255(28-1),则n=p*q大于或等于216。这意味着中间计算r*r可能会在r=(r*r)%n行中大于232-1。无符号整数溢出是静默的,仅保留低位32位(对于32位无符号类型),这将丢失信息并导致错误答案。类似的问题出现在r=(r*base)%n行中 解决办法首先是不要把算术视为理所当然。这是你作为程序员成熟的一部分。其
uint
是32位无符号类型。如果p和q大于255(28-1),则n=p*q大于或等于216。这意味着中间计算r*r
可能会在r=(r*r)%n行中大于232-1代码>。无符号整数溢出是静默的,仅保留低位32位(对于32位无符号类型),这将丢失信息并导致错误答案。类似的问题出现在r=(r*base)%n行中代码>
解决办法首先是不要把算术视为理所当然。这是你作为程序员成熟的一部分。其次,可以使用更广泛的中间结果类型来解决问题。例如,您可以创建一个简单的mod_mul函数:
int main(int argc, char* argv[]) {
uint plain_data, encrpyted_data, decrpyted_data;
uint seed = time(NULL);
plain_data = 201;
// create random number with seed
seed = time(NULL);
InitWELLRNG512a(&seed);
// create RSA key
miniRSAKeygen(&p, &q, &e, &d, &n);
printf("0. Key generation is Success!\n ");
printf("p : %u\n q : %u\n e : %u\n d : %u\n N : %u\n\n", p, q, e, d, n);
// test RSA encryption
encrpyted_data = miniRSA(plain_data, e, n);
printf("1. plain text : %u\n", plain_data);
printf("2. encrypted plain text : %u\n\n", encrpyted_data);
// test RSA decryption
decrpyted_data = miniRSA(encrpyted_data, d, n);
printf("3. cipher text : %u\n", encrpyted_data);
printf("4. Decrypted plain text : %u\n\n", decrpyted_data);
// print result
printf("RSA Decryption: %s\n", (decrpyted_data == plain_data) ? "SUCCESS!" : "FAILURE!");
return 0;
}
#include <stdint.h>
uint mod_mul(uint a, uint b, uint n) {
uint64_t result = ((uint64_t) a) * ((uint64_t) b) % ((uint64_t) n);
return (uint) result;
}
#包括
单元模块(单元a、单元b、单元n){
结果=((uint64)a)*((uint64)b)%((uint64)n);
返回(uint)结果;
}
这是因为中间算术是用64位算术执行的,而且我们知道结果小于232,因此最终(uint)强制转换结果不会丢失信息。在您的系统上,uint是32位无符号类型。如果p和q大于255(28-1),则n=p*q大于或等于216。这意味着中间计算r*r
可能会在r=(r*r)%n行中大于232-1代码>。无符号整数溢出是静默的,仅保留低位32位(对于32位无符号类型),这将丢失信息并导致错误答案。类似的问题出现在r=(r*base)%n行中代码>
解决办法首先是不要把算术视为理所当然。这是你作为程序员成熟的一部分。其次,可以使用更广泛的中间结果类型来解决问题。例如,您可以创建一个简单的mod_mul函数:
int main(int argc, char* argv[]) {
uint plain_data, encrpyted_data, decrpyted_data;
uint seed = time(NULL);
plain_data = 201;
// create random number with seed
seed = time(NULL);
InitWELLRNG512a(&seed);
// create RSA key
miniRSAKeygen(&p, &q, &e, &d, &n);
printf("0. Key generation is Success!\n ");
printf("p : %u\n q : %u\n e : %u\n d : %u\n N : %u\n\n", p, q, e, d, n);
// test RSA encryption
encrpyted_data = miniRSA(plain_data, e, n);
printf("1. plain text : %u\n", plain_data);
printf("2. encrypted plain text : %u\n\n", encrpyted_data);
// test RSA decryption
decrpyted_data = miniRSA(encrpyted_data, d, n);
printf("3. cipher text : %u\n", encrpyted_data);
printf("4. Decrypted plain text : %u\n\n", decrpyted_data);
// print result
printf("RSA Decryption: %s\n", (decrpyted_data == plain_data) ? "SUCCESS!" : "FAILURE!");
return 0;
}
#include <stdint.h>
uint mod_mul(uint a, uint b, uint n) {
uint64_t result = ((uint64_t) a) * ((uint64_t) b) % ((uint64_t) n);
return (uint) result;
}
#包括
单元模块(单元a、单元b、单元n){
结果=((uint64)a)*((uint64)b)%((uint64)n);
返回(uint)结果;
}
这是因为中间算法是用64位算法执行的,并且由于我们知道结果小于232,最终(uint)强制转换结果不会丢失信息。“它失败”不是一个问题描述。您是否遇到意外行为,如错误结果、错误输出或其他情况?当加密数据被解密回来时,它与纯数据(纯文本)不同,请注意r=(r*r)%n中的溢出代码>和r=(r*base)%n
如果n
,则可能发生这种情况。使用更广泛的数学。尝试键入defuint
,因为unsigned long
“它失败”不是问题描述。您是否遇到意外行为,如错误结果、错误输出或其他情况?当加密数据被解密回来时,它与纯数据(纯文本)不同,请注意r=(r*r)%n中的溢出代码>和r=(r*base)%n
如果n
,则可能发生这种情况。使用更广泛的数学。尝试键入defuint
作为unsigned long
。对于实际版本,您需要一个大数字库。例如,OpenSSL包含BN
功能(无论如何,仅限内部使用)。任何其他包含非对称加密的加密库都将包含或导入类似的内容,当然,除非它只是引用另一个库。请注意,如果要进行部署,您可能需要防止旁道攻击的函数。无符号整数溢出是静默的(除非在标准语言中没有溢出;计算定义为换行模N,其中N是类型的最大值加1)。有符号整数溢出具有未定义的行为。次要:result
不必是uint64\u t
<代码>uintn结果
就足够了<代码>((uint64)a)*((uint64)b)%((uint64)n)代码>可简化为((uint64_t)a)*b%n代码>。对于真实版本,您需要一个大数字库。例如,OpenSSL包含BN
功能(无论如何,仅限内部使用)。任何其他包含非对称加密的加密库都将包含或导入类似的内容,当然,除非它只是引用另一个库。请注意,如果要进行部署,您可能需要防止旁道攻击的函数。无符号整数溢出是静默的(除非在标准语言中没有溢出;计算定义为换行模N,其中N是类型的最大值加1)。有符号整数溢出具有未定义的行为。次要:result
不必是uint64\u t
<代码>uintn结果
就足够了<代码>((uint64)a)*((uint64)b)%((uint64)n)代码>可简化为((uint64_t)a)*b%n代码>。
void miniRSAKeygen(uint *p, uint *q, uint *e, uint *d, uint *n) {
*p =23;
*q = 17;
*n = (*p)*(*q);
*e = 2;
unsigned long long phi = (*p-1)*(*q-1);
printf("Phi %llu\n",phi);
while(*e<phi)
{
if(GCD(phi,*e)==1)
break;
else
*e = *e + 1;
}
*d = ModInv(*e,phi);
}
uint miniRSA(uint data, uint key, uint n) {
unsigned long long result;
result = ModPow(data,key,n);
printf("%llu\n", result );
return result;
}
int main(int argc, char* argv[]) {
uint plain_data, encrpyted_data, decrpyted_data;
uint seed = time(NULL);
plain_data = 201;
// create random number with seed
seed = time(NULL);
InitWELLRNG512a(&seed);
// create RSA key
miniRSAKeygen(&p, &q, &e, &d, &n);
printf("0. Key generation is Success!\n ");
printf("p : %u\n q : %u\n e : %u\n d : %u\n N : %u\n\n", p, q, e, d, n);
// test RSA encryption
encrpyted_data = miniRSA(plain_data, e, n);
printf("1. plain text : %u\n", plain_data);
printf("2. encrypted plain text : %u\n\n", encrpyted_data);
// test RSA decryption
decrpyted_data = miniRSA(encrpyted_data, d, n);
printf("3. cipher text : %u\n", encrpyted_data);
printf("4. Decrypted plain text : %u\n\n", decrpyted_data);
// print result
printf("RSA Decryption: %s\n", (decrpyted_data == plain_data) ? "SUCCESS!" : "FAILURE!");
return 0;
}
#include <stdint.h>
uint mod_mul(uint a, uint b, uint n) {
uint64_t result = ((uint64_t) a) * ((uint64_t) b) % ((uint64_t) n);
return (uint) result;
}