C语言学习笔记(九)---简单的RSA加密算法练习
2017-11-15 19:24
316 查看
写完了带有cbc的背包加密,按照课程,接下来应该学RSA,限于码力不足,仍然选用一个字符对应一个数字的加密方法,再加上cbc扩散提高加密强度。
源代码贴在下面,exe下载密码:2zpp。
1.算法设计过程
首先考虑到明文多由各种字符组成,如“Just for fun.“。然后思考后决定加密后的密文为多个数字,每个数字对应一个字符。与字符对应的数字首先想到ASCII码,于是考虑对ASCII码进行RSA加密。(同样是限于码力不足,公开钥和秘密钥都是提前在代码里定义好的。)
2.公开钥
e、n:{11,899}
3.秘密钥
d、p、q:{611,29,31}
4.明文
Just for fun.
(初始向量为‘P’)
5.密文
769 171 92 665 697 823 351 172 605 313 730 422 844
6.加解密运算过程
1.加密(以加密’I’为例)
读取字符’I’——>得到其ASCII码值:73——>与前一位密文或初始向量密文异或:254——>使用公开钥进行加密计算得到密文:212
2.解密(以解密212为例)
读取密文数字212——>使用密钥对其求解:254——>得到其ASCII码值:73——>得到明文:I
学加密算法真的有意思(就是头有点凉)。
源代码贴在下面,exe下载密码:2zpp。
一、算法设计
RSA算法–百度百科1.算法设计过程
首先考虑到明文多由各种字符组成,如“Just for fun.“。然后思考后决定加密后的密文为多个数字,每个数字对应一个字符。与字符对应的数字首先想到ASCII码,于是考虑对ASCII码进行RSA加密。(同样是限于码力不足,公开钥和秘密钥都是提前在代码里定义好的。)
2.公开钥
e、n:{11,899}
3.秘密钥
d、p、q:{611,29,31}
4.明文
Just for fun.
(初始向量为‘P’)
5.密文
769 171 92 665 697 823 351 172 605 313 730 422 844
6.加解密运算过程
1.加密(以加密’I’为例)
读取字符’I’——>得到其ASCII码值:73——>与前一位密文或初始向量密文异或:254——>使用公开钥进行加密计算得到密文:212
2.解密(以解密212为例)
读取密文数字212——>使用密钥对其求解:254——>得到其ASCII码值:73——>得到明文:I
二、简单的C语言实现
// // RSA // // Created by passer_by_A on 2017/11/14. // #include <stdio.h> int p=29,q=31; int n=29*31;//899 int N=28*30;//840 int e=11,d=611; char pt[100]={0}; int ct[100]={0}; int length;//the length int FastMod(int a,int b,int c)//快速幂取模 { int ans=1; a=a%c; 4000 while(b>0) { if(b%2==1) ans=(ans*a)%c; b/=2; a=(a*a)%c; } return ans; } char translateC(int nu,int i)//将密文一个个解密 { nu=FastMod(nu,e,n); nu=nu^ct[i-1]; return (char)nu; } int translateP(char ch,int i)//将明文一个个加密 { int k=(int)ch; k=k^ct[i-1]; k=FastMod(k, d, n); return k; } void encode()//加密 { printf("This program will encrypt your plaintext into numbers.\n"); printf("Please input your plaintext:\n"); for(int i=1;;i++) { scanf("%c",&pt[i]); if(pt[i]=='\n') break; length=i; } for(int i=1;i<=length;i++) { ct[i]=translateP(pt[i],i); } printf("The ciphertext is:\n"); for(int i=1;i<=length;i++) { printf("%d ",ct[i]); } putchar('\n'); } void decode()//解密 { printf("This program will decrypt your plaintext into text.\n"); printf("Please input your ciphertext and end with '#':\n"); for(int i=1;;i++) { scanf("%d",&ct[i]); char chh=getchar(); length=i; if(chh=='#') break; } for(int i=1;i<=length;i++) { pt[i]=translateC(ct[i],i); } printf("The plaintext is:\n"); for(int i=1;i<=length;i++) { printf("%c",pt[i]); } putchar('\n'); } int main() { int num; pt[0]='P'; ct[0]=183; printf("Input 1 for encrypt, 0 for decrypt.\n"); scanf("%d",&num); getchar(); if(num) encode(); else decode(); return 0; }
学加密算法真的有意思(就是头有点凉)。
相关文章推荐
- C语言学习笔记(八)---简单的背包加密算法练习
- C语言学习笔记(二)--从最简单的数据类型开始
- 网易云课堂程序设计入门--C语言第一周 简单的计算程序学习笔记
- 数据结构 学习笔记之:静态链表--史上最简单的C语言实现——只为掌握概念——不清楚静态链表的鸟鸟们有福了!
- 数据结构与算法(c语言) 学习笔记——第三章练习
- 黑马程序员--学习笔记--一个WinForm简单加法练习程序
- 【Matlab学习笔记】(四)认识matlab的文件类型和简单练习
- scala学习笔记☞二:简单语法练习
- C语言、Java学习笔记(三)---几种简单的排序算法
- C语言学习笔记(二)—— 创建一个简单的C语言程序并详细解析
- C语言学习笔记(七)---一些刷题记录
- WebView的简单使用——学习笔记
- IOS学习笔记之二:Object C的简单应用(对比Java)
- jqgrid 简单学习笔记
- Strus2 学习笔记 (一)struts的简单配置及实例
- cocos2d-x 菜鸟学习笔记十五(简单的碰撞检测 实践篇 上)
- Libevent 学习笔记 (1)——Libevent 2.0安装与简单示例
- PHP学习笔记——php实例简单的计算器(一)
- Spring MVC 学习笔记9 —— 实现简单的用户管理(4)用户登录显示局部异常信息
- ReactNative学习笔记--下拉选择菜单的简单封装