RSA加密解密算法C语言代码

2024-05-01

RSA加密解密算法C语言代码(共5篇)

篇1:RSA加密解密算法C语言代码

C 语 言 课 程 设 计 实 验 报 告

实验名称:文件加密解密 院系:软件学院

学号:

年9月3日—9月17日 日期:2012

一:设计题目

1:设计图形用户界面。

2:对文件进行加密并对加密文件进行保存。3:对加密了的文件进行解密。

二:设计过程

设计过程中遇到的困难和解决方法: 1:不能很好地理解题意(通过老师的讲解)。

2:不知道如何设计加密解密程序(通过翻阅书籍和上网查找资料)过程:

首先通过学习老师提供的资料了解大致的设计过程并懂得运用一些以前没有学习过的c语言。先利用文本文件设计出加密解密的主要过程并能运行。知道如何运用fopen将原文件打开并用fread将原文件内容读出来,然后进行加密设计并将加密的数据用fwrite写进指定的文件中并保存。然后读出加密的文件并解密并保存。最后在写出的程序中加入图形用户界面,运用window,box,gotoxy等进行设计。

三:源代码

#include /* 标准输入、输出函数 */ #include /* 标准库函数 */ #include //*字符串处理函数 */ #include /* 字符操作函数 */ #include #include #define key_down 80 #define key_up 72 #define key_esc 1 #define key_enter 28 #define SIZE 1 void box(int startx,int starty,int high,int width);int get_key();char buf[20*20*4];/*/////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////加密解密 */ void fun(char *list,char *sd)/*加密过程*/ {

FILE *fp1,*fp2;char buf[1000];/*文件临时存放处*/ register int ch;fp1=fopen(“e:list.txt”,“r”);/*用可读方式打开文件*/ fp2=fopen(“e:sd.txt”,“w”);/*用可写方式创建一个文件*/ if(fp1==NULL){ printf(“cannot open filen”);exit(1);} if(fp2==NULL){ printf(“cannot build filen”);exit(1);} ch=fgetc(fp1);/*读出打开文件的光标处的一个字符*/ while(!feof(fp1))/*读出的字符不是最后的字符*/ { ch=ch<<1;/*加密方法*/ fputc(ch,fp2);/*加密的字符存放在指定的地方*/ ch=fgetc(fp1);

} rewind(fp2);/*将光标移动到第一个字符前面*/ fread(buf,sizeof(buf),1,fp2);/*从文件的当前位置开始中读取buf中存放的数据*/ printf(“%s”,buf);/*fclose(fp1);fclose(fp2);*/ }

void man(char *sd,char *ds)/*解密过程*/ { /*int n=0;*/ FILE *fp2,*fp3;register int fh;char buf1[1000];

fp2=fopen(“e:sd.txt”,“rb”);/*用可读方式打开文件*/ fp3=fopen(“e:ds.txt”,“wb”);/*用可写方式创建一文件*/ if(fp2==NULL){ printf(“cannot open filen”);exit(1);} if(fp3==NULL){ printf(“cannot build filen”);exit(1);} fh=fgetc(fp2);/*从光标处读出一个字符*/ while(!feof(fp2))/*当读出的字符到达最后一个则停止*/ { fh=fh>>1;/*解密方式*/

fputc(fh,fp3);/*解密的字符存放在指定的地方*/ fh=fgetc(fp2);} fread(buf1,sizeof(buf1),1,fp3);/*读出buf1中所存放的数据*/ printf(“%s”,buf1);}

void main(){ int k;char *f[]={“jiami”,“jiemi”};/**界面的形式/ int key,y;int j,q;char list[300];char sd[300];char ds[300];char ch,fh;char buf[1000];char buf1[1000];FILE *fp1;FILE *fp2;int l1,l2;window(1,1,80,25);/*left,top,right,bottom,相对于屏幕的字符坐标,屏幕原点在左上角*/ gettext(20,10,40,14,buf);/*保存矩形屏幕上的字符*/

textbackground(7);/*背景颜色*/ textcolor(0);/*字体颜色*/ clrscr();/*清除矩形屏幕上的所有字符*/ gotoxy(24,10);/*将当前字符屏幕的光标位置移动到x,y的坐标位子*/ printf(“%s”,f[0]);gotoxy(24,14);printf(“%s”,f[1]);gettext(10,8,60,16,buf);box(22,9,3,30);/*建立一个小窗口*/ key=0;while(1){ while(bioskey(1)==0);/*读取键盘值查询键盘是否按下*/ key=get_key();/*按下了什么键盘*/

if(key==key_up||key==key_down){ y=wherey();/*得到字符模式下窗口光标的x坐标数值*/ if(key==key_up)y=y==10? y+4:10;/*当y=10光标向下移动四个位置否则将光标移动到y=10处*/ if(key==key_down)y=y==14? y-4:14;/*当y=14光标向下移动四个位置否则将光标移动到y=14处*/

puttext(10,8,60,16,buf);/*将gettext函数保存的字符恢复到屏幕上 */

gotoxy(24,y);

if(y==10){ textbackground(7);textcolor(0);box(22,9,3,30);textbackground(3);textcolor(15);gotoxy(24,y);cprintf(“%s”,f[0]);} else { textbackground(7);textcolor(0);box(22,13,3,30);textbackground(3);textcolor(15);gotoxy(24,y);cprintf(“%s”,f[1]);} }

if(key==key_enter&&y==10)且光标在y=10处 /*当按下enter键且光标在y=10处进行下步*/ { clrscr();textbackground(3);textcolor(15);/*clrscr();*/ gotoxy(24,5);printf(“input the file name for jiamin”);/*用户给需要加密的文件加密 */ l1=strlen(“input the file name for jiami:”);/*待求长度的字符串指针*/ gotoxy(24+l1,5);scanf(“%s”,list);gotoxy(24,10);printf(“input file name for saven”);/*给加密后的文件命名,并保存*/ l2=strlen(“input file name for save:”);gotoxy(24+l2,10);scanf(“%s”,sd);fun(list,sd);fp1=fopen(“e:sd.txt”,“rb”);fread(buf1,sizeof(buf1),1,fp1);gotoxy(10,15);printf(“%sn”,buf1);getch();printf(“file haven jiami ,save now”);getche();break;} if(key==key_enter&&y==14){ clrscr();textbackground(3);textcolor(15);gotoxy(24,5);

printf(“input the file name for jiemi n”);/*用户给需要解密的文件解密 */ l1=strlen(“input the file name for jiemi: ”);gotoxy(24+l1,5);scanf(“%s”,sd);gotoxy(24,10);printf(“input file name for save:n”);/*对解密的文件系统又可以提供保存路径 */ l2=strlen(“input file name for save: ”);gotoxy(24+l2,10);scanf(“%s”,ds);man(sd,ds);fp2=fopen(“e:ds.txt”,“rb”);fread(buf1,sizeof(buf1),1,fp2);gotoxy(10,15);printf(“%sn”,buf1);getch();

printf(“file haven jiemi,save now”);getche();break;}

}

window(1,1,80,25);gettext(20,10,40,14,buf);

textbackground(7);textcolor(0);clrscr();gotoxy(24,10);printf(“%s”,f[0]);gotoxy(24,14);printf(“%s”,f[1]);gettext(10,8,60,16,buf);box(22,9,3,30);key=0;while(1){ while(bioskey(1)==0);key=get_key();

if(key==key_up||key==key_down){ y=wherey();if(key==key_up)y=y==10? y+4:10;if(key==key_down)y=y==14? y-4:14;puttext(10,8,60,16,buf);

gotoxy(24,y);

if(y==10)/*光标在10处的窗口*/ { textbackground(7);textcolor(0);box(22,9,3,30);textbackground(3);textcolor(15);gotoxy(24,y);cprintf(“%s”,f[0]);} else { textbackground(7);textcolor(0);box(22,13,3,30);textbackground(3);textcolor(15);gotoxy(24,y);cprintf(“%s”,f[1]);} }

if(key==key_enter&&y==10){ clrscr();textbackground(3);textcolor(15);/*clrscr();*/ gotoxy(24,5);printf(“input the file name for jiamin”);/*用户给需要加密的文件加密 */ l1=strlen(“input the file name for jiami:”);gotoxy(24+l1,5);scanf(“%s”,list);gotoxy(24,10);printf(“input file name for saven”);/*给加密后的文件命名,并保存*/ l2=strlen(“input file name for save:”);gotoxy(24+l2,10);scanf(“%s”,sd);fun(list,sd);fp1=fopen(“e:sd.txt”,“rb”);fread(buf1,sizeof(buf1),1,fp1);gotoxy(10,15);printf(“%sn”,buf1);getch();printf(“file haven jiami ,save now”);getche();} if(key==key_enter&&y==14){ clrscr();textbackground(3);textcolor(15);gotoxy(24,5);

printf(“input the file name for jiemi n”);/*用户给需要解密的文件解密 */ l1=strlen(“input the file name for jiemi: ”);gotoxy(24+l1,5);scanf(“%s”,sd);gotoxy(24,10);printf(“input file name for save:n”);/*对解密的文件系统又可以提供保存路径 */ l2=strlen(“input file name for save: ”);gotoxy(24+l2,10);scanf(“%s”,ds);man(sd,ds);fp2=fopen(“e:ds.txt”,“rb”);fread(buf1,sizeof(buf1),1,fp2);gotoxy(10,15);printf(“%sn”,buf1);getch();

printf(“file haven jiemi,save now”);getche();break;}

}

}

int get_key(){ union REGS rg;rg.h.ah=0;int86(0x16,&rg,&rg);return rg.h.ah;getchar();} void box(int startx,int starty,int high,int width)/*的建立*/ { int i;gotoxy(startx,starty);putch(0xda);for(i=startx+1;i

for(i=starty+1;i

屏幕 } gotoxy(startx,starty+high-1);putch(0xc0);gotoxy(startx+1,starty+high-1);for(i=startx+1;i

通过这次的作业我觉得最大的收获是不仅把平时学习到的知识理解的更加透彻,而且使知识更加系统化,同时还把有些平时不太注意的小问题发现了出来,这不但有利于我学习C语言,而且对于我学习任何一门课程都是很有益处的。总之,做这份作业对于我们学习C语言有很大的帮助。

在做课程设计时,由于运用了很多新知识,新的方法,还有题目更加复杂,应用性更强,在编写过程中遇到了很多困难,从而使自己能够学习到更多以前不懂,难懂的东西。

篇2:RSA加密解密算法C语言代码

1.扫描整个棋盘,分别扫描四个方向是否有5个连子,网上找了很多五子棋源码都是用此算法,这意味着每下一个棋子都要扫描一遍19×19的棋盘,复杂而且低效,代码略。

2.每下一字,从该子开始扫描其四个方向(例如:从该子的(x-4,y)坐标开始扫描横向)是否存在5个连子。此算法较为常用,而且不涉及更为复杂的数据结构。

另外,为解决扫描越界的问题,在声明棋盘棋子位置时,可声明一个(4+19+4)×(4+19+4)的棋盘,而让棋子偏移(4,4)个坐标。

算法2源代码如下:

static void IfWin(int x,int y,int color)

{

TCHAR win[20];

int a,b;

if(stone[x][y]==1)

wcscpy_s(win,_T(“黑棋胜利!”));

else

wcscpy_s(win,_T(“白棋胜利!”));

for(a=x-4;a<=x+4;a++)//判断横

if(stone[a][y]==color&&stone[a+1][y]==color&&stone[a+2][y]==color&&stone[a+3][y]==color&&stone[a+4][y]==color)

{MessageBoxW(Xqwl.hWnd,win,TEXT(“”),MB_OK);return;}

for(b=y-4;b<=y+4;b++)//判断竖

if(stone[x][b]==color&&stone[x][b+1]==color&&stone[x][b+2]==color&&stone[x][b+3]==color&&stone[x][b+4]==color)

{MessageBoxW(Xqwl.hWnd,win,TEXT(“”),MB_OK);return;}

for(a=x-4,b=y-4;a<=x+4;a++,b++)//判断右斜

if(stone[a][b]==color&&stone[a+1][b+1]==color&&stone[a+2][b+2]==color&&stone[a+3][b+3]==color&&stone[a+4][b+4]==color)

{MessageBoxW(Xqwl.hWnd,win,TEXT(“”),MB_OK);return;}

for(a=x-4,b=y+4;a<=x+4;a++,b--)//判断左斜

if(stone[a][b]==color&&stone[a+1][b-1]==color&&stone[a+2][b-2]==color&&stone[a+3][b-3]==color&&stone[a+4][b-4]==color)

{MessageBoxW(Xqwl.hWnd,win,TEXT(“”),MB_OK);return;}

}

篇3:浅论基于RSA的加密算法

1 RSA的研究意义

产生网络信息安全问题的根源可以从三个方面分析:自身缺陷, 开放性和人的因素。

首先, 网络自身的安全缺陷主要体现在协议和业务的不安全上, 而协议的不安全主要原因是:一方面互联网起源的出忠是进行学术交流和信息的沟通, 并非商业目的而导致缺乏安全的总体构想和设计。另一方面是协议本身的泄漏。然而业务上的不安全表现在错误信息或业务本身的不完善。

其次, 网络的开放性体现在业务是基于公开的协议等原因。

最后, 人的因素才是最主要的因素, 表现为三方面:人为的无意失误, 黑客攻击, 管理不善。

随着这些问题不断的出现, 网络信息安全的意义也就体现出来了:从大的方面说, 网络信息安全关系到国家主权的安全、社会的稳定、民族文化的继承和发扬等。从小的发面说, 网络信息安全关系到公私财产和个人隐私的安全。因此, 密码学在网络信息安全中发挥的重要性也体现了出来。密码技术是实现网络信息安全的核心技术, 是保护数据最重要的工具之一。最常用的技术有:数据加密标准DES、高级加密标准AES、RSA算法、椭圆曲线密码算法ECC、IDEA算法、PGP系统等。

2 RSA的国内外发展趋势

2012年2月27日到3月2日在美国旧金山举办的RSA信息安全大会上, 网络安全, 云安全仍然是时下最为热点的话题。而其中云安全仍是2010、2011和2012年度最耀眼的新星, 围绕着云安全与网络安全提出了许多问题以及解决的方法, 比如:云安全需要急迫解决的安全隐患;云计算是转变安全交付方式的机会;云安全将成为2010安全领域趋势;安全专家看RSA大会焦点:云安全准备出发;RSA大会三大主题:网络计犯罪, 云计算, IT消费;安全风向标:品味RSA 2012信息安全大会;RSA2012主题揭秘:伟大的密码比剑更有力;新的安全威胁面前需要新的安全架构。

另外, 前人针对RSA所做的一些研究, 比如:RSA算法的改进;基于AES与RSA混合加密策略的硬盘分区加密技术;一种基于RSA的加密算法;RSA密码算法的研究与改进实现;RSA加密算法的研究及应用等等。

3 RSA公钥密码

3.1 RSA算法简介

公开密码算法与其他密码学完全不同, 它是基于数学函数而不是基于替换或置换。与使用一个密钥的对称算法不同, 公开密钥算法是非对称的, 并且它使用的是两个密钥, 包括用于加密的公钥和用于解密的私钥。公开密钥算法有RSA、Elgamal等。

RSA公钥密码算法是由美国麻省理工学院 (MIT) 的Rivest, Shamir和Adleman在1978年提出来的, 并以他们的名字的有字母命名的。RSA是是第一个安全、实用的公钥密码算法, 已经成为公钥密码的国际标准, 是目前应用广泛的公钥密码体制。

RSA的基础是数论的Euler定理, 其安全性基于大整数因子分解问题的困难性, 公私钥是一对大素数的函数。并且该算法已经经受住了多年深入的密码分析, 虽然密码分析者既不能证明也不能否地RSA的安全性, 但这不恰恰说明该算法有其一定的可信度。

3.2 加解密算法描述

3.2.1 RSA利用了单向陷门函数

如图1所示。

3.2.2 RSA密钥对生成与加解密

3.2.2. 1 RSA密钥对的生成

首先, 选取两个互异的大素数, 令其为q和p (保密) , 并且为获得最大程度的安全性, 要让q与p相同长度。然后计算乘积 (公开) :

其次, 随机选取加密密钥e, 使其与j) (n互素, 即ne j1) ) (, gcd (=, 然后用扩展的Euclid算法计算密钥d:

注意, e和n可以公开, 两素数p与q不再需要, 可销毁, 但不能泄露。

3.2.2. 2 RSA加解密算法

1) 加密过程

首先, 将明文比特分组, 使其每个分组对应的十进制数小于n, 即分组长度小于log2n, 后对每个明文分组mi做加密运算, 其具体步骤如下:

获得其接收方公钥 (e, n) ;

把消息M分组为长度L (L

3) 利用加密算法计算出密文C=c1c2....ct (公式如下) ; (公式如下) ;

将密文C发送给对方。

2) 解密过程

(1) 接收方收到密文C并把密文按照长度为L分组得C=c1c2....ct ;

(2) 利用私钥d和解密算法计算mi (公式如下) ;

(3) 得到明文消息M=m 1m2....mt。

3.2.3 加解密流程

如图2示。

3.3 RSA设计流程

如图3所示。

4 RSA的安全性

从理论上讲RSA的安全性完全依赖于分解大数的难度。但从技术上讲这是不正确的, 这只是一种推测。从数学上从未证明需要分解n才能从c和e中计算出m。用这种完全不同的方法来对RSA进行密码分析这还只是一种假想。而我并不认为这种新方法能让密码分析者推算出d。

当然, 也可通过猜测 (p-1) (q-1) 的值来攻击RSA, 但这种攻击没有分解n容易。

对那些仍持极端怀疑态度的人来说, 有些RSA的变型已经被证明和大数分解同样困难, 可参见, 它给出了从RSA加密的密文中恢复某一位与恢复出整个文本同样困难这一结论。

可以看出分解n是最显而易见的攻击方法。敌方手中有公开密钥e和模数n, 所以要找到解密密钥d, 就必须分解n。目前, 129为十进制数字的模数是能分解的临界数。所以, n应该大于这个数。

对于密码分析者而言, 他有可能尝试每一种可能的d, 直到获得正确的一个。这种穷举攻击并没有试图分解n更有效。

随着时间的推移, 人们声称已经找到了破译RSA的简单方法, 但是直到现在这些宣称还是站不住脚的。举例来说, 1993年Willian Payne的论文草案中提到了一种基于费尔马小定理的方法。很不幸, 它的速度仍然比分解模数要慢很多。

5 结束语

随着现代信息快速发展和网络的普及, 人们可以不用出门而了解世界大事和一些重要的信息。人们在这快速发展的今天再也没有属于自己的秘密, 因此我们要保护好自己的个人信息或者公司信息等等, 使隐私不被泄漏。所以信息的加密对我们来说非常的重要, 文件的加密可以用到各个领域, 它将要影响我们未来的生活。

摘要:信息是一种资源, 也是一种财富。在现代社会中, 信息处理和通信技术日益发展, 保护信息的安全, 特别是保护重要信息的安全, 已成为国际社会普遍关注的重大问题。该文对密码学、信息安全做了些简要的介绍, 并且简明扼要的介绍了信息安全的发展趋势, 重点阐述了RSA加解密算法。

关键词:计算机,密码,RSA算法

参考文献

[1]梁玲, 孔令德.RSA加密算法及一般攻击方法[J].太原大学学报, 2006 (2) .

[2]郑勇明, 杨亚新, 彭凤梅.RSA加密算法实现过程中数据溢出问题的一种解决方法[J].电脑知识与技术, 2006 (32) .

[3]王刚.RSA加密算法初探[J].科技信息:学术研究, 2007 (17) .

[4]柴井坤.RSA加密算法的实现及其细节问题的研究[J].黑龙江科技信息, 2007 (12) .

[5]步山岳.RSA加密算法分析与实现[J].信息安全与通信保密, 2007 (10) .

篇4:基于RSA的无线加密算法研究

【关键词】无线网络 RSA 加密算法

近年来,计算机及通信科学发展突飞猛进,利用网络交流和处理信息变得越来越普遍。尤其 以无线局域网(WLAN)为代表的无线网络技术得到了高速发展和应用。无线网络作为有线网络的补充和延伸,在与日俱增的网络活动中,人们越来越关注其安全的问题。

一、无线网络的特点和存在的安全问题

(一)无线网络的特点

无线网络具有传统有线网络无法比拟的优点:灵活性,不受线缆的限制,可以随意增加和配置工作站;低成本,无线网络不需要大量的工程布线,同时节省了线路维护的费用;移动性,不受时间、空间的限制,随时随地可以上网;易安装,和有线相比,无线网络的组建、配置、维护都更容易。

(二)无线网络存在的安全问题。

1.影响WLAN的因素。IEEE 802.11的標准规定,WLAN的传输介质是无线电波。因此只要在WLAN信号覆盖范围内,入侵者可以在预期范围以外的地方访问WLAN,通过各种手段入侵WLAN,窃听网络中的数据并且对无线网络进行攻击。 其次,由于WLAN是遵循TCP/IP网络协议的一种计算机网络,所以WLAN内的计算机也会遭受来自计算机网络病毒的威胁,甚至会产生比有线网络更加严重的后果。

2.无线网络的安全问题主要表现。无线网络的安全问题主要在下面几个方面:(1)非法的AP,容易侵入。(2)未经授权使用服务和性能的限制。(3)地址欺骗和会话拦截。(4)流量分析与侦听。(5)高级入侵。基于上述特点,无线网络的通信保密能力需要一种强有效的安全机制来保障。数据加密是通过对信息进行重新编码,达到隐藏信息内容、使非法用户无法获得真实内容的一种技术,其核心就是加密算法。数据加密就是一种保障无线网络通信的有效方法。

二、无线网络的加密算法分析

数据加密的基本过程是,对明文的档或数据按某种算法进行处理,得到不可读的一段代码,通常称为“密文”,只有在输入相对应的密钥之后才能显示出本来内容,通常称“解密”。通过这样的方法来保护数据不被非法人窃取、阅读。无线网络的加密体制,按密钥方式划分,主要有对称式密钥加密和非对称式密钥加密两种。

(一)对称式密钥加密

对称式密钥又称常规密钥,是指加密的收发双方使用相同密钥的密码,且密钥是保密的,不公开,通常称之为“SessionKey”。其加密体制的特点是,收发双方具有相同的加密与解密的密钥,发送方用密钥对数据(明文)进行加密,接收方同一个密钥对收到的数据进行解密。对称密钥加密实现容易、速度快,但是为了保证密钥的安全,必须通过安全通道来传送密钥。

(二)非对称密钥加密

非对称加密算法又名“公开密钥加密算法”,需要两个密钥:公开密钥和私有密钥。如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密,所以这种算法叫作非对称加密算法。非对称密钥加密体制包括RSA、ELGamal、椭圆曲线加密等算法。其中RSA算法为当今世界上应用最为广泛的非对称加密算法

三、RSA算法

RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击。RSA公钥加密算法是在1977年提出的目前已被ISO推荐为公钥数据加密标准。

(一)RSA算法的原理

1.加密消息。假设甲想给乙送一个消息m,甲知道乙产生的N和e。那么甲使用事先与乙约定好的格式将m转换为一个小于N的整数n,比如甲首先将每一个字转换为这个字的Unicode码,然后将这些数字连在一起组成一个数字。假如甲的信息非常长的话,也可以将这个信息分为几段,然后将每一段转换为n。用下面这个公式他可以将n加密为c:。计算c并不复杂。甲算出c后就可以将它传递给乙。

2.解密消息。乙得到甲的消息c后就可以利用她的密钥d来译码。她可以用以下这个公式来将c转换为n: 得到n后,乙可以将原来的信息m重新复原。

3.签名消息。签名消息检测出数据在传播路径上有没有被篡改过,RSA也可以实现消息署名。假如甲想给乙传递一个署名的消息,那么甲为自己的消息计算一个散列值(Message digest),然后用甲自己的密钥(private key)加密这个散列值并将这个“署名”加在消息的后面。这个消息只有用甲的公钥才能被解密。乙在获得消息后首先用甲的公钥解密这个散列值,然后将这个数据与乙为这个消息计算的散列值相比较,如果两者相符,乙就知道发信人持有甲的密钥,以及这个消息在传播路径上没有被篡改过。

(二)RSA算法的攻击方法和应对

RSA算法的攻击方法主要有模数攻击、时间攻击和因子分解。解决模数攻击的办法是不共享模数。时间攻击。假如甲对乙的硬件有充分的了解,而且知道它对一些特定的消息加密时所需要的时间的话,那么甲可以很快地推导出d。因为在进行加密时所进行的模指数运算每个位元进行的,所以如果能得到多组信息和信息的加密时间,就会有机会可以反推出私钥的内容。因子分解。因子分解在RSA安全性的时候已经论述,因子分解可以成功破解RSA,也是最流行的一种攻击方法。应对方法是在一定条件下尽可能选取大数。RSA算法易于理解和操作,是第一个能同时用于加密和数字签名的算法。RSA从诞生到现在历经各种攻击的考验,是被研究的最广泛的公钥算法,也是目前最优秀的公钥算法之一。

四、总结

将基于RSA的算法用于WLAN及更多的平台,确保具有开放性与共享性的无线网络不受到外界的攻击与破坏。随着计算机网络的不断发展,更多的优秀的加密算法也会涌现出来。

参考文献:

[1]杨峰,张浩军.无线局域网安全协议的研究和实现[J].计算机应用.北京邮电大学出版社

[2]贺雪晨.信息对抗.与网络安全清华大学出版社(第2版),2010,5.

篇5:RSA数据加密算法分析与改进

关键词:RSA算法,CUDA,算法改进,模幂运算

随着工业4.0的迈入,中国制造2025[1]与之不谋而合,应运而生。人们正在全面进入“互联网+”时代,中国制造2025“互联网+工业”是“互联网+”的重要组成部分之一。现阶段通过大规模定制和网络协同配置的各方面资源、数据越来越多,制造业企业的实时数据安全处理、传输和储存的要求也会越来越高,保障数据的实时安全传输是这个时代迫切需要的。可以说加密技术无疑是保障数据安全传输的重要措施之一。RSA公钥密码是1978年Ron Rivest,Adi Shamirh和Len Adleman提出来的,源于三个作者的首字母,该算法是公钥加密的行业标准[2]。RSA加密算法理论基础是两个大素数相乘,然而计算机技术的进步使得比较短的RSA密钥可以被攻破。所以,RSA的密钥在不断的加长。我国山东大学的研究人员季凯和他的破解团队成员刘强等人宣布找到了这样的一种快速素因子分解算法,并且公布了算法,但是并没有得到最终的证实。现在国内外在RSA算法的研究上主要集中在算法的优化和程序的优化上,在算法优化方面主要集中在模幂和模乘的快速算法上,最传统的方法。就是把乘方后求模的运算改为一边乘方一边求模的运算,这种方法最大化避免大数的乘方运算。在一定程度上提高RSA的效率[3][4]。

现阶段应用最为广泛的加密算法有MD5算法、DES算法及RSA算法[6]-[8]。MD5是将任意长度的“字节串”变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法。DES算法把64位的明文输入块变为64位的密文输出块。而RSA算法是第一个既能用于数据加密也能用于数字签名的算法,RSA的安全性一直未能得到理论上的证明,但是它经历了各种攻击,至今未被完全攻破。较之MD5、DES算法,RSA算法的安全性更高,它的安全性基于数论中的大素数分解,该体制是采用足够大的整数作模数。但是大整数分解问题运用了大量的模乘和幂运算时间都比较长,所以RSA密码体制有显著的缺点就是运算效率低下,运算时间过长等缺点。那么提高RSA的算法效率是研究RSA密码体制的重点。

在1976年,W.Diffie和M.E.Hellmam发表了具有划时代意义的“密码学的新方向”一文,提出了公钥密码体制思想,为近代密码学的发展指明了方向。它的出现是密码学研究领域中的一项重大突破,也是现代密码学诞生的标志之一[9]。本文针对物联制造数据的安全快速传输问题,提出了对RSA算法的改进。首先对非对称加密算法RSA进行了原理分析,进而提出了算法的改进和实现。

1公开RSA加密算法

RAS算法是现今普遍使用的一种公开秘钥算法,其本质上是一种基于因数分解的非对称加密算法,其核心原理就是利用两个素数[10]。包含:一个是公钥以及一个是私钥,公钥是唯一解密通过私钥加密的密文,同时,私钥也是唯一解密通过公钥加密的密文,那么这就解决了数据的在传输过程中由于密钥的丢失,导致安全性受到威胁的问题。其加密算法流程如下:

从上述流程中不难看出中不难看出传统的RSA算法采用的公钥是n=p*q;并通过指数e二进制化后迭代,然后求模运算。

2 RAS算法的优化

2.1 RSA算法优化原则

由于传统的RSA的安全性依靠于算法过程中的大素数的因子分解的难度,也就造成了该算法采用的幂指剩余计算太耗时(在加密解密过程要计算大整数模幂乘)[11]。优化原则:(1)提高安全性,最大素数p和q至少应该是在100位以上的十进制数;(2)e的适当减小会加快解密速度,但是太小会威胁安全性。

2.2优化RSA算法

2.2.1多因子优化

利用多个素数因子对算法进行加速,此处选取三个素数因子,可以降低素数选取需要的时间,通过中国剩余定理[12]得出适当的减少素数的位数,可以降低计算量。那么基本算法描述如下:

首先选择三个保密大素数:p、q及r。计算n=p*q*r,φ(n)=(p-1)(q-1)(r-1),φ(n)为欧拉函数,选择整数e,有gcd(φ(n),e)=1,计算d*e=1 modφ(n),以{e,n}为公开钥,{p,q,r}为密钥,与传统RSA相比较,若明文m大于n,则需将m分块使得每一块数据都小于n-1,进而进行c=m^emod n。

2.2.2幂指运算优化

传统的RAS算法指数e的比特序列长度很大,需要在计算过程中多次迭代,因此找出最短的指数序列减少迭代次数是加速该算法的手段之一。那么,采用将指数e进行2^k进制化的方式达到加速算法的目的。

对于指数e可以用(2)等式表示出来:

那么在余数运算中,形如g^emod(m)可以如下表示:

(6)式中n为e被2k进制后的序列,其中)m表示取模运算。计算geimod(m)时,需从ge0mod(m)到ge2k-1mod(m)的所有值,伪代码算法描述如下:

上述共完成了2^k次迭代运算,接下来要进行幂剩余和乘通余运算,此步需完成n次迭代次数,其伪代码如下:1.C=1,i=n-1,

改进后算法流程图如下:

3改进RSA算法实现

3.1改进RSA模幂单元分析

首先输入明文M,然后通过C=m^e modn计算密文C,计算密文向量X=(x1,1….,x1,k,x2,1,…,x2,k,x3,1,…,x3,k),其中Xi,j=Cei,jmodn(0<i<4,0<j<k+1)。

进而通过中国剩余定理解密,计算

其中d1,j值已知,d2,j,d3,j在密码生成算法中可以得出。在计算d=e-1modφ(N)的同时计算Wp=(qr)p-1mod n,Wq=(pr)q-1mod n,Wr=(pq)r-1mod n,可以计算出明文M=(MPWp+MqWq+MrWr)mod n。故可以将大数模幂运算分解成多个小的模幂运算,然后基于GPU模式加速算法。其流程如下:

3.2 基于CUDA的算法实现

采用CUDA[13][14](Compute Unified Device Architecture)对改进RSA算法的实现,CUDA是一种由NVIDIA推出的通用并行计算架构,这一编程模型基于GPU,GPU相对于CPU而言有计算密度高、低耗能的优势,并且适用于大规模数据并行的通用计算。GPU提供了健全的储存器系统,合理的分配决定了算法和应用性能,所以将大素数p、q、r及密文C作为整个运算中的输入参数,这些参数是整个运算过程中的重要参数,在运算中需要将其置于全局储存器中,并将模幂单元与其集成。以下是基于CUDA框架的RSA改进算法的线程组织结构图:

3.3 具体实现方法

基于CUDA模式,采用NVIDIA Ge Force GTX960测试改进算法性能,并与传统BR算法和2K进制算法进行比对,GTX960包含1024个流处理器单元,核心频率是1051MHz,显存频率是7012MHz,支持2048M GDDR5显存,其显存宽带为232GB/s。在改进的RSA算法中,将关键操作步骤大整数模幂运算转移到GPU上实现计算,首先求出各个线程块内数值,然后保存在数组W[y-1][0]中,我们定义W[y-1][z],(1≤z≤2)为模幂运算单元乘积,那么有Mp=W[0][0]*N[1][0]*…N[y-1][0],Mq=W[0][1]*N[1][1]*…N[y-1][1],Mr=W[0][2]*W[1][2]…W[y-1][2]。各个独立的模乘单元运算可以参考文献[15]基于montgomery算法实现。

具体内核定义的代码如下:

4数据的验证分析

基于物联制造实验室,运用由NVIDIA公司开发的Ge Force GTX960对采集的数据进行验证,首先对改进算法的加密过程进行了数据分析如下:

基于CUDA对RSA算法加密进行数据验证。最下方的曲线为所求曲线,从图中可以得出最下方的在加密过程中完全优于另外曲线。所以在采用三因子素数及幂指优化算法可以在很大程度上提高加密效率。

下面将基于CUDA模式下对大整数模幂的运算性能对三种算法分别进行对1024和2048位从运算次数进行解密分析:

改进RSA算法的解密过程基于CUDA完。在CUDA模式下,令yy=={{22,,112288,,551122,,11002244,,22004488……}}为运算次数。yy值的增加会使并行的线程块增加,运算的速度会越来越快。这里达到2200448位运算依然流畅进行,但是随着位数的时候会由于GGPPUU本身的最大计算能力而下降。因为线程块越多意味着对储存器的访问次数越多,从而降低计算能力。但是从2张比较图可以看出改进后的RRSSAA算法(最下方曲线)的解密效率同样很高。

5结束语

上一篇:监视和测量设备安全管理制度下一篇:ipv9研究的现状与分析