Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使RSA具有更大的p和q值?_C_Encryption_Cryptography_Rsa - Fatal编程技术网

C 如何使RSA具有更大的p和q值?

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行中 解决办法首先是不要把算术视为理所当然。这是你作为程序员成熟的一部分。其

我的项目是使用讲师自己给出的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行中

解决办法首先是不要把算术视为理所当然。这是你作为程序员成熟的一部分。其次,可以使用更广泛的中间结果类型来解决问题。例如,您可以创建一个简单的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
,则可能发生这种情况。使用更广泛的数学。尝试键入def
uint
,因为
unsigned long
“它失败”不是问题描述。您是否遇到意外行为,如错误结果、错误输出或其他情况?当加密数据被解密回来时,它与纯数据(纯文本)不同,请注意
r=(r*r)%n中的溢出
r=(r*base)%n
如果
n
,则可能发生这种情况。使用更广泛的数学。尝试键入def
uint
作为
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;
}