凯撒密码的原理以及实现过程:
1.算法介绍
凯撒密码的核心思想就是移位。将明文的每一个字符 在 密码系统所支持字符序列中向右平移N,映射得到新的字符从而实现加密,而解密则相反向左平移N。加密的Key即为N。
2.实验测试
加密
解密
3.源代码
#include #include int main (){char small_letter[26]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};char big_letter[26]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};char text[1000],result[1000];int c,count=0,k,p;char function;printf("Insert Text:");c=getchar();while(1) //读取字符串{if(c == '\n') break;text[count]=c;printf("%c",text[count]);count++;c=getchar();}printf("\n");printf("Encrypt or Decrypt" />='A'&&text[i]='a'&&text[i]<='z'){result[i]=small_letter[((text[i]-'a')+k)%26];}else result[i]=text[i];printf("%c",result[i]);}}else {printf("Insert Key :" );scanf("%d",&k);for(int i=0;i='A'&&text[i]<='Z'){p=((text[i]-'A')-k);while(p='a'&&text[i]<='z'){p=((text[i]-'a')-k);while(p<0)p+=26;result[i]=small_letter[p];}else result[i]=text[i];printf("%c",result[i]);}printf("\n");}return 0;}
RSA算法的原理以及实现过程:
1.算法介绍
在如今的万维网环境中,如果A要向B发送数据,需要先加密这个数据,因为在一些不安全的网络环境中上网,是很容易被拦截到发送的数据的,如果使用对称加密,密钥传递在网络中被拦截了也一样可以解密,也不可能用线下告知消息接收方密钥的这种方式来进行通信。
在这种情况下第一代非对称加密算法RSA出现了,RSA是1977年由在麻省理工学院工作的Ron Rivest、Adi Shamir和Leonard Adleman一起提出的,RSA就是他们三人姓氏开头字母拼在一起组成的。在A想要发送数据给B时,A先会找B让B产生一对公私钥对e和d(e为公钥d为私钥)和一个大数n,然后B会把e和n发送给A,A收到后会用e和n加密数据之后再发送给B,B收到数据后就能用私钥d来解密出A发送的数据。公钥具有加密之后就无法再用公钥解密的特性,即使获取到了公钥和加密后的数据,也无法解密出原始数据
2.实验测试
加密与解密
3.源代码
#include#include#include const int max=2e4;int size;int miwen[max];//为加密后的数字密文char mingwen[max];//判断两个数是否互为素数eg:p和q e和 t bool gcd(int p,int q){int m,n;if(q<p){m=p;p=q;q=m;//将p换成p和q之间那个小的数 m=q%p;n=q/p;//辗转相除法求两个数的最大公因数 }while(m!=0){q=p; p=m;//将p换成p和q之间那个小的数m=q%p;n=q/p;} if(m==0&&n==q){printf("符合条件!\n");return true;}else{printf("不符合条件!请重新输入:\n");return false;}} //判断输入的p和q是不是素数 bool sushu(int s){for(int i=2;i<s;i++){if(s%i==0) return false;}return true;}//求私钥dint siyao(int e,int t)//t:欧拉函数 {int d;for(d=0;d100) {if(gcd(e,t)==1)return e;}//if(e<=2)//e=3;}}void jiami(int e,int n) {//先将符号明文转换成字母所对应的ascii码。 char mingwen[100];//符号明文 printf("请输入明文:\n");scanf("%s",mingwen);size=strlen(mingwen);int ming[strlen(mingwen)]; //定义符号明文 for(int i=0;i<strlen(mingwen);i++){ ming[i]=mingwen[i];//将字母转换成对应的ascii码。 //printf("%d",mingwen[i]);//将字母转换成对应的ascii码。可以不输出 } int flag=1;//miwen为加密后的数字密文 for(int i=0;i<strlen(mingwen);i++){for(int j=0;j<e;j++){flag=flag*ming[i]%n; }miwen[i]=flag; flag=1;} printf("加密密文为:\n");for(int i=0;i<strlen(mingwen);i++) printf("%d",miwen[i]); }void jiemi(int d,int n){int de_mingwen[size],flag=1;//解密后得到的数字明文(即ascii码) char de_ming[size];//解密后得到的字符串明文 for(int i=0;i<size;i++){ for(int j=0;j<d;j++) { flag=flag*miwen[i]%n; } de_mingwen[i]=flag;flag=1;} printf("解密后的明文为:\n");for(int i=0;i<size;i++){de_ming[i]=de_mingwen[i];printf("%c",de_ming[i]);}}int main(){int p,q,e,d,n,t,tep;while(1){printf("请输入p:",p);scanf("%d",&p);tep=sushu(p);if(tep==0){printf("p不是素数,请重新输入p!\n");continue;} printf("请输入q:",q);scanf("%d",&q);tep=sushu(q);if(tep==0){printf("q不是素数,请重新输入q!\n");printf("请输入q:",q);scanf("%d",&q);tep=sushu(q);}int n=p*q;int t=(p-1)*(q-1);tep=gcd(p,q);if(tep==0) continue;printf("t=(q-1)*(p-1)=%d\n",t);e=getrand(p,q);printf("公钥(e=%d n=%d)\n",e,n);tep=(e,t);d=siyao(e,t);printf("私钥d=%d",d);int a=0;while(a!=3){printf("\n-------------------------\n");printf("1、加密\n");printf("2、解密\n");printf("3、退出");printf("\n-------------------------\n");scanf("%d",&a);getchar();if(a==1){jiami(e,n);}else if(a==2){printf("请输入密钥:");scanf("%d",&d);jiemi(d,n);}elsereturn 0;}}return 0;}