《RSA加密算法(C语言实现).pdf》由会员分享,可在线阅读,更多相关《RSA加密算法(C语言实现).pdf(4页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、RSA加密算法(C语实现)这次轮到RSA加密算法了。RSA加密过程相对DES和MD5要简单很多,但作为现在还在使的加密算法之,它还是有需要认真思索的地哒先是密钥对的成:(1)选取两个素数p和q(前两个数的长度都接近512bit是安全的)(2)计算乘积n=p*q,(n)=(p-1)(q-1),其中(n)为n的欧拉函数(因为两素数乘积的欧拉函数等于两数分别减后的乘积)(3)随机选取整数e(1e(n))作为公钥d,要求满e与(n)的最公约数为1,即两者互素(4)Euclid扩展算法计算私钥d,已满d * e 1 (mod (n),即d e(-1) (mod (n)。则e与n是公钥,d是私钥注意:e与
2、n应公开,两个素数p和q不再需要,可销毁,但绝不可泄露。加密过程:将接收到的明转换成特定的编码式。如p=43,q=59,e=13,明为cybergreatwall,按照英字母表的顺序a=00,b=01,. ,z=25进编码后为022401041706001922001111。然后将转码后的字符串分块,分组要求:每个分组对应的进制数于0。这个要求是什么意思呢?我个的理解通过举例向家说明:上字符串分组如下0224 0104 1706 0019 2200 1111。每分组的数都于n(2537),2537能接受的最的数为2525(也就是zz的情况),所以是4位1组,即两字符组。这样来,m1=0224,
3、m2=0104, ,m6=1111现在可以加密了加密算法就是这个式-ci mie (mod n),如第分组 022413 mod 2537 1692=c1 。这有个隐藏的算法是需要了解的:在RSA算法过程中容易出现天数字(像上的022413),这些天数字会为我们编程的过程造成定的烦,更可恶的是会影响速度!为了避免这种情况,快速取模指数算法可以很有效地算出cme mod n的准确结果且避免过程中出现天数字 下伪代码为家介绍下这种神奇的算法(个感觉伪代码的 - 就是平时的 = ): t-0;c-1for i-k downto 0do t-2*t c-(c*c)mod n if bi=1 then
4、t-t+1 c-(c*m)mod nreturn c(p.s:e的进制表为bk bk-1 . b0,如e=13=(1101),所以k为3) 所以,快速取模指数算法计算上例的c1过程就该是这样哒: i 3 2 1 0 bi 1 1 0 1 t 1 3 6 13 ci (1*224)mod2537 (224*224*224)mod2537 (514*514)mod2537 (348*348*224)mod2537 =224 =514 =348 =1692到这RSA加密的算法就讲完了,下附上代码#include#include /* 函数申明 */int long_n(int n);int shur
5、u(char *arr, int k, char *wei, int is_first);void jiami(char *arr, int k, int e, int n); /* 输函数,记录从键盘输的明*/int shuru(char *arr, int k, char *wei, int is_first) int i; char ch; /*判断是否为第分组的输,如果是则获取输的字符,否则就将上分组最后获取的字符作为这分组的第个字符*/ if (is_first = 1) ch = getchar(); else ch = *wei; for (i = 0; (i k) & (ch
6、!= n);i+) /获取字符直到获取到回车符为 arri = ch; ch = getchar(); *wei = ch; /最后获取到的字符准备作为下分组的第个字符 for (i = i; i k; i+) arri = a; /输不够组个数的整数倍则补a(即为补零) if (ch = n) /接收到回车符返回0,否则为1 return 0; else return 1; /*加密函数*/void jiami(char *arr, int k, int e, int n) int m = 0,c=1, i, j,t=0, shu,temp,num=0; int *array; /*Mi赋值
7、过程*/ for (i = 0; i k; i+) temp = 1; for (j = 0; j (k-i-1)*2; j+) temp = temp * 10; shu = (int)arri - 97; m = m + temp * shu; temp = e; /*获取e的进制表达形式的位数*/ do temp = temp / 2; num+; while (temp != 0); array = (int *)malloc(sizeof(int)*k); /申请动态数组 temp = e; /*动态数组存储e的进制表达形式*/ for (i = 0; i = 0; i-) t =
8、t * 2; temp = c*c; if (temp n) for (j = 0; temp - n*j = 0; j+); for (j = 0; temp - n*j = 0; j+); j-; c = temp - n*j; else c = temp; if (arrayi = 1) t = t + 1; temp = c*m; if (temp n) for (j = 0; temp - n*j = 0; j+); j-; c = temp - n*j; else c = temp; e = e / 2; temp = c; i = 0; /*c的位数于分组长度则在前补零*/ do
9、 temp = temp / 10; i+; while (temp != 0); for (i; i num; i+) printf(0); printf(%d, c); /*获取分组的长度*/int long_n(int n) int temp,i,j,k,shi,comp=0; temp = n; /*获取n的位数*/ for (i = 1; temp / 10 != 0; i+) temp = temp / 10; temp = i; /*若n的位数为基数*/ if (i % 2 != 0) i = i - 1; return i; /*若位数为偶数*/ else for (j = 0
10、; j i/2; j+) shi = 1; for (k = 0; k temp - 2; k+) shi = shi * 10; comp = comp + shi * 25; temp = temp - 2; if (comp = n) return i; else i = i - 2; return i; /*主函数*/int main() int p, q, e, d, n, fai_n, k, i,is_first=1; char ch,*arr,wei=a; printf(请输p、q、e值,空格间隔开n); scanf_s(%d%d%d, &p, &q, &e); /从键盘获取p、
11、q、e值 n = p*q; fai_n = (p-1)*(q-1); /(n) for (k = 0; (k*n + 1) % e != 0; k+); if (k*n + 1) % e = 0) d = (k*n + 1) / e; /d * e 1 (mod (n) k = long_n(n); k = k / 2; /分组的长度 ch = getchar(); /缓冲回车符 arr = (char *)malloc(sizeof(char)*k); /申请动态数组 printf(请输明n); while (1) i=shuru(arr,k,&wei,is_first); /调输字符的函数,接收到回车符返回0,否则为1 is_first = 0; /第分组录结束设为0 jiami(arr,k,e,n); /调加密函数 if (i = 0) /接收到返回值为0跳出循环 break; printf(n); return 0;运结果: