您的位置:

c语言编程rsa,求数列的和C语言编程

本文目录一览:

如何用C语言实现RSA算法?

上学期交的作业,已通过老师在运行时间上的测试\x0d\x0a#include \x0d\x0a#include \x0d\x0a\x0d\x0aunsigned long prime1,prime2,ee;\x0d\x0a\x0d\x0aunsigned long *kzojld(unsigned long p,unsigned long q) //扩展欧几里得算法求模逆\x0d\x0a{\x0d\x0aunsigned long i=0,a=1,b=0,c=0,d=1,temp,mid,ni[2];\x0d\x0amid=p;\x0d\x0awhile(mid!=1)\x0d\x0a{\x0d\x0awhile(pq)\x0d\x0a{p=p-q;mid=p;i++;}\x0d\x0a a=c*(-1)*i+a;b=d*(-1)*i+b;\x0d\x0atemp=a;a=c;c=temp;\x0d\x0atemp=b;b=d;d=temp;\x0d\x0atemp=p;p=q;q=temp;\x0d\x0ai=0;\x0d\x0a}\x0d\x0ani[0]=c;ni[1]=d;\x0d\x0areturn(ni);\x0d\x0a}\x0d\x0a\x0d\x0aunsigned long momi(unsigned long a,unsigned long b,unsigned long p) //模幂算法\x0d\x0a{\x0d\x0aunsigned long c;\x0d\x0ac=1;\x0d\x0aif(ap) a=a%p;\x0d\x0aif(bp) b=b%(p-1);\x0d\x0awhile(b!=0)\x0d\x0a{\x0d\x0awhile(b%2==0)\x0d\x0a{\x0d\x0ab=b/2;\x0d\x0aa=(a*a)%p;\x0d\x0a}\x0d\x0ab=b-1;\x0d\x0ac=(a*c)%p;\x0d\x0a}\x0d\x0areturn(c);\x0d\x0a}\x0d\x0a\x0d\x0avoid RSAjiami() //RSA加密函数\x0d\x0a{\x0d\x0aunsigned long c1,c2;\x0d\x0aunsigned long m,n,c;\x0d\x0an=prime1*prime2;\x0d\x0asystem("cls");\x0d\x0aprintf("Please input the message:\n");\x0d\x0ascanf("%lu",m);getchar();\x0d\x0ac=momi(m,ee,n);\x0d\x0aprintf("The cipher is:%lu",c);\x0d\x0areturn;\x0d\x0a}\x0d\x0a\x0d\x0avoid RSAjiemi() //RSA解密函数\x0d\x0a{\x0d\x0aunsigned long m1,m2,e,d,*ni;\x0d\x0aunsigned long c,n,m,o;\x0d\x0ao=(prime1-1)*(prime2-1);\x0d\x0an=prime1*prime2;\x0d\x0asystem("cls");\x0d\x0aprintf("Please input the cipher:\n");\x0d\x0ascanf("%lu",c);getchar();\x0d\x0ani=kzojld(ee,o);\x0d\x0ad=ni[0];\x0d\x0am=momi(c,d,n);\x0d\x0aprintf("The original message is:%lu",m);\x0d\x0areturn;\x0d\x0a}\x0d\x0a\x0d\x0avoid main()\x0d\x0a{unsigned long m;\x0d\x0achar cho;\x0d\x0aprintf("Please input the two prime you want to use:\n");\x0d\x0aprintf("P=");scanf("%lu",prime1);getchar();\x0d\x0aprintf("Q=");scanf("%lu",prime2);getchar();\x0d\x0aprintf("E=");scanf("%lu",ee);getchar();\x0d\x0aif(prime1

RSA加密解密算法示例(C语言)

#include stdlib.h

#include stdio.h

#include string.h

#include math.h

#include time.h

#define PRIME_MAX 200   // 生成素数范围

#define EXPONENT_MAX 200 // 生成指数e范围

#define Element_Max 127    // 加密单元的最大值,这里为一个char, 即1Byte

char str_read[100]="hello world !";  // 待加密的原文

int str_encrypt[100];                // 加密后的内容

char str_decrypt[100];              // 解密出来的内容

int str_read_len;                    // str_read 的长度

int prime1, prime2;                  // 随机生成的两个质数

int mod, eular;                      // 模数和欧拉数

int pubKey, priKey;                  // 公钥指数和私钥指数

// 生成随机素数,实际应用中,这两个质数越大,就越难破解。

int randPrime()

{

int prime, prime2, i;

next:

prime = rand() % PRIME_MAX;   // 随机产生数

if (prime = 1) goto next;      // 不是质数,生成下一个随机数

if (prime == 2 || prime == 3) return prime;

prime2 = prime / 2;              // prime=4, prime2 的平方必定大于 prime , 因此只检查小于等于prime2的数

for (i = 2; i = prime2; i++)   // 判断是否为素数

{

if (i * i prime) return prime;

if (prime % i == 0) goto next;  // 不是质数,生成下一个随机数

}

}

// 欧几里德算法,判断a,b互质

int gcd(int a, int b)

{

int temp;

while (b != 0) {

temp = b;

b = a % b;

a = temp;

}

return a;

}

//生成公钥指数,条件是 1 e 欧拉数,且与欧拉数互质。

int randExponent()

{

int e;

while (1)

{

e = rand() % eular; if (e EXPONENT_MAX) break;

}

while (1)

{

if (gcd(e, eular) == 1) return e; e = (e + 1) % eular; if (e == 0 || e EXPONENT_MAX) e = 2;

}

}

//生成私钥指数

int inverse()

{

int d, x;

while (1)

{

d = rand() % eular;

x = pubKey * d % eular;

if (x == 1)

{

return d;

}

}

}

//加密函数

void jiami()           

{

str_read_len = strlen(str_read);      //从参数表示的地址往后找,找到第一个'\0',即串尾。计算'\0'至首地址的“距离”,即隔了几个字符,从而得出长度。

printf("密文是:");

for (int i = 0; i str_read_len; i++)

{

int C = 1; int a = str_read[i], b = a % mod;

for (int j = 0; j pubKey; j++) //实现加密

{

C = (C*b) % mod;

}

str_encrypt[i] = C;

printf("%d ", str_encrypt[i]);

}

printf("\n");

}

//解密函数

void jiemi()         

{

int i=0;  for (i = 0; i str_read_len; i++)

{

int C = 1; int a = str_encrypt[i], b=a%mod;

for (int j = 0; j priKey; j++)

{

C = (C * b) % mod;

}

str_decrypt[i] = C;

}

str_decrypt[i] = '\0'; printf("解密文是:%s \n", str_decrypt);

}

int main()

{

srand(time(NULL));

while (1)

{

prime1 = randPrime(); prime2 = randPrime(); printf("随机产生两个素数:prime1 = %d , prime2 = %d ", prime1, prime2);

mod = prime1 * prime2; printf("模数:mod = prime1 * prime2 = %d \n", mod); if (mod Element_Max) break; // 模数要大于每个加密单元的值

}

eular = (prime1 - 1) * (prime2 - 1);  printf("欧拉数:eular=(prime1-1)*(prime2-1) = %d \n", eular);

pubKey = randExponent(); printf("公钥指数:pubKey = %d\n", pubKey);

priKey = inverse(); printf("私钥指数:priKey = %d\n私钥为 (%d, %d)\n", priKey, priKey, mod);

jiami(); jiemi();

return 0;

}

如何用C语言程序实现RSA算法?

#include "stdafx.h"

#includemath.h

#includestdio.h

int isP(int m)

{

int i;

for(i=2;im;i++)

if(m % i==0)return 0;

return 1;

}

int num(int m,int k)

{

int i=0;

for(m=m;k0;m++)

if(isP(m))

{

k--;

return m;

}

}

int main(int argc, char* argv[])

{

int P,Q,E,D,i,k,fn,c=0,j=0,t=1,f1=1,l=2;

int a[10];

long N0,N1;

long PT,CT,N;

printf("请输入第一个数:");

scanf("%d",P);

P=num(P,1);

printf("请输入比第一次大的数:");

scanf("%d",Q);

Q=num(Q,1);

N=P*Q;

N1=(P-1)*(Q-1);

N0=N1;

while(N1=3)

{

while(N1%l!=0)

{

l++;

}

a[j++]=l;

N1=N1/l;

}

printf("请输入一个奇数E,若E不合适,系统将会找一个比E大的合适值:");

scanf("%d",E);

for(i=E;t0;i=i+2)

{

for(k=0;kj+1;k++)

{

if(E%a[k-1]==0) break;

else if(k==j)

{

t--;

}

E=i;

}

}

for(k=1; ;k++)

{

if((N0*k+1)%E==0)

{

D=(N0*k+1)/E;

if((D*E)%N0==1)

break;

}

}

printf("请输入明文:");

scanf("%ld",PT);

for(i=1;i=E;i++)

{

fn=(f1*PT)%N;

f1=fn;

CT=fn;

}

f1=1;

for(i=1;i=D;i++)

{

fn=(f1*CT)%N;

f1=fn;

PT=fn;

}

printf("P=%d,Q=%d\n",P,Q);

for(k=0;kj;k++)

printf("%d ",a[k]);

printf("\n");

printf("E=%d,D=%d,N=%ld\n",E,D,N);

printf("密码是:%ld\n",CT);

printf("明文是:%ld\n",PT);

return 0;

}

rsa算法c语言实现

程序修改如下:

(主要是你的循环写的不对,输入的字符应该-'0'才能与正常的数字对应)

#includestdio.h

#includemath.h

int

candp(int

a,int

b,int

c)

{int

r=1;

int

s;

int

i=1;

for(i=1;i=b;i++)r=r*a;

printf("%d\

",r);

s=r%c;

printf("%d\

",s);

return

s;}

void

main()

{

int

p,q,e,d,m,n,t,c,r

;

char

s;

printf("please

input

the

p,q:");

scanf("%d%d",p,q);

n=p*q;

t=(p-1)*(q-1);

printf("the

n

is

%12d\

",n);

printf("please

input

the

e:");

scanf("%d",e);

while(e1||en)

//此处修改为while循环

{

printf("e

is

error,please

input

again:");

scanf("%d",e);

}

d=1;

while(((e*d)%t)!=1)

d++;

printf("then

caculate

out

that

the

d

is

%d\

",d);

printf("the

cipher

please

input

1\

");

printf("the

plain

please

input

2\

");

scanf("%c",s);

while((s-'0')!=1(s-'0')!=2)

//消除后面的getchar()

此处增加while循环注意括号内的字符

{scanf("%c",s);}

switch(s-'0')

{

case

1:printf("intput

the

m:");

scanf("%d",m);

c=candp(m,e,n);

printf("the

plain

is

%d\

",c);break;

case

2:printf("input

the

c:");

scanf("%d",c);

m=candp(c,d,n);

printf("the

cipher

is

%8d\

",m);

break;

}

}