VC++带加密的密码类编程要点、用VC++实现DES加密算法的简略代码_第1页
VC++带加密的密码类编程要点、用VC++实现DES加密算法的简略代码_第2页
VC++带加密的密码类编程要点、用VC++实现DES加密算法的简略代码_第3页
VC++带加密的密码类编程要点、用VC++实现DES加密算法的简略代码_第4页
VC++带加密的密码类编程要点、用VC++实现DES加密算法的简略代码_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、带加密的密码类编程要点一、密码类的结构PassWordstruct user char usernamell; char passwordll; up10;void ReadFile() void WriteFile() void InputUserName(int &i) void hide(char mm) void InputPassWord(int i) void AppendUser() void DeIUser() void ModifyPassword() void PrintUser()void ModifyUser(char cz)二、密码类的定义#include#inclu

2、de#include#include using namespace std;class Passwordprivate: struct user (char username11; char password11;up10;public: Password()int i;for(i=0;ill;i+)strcpy(upi .username,n n);strcpy(upi .password,n n); void void void void void void voidReadFile()WriteFile()/读用户文件/写用户文件GetUserName(char unameInputU

3、serName(int hide(char mm) InputPassWord(int AppendUser()&i)i),int i) /获取用户名/输入用户名/隐藏输入密码/输入密码/增加用户1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2,6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12,13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7,1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2,7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8,2,1,14,7,4,1

4、0,8,13,15,12,9,0,3,5,6,11;int m64;intIP164=40,8,48,16,56,24,64,32,39,7,47,15,55,23,63,31,38,6,46,14,54,22,62,30,37,5,45,13,53,21,61,29,36,4,44,12,52,20,60,28,35,3,43,11,51,19,59,27,34,2,42,10,50,18,58,26, 33,1,41,9,49,17,57,25;intIP64=58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,62,54,46,38,30,22,1

5、4,6,64,56,48,40,32,24,16,8,57,49,41,33,25,17,9,1,59,51,43,35,27,19,11,3,61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7;void minwei()产生明文二进制流(char minwen=,computerH;for (int i=0;i=0;j-) m8*i+j=data%2;data=data/2;)void code()加密函数(int L32,R32;coutvv”明文是;for(int i=0;iv8;i+)输出明文字符 int h=0;for(int j=0;j8;j

6、+)h=h+mi*8+j*pow(2,7-j);coutchar(h); h=0;)coutendl;for (i=0;iv64;i+)输出明文二进制流coutmi;coutendl;int b64;for(i=0;i64;i+)bi=mi;for(i=0;i64;i+)进行 IP 置换mi=bIPi-1;for(i=0;i32;i+)进行左右分组Li=mi;Ri=mi+32;for(int kk=1 ;kk=16;kk+)循环加密开始了int EL48;/扩展后的 48 的 Ri-1for(i=0;i48;i+)/根据 E 函数将 Ri-1 扩展为 48 位的 E(Ri-1)ELi=REi-

7、1;int EE48;for(i=0;i=0;j-) R14*i+j=data%2;data=data/2;)int BB32;for(i=0;i32;i+) P 变换BBi=R1Pi-1;for(i=0;i32;i+)/f变换R1i=(BBi+Li)%2;for (i=0;i32;i+)Li=Ri;Ri=R1i;)for (i=0;iv32;i+)进行合并得到变换后的密文mi=Ri;mi+32=Li;)for (i=0;i64;i+)bi=mi;for (i=0;i64;i+)/进行IP逆变换,得到最终密文mi=bIP1i-1;coutvv”现在是密文的输出了“vvendl;for (i=0

8、;i64;i+)coutmi;coutendl;)void uncode()解密的函数开始了int L32,R32J;coutvv”输出密文是 vvendl;for(int i=0;iv8;i+)输出密文字符 int h=0;for(int j=0;jv8;j+)h=h+mi*8+j*pow(2,7-j); 求出密文的 ASCII 码coutchar(h);h=0;)coutendl;coutvv”二进制密文是“ vvendl;for (i=0;i64;i+)输出密文二进制流coutmi;coutendl;int b64;for (i=0;i64;i+)bi=mi;for (i=0;i64;i

9、+)对密文进行IP置换mi=bIPi-1;for (i=0;i=0;k-)int EL48; 扩展后的 48 的 Ri-1for(i=0;i48;i+)/根据 E 函数将 Ri-1 扩展为 48 位的 E(Ri-1)ELi=REi-1;int EE48;for(i=0;i48;i+) 和 Ki 进行模二运算EEi=(ELi+mkki)%2;int temP=0;int R132;for (int i=0;i=0;j-)将取出的数转化为二进制流 R14*i+j=data%2; data=data/2;)int BB32;for(i=0;i32;i+)/P 变换BBi=R1Pi-1;for(i=0

10、;i32;i+)for(i=0;i32;i+)/f变换既P变换后的数据与LO进行模二运算R1i=(BBi+Li)%2;for (i=0;i32;i+) 回赋值 Li=Ri; Ri=R1D;)for (i=0;i32;i+)对解密后的二进制流时行合并 mi=Ri; mi+32=Li; for (i=0;i64;i+) bi=mi;for (i=0;i64;i+) 进行 IP 逆表运算mi=bIP1i-1;coutvv”输出解密得的明文二进制流“vvendl;for (i=0;i64;i+)coutmi;coutendl;for(i=0;iv8;i+)输出明文字符 int h=0;for(int

11、j=0;j8;j+)h=h+mi*8+j*pow(2,7-j);coutchar(h);h=0;)coutendl;)void makek()输入密码进行解密k64和mk1648 char ch1 OOlprograme;要转换的明文int n=0;int k64;先将字符的ASCII码测出coutvvendkv”密码是“ vvchvvendl;输出字符以查看for(int i=0;i=0;j-) ki*8+j=n%2;n=rV2;/取二进制流)for(i=0;i64;i+)coutki;coutendl;int mk156;for(i=0;i56;i+)密钥的PC-1选择置换去掉其中的第八位

12、的奇偶校验位变成56位mk1i=kPC1i-1;/PC1从1至56而数组是从0到55所以减去1int C028,D028;for(i=0;i28;i+)将密钥分成左右两组,得至U CO和DO皆为28位C0i=mk1i; D0i=mk1i+28;intC128, D128;for(int x=1 ;x=16;x+)/开始进入循环产生16个子密钥了(if(x=1 |x=2|x=9|x=16) C1 27=C00;D1 27=D00;for(i=0;i27;i+)将PC表置换后的K进行循环左移一位C1i=C0i+1;D1i=D0i+1;)else C1 26=C00;D1 26=D00;C127=C

13、01;D127=D01;for(i=0;i26;i+)将PC表置换后的K进行循环左移二位 C1i=C0i+2; D1i=D0i+2;移位迭代完成后,得 C1 和 D1)for(i=0;i28;i+)合并 C1D1mk1i=C1i;mk1i+28=D1i;for(i=0;i48;i+)for(i=0;i48;i+)选择置换PC-2表得48位子密钥KImkx-1i=mk1PC2i-1;得至ij mkx-1i;X-1 是从 0 到 15 的for(i=0;i28;i+)将 C1 给 CO, D1 给 DOCOi=C1i;DOi=D1i;/到此16个子密钥生成完毕)void main()(minwei

14、();makek(); 产生子16个密钥code(); 加密函数uncode(); 解密函数)/删除用户/修改用户密码/显示用户名和密码/用户维护主菜单void DelUser()void ModifyPassword()void Printuser()void ModifyUser(char cz);函数代码如下:Password()(int i;for(i=0;i0;n-)cinstr;i=0;while(strcmp(strzupi.username)!=0 & i10) i+;if(strcmp(str,upi.username)=0) ( check=l; break;) else

15、(coutn 用户名不正确,请重新输入:n ;)if(!check)(coutendl0);if(!check)(coutendl”对不起,您已经输入了三次,请查证后再进入! ! nendlendl; exit(1);)void AppendUser ()/增加用户(int i,j;i=0;coutnnn 增加用户 Hendlendl;while(strcmp(upi .username,n n) !=0) i+;coutn 请输入用户名(1-10个字符)cinup i .username;j=0;while(strcmp(upi.username,upj.username)!=0) j+;i

16、f(j=i)(coutn 请输入用户密码(1-10个字符):”; cinupi .password;)elsecoutn该用户已经存在!void DelUser ()/删除用户(int i,j;char ynzdelname11;coutn请输入要删除的用户名:n;cindelname;coutn 是否确认(y/n)?:;cinyn;if(yn=,Y,|yn=1y!)(i=0;while(strcmp(delname,upi.username)!=0 & ill)i+; if(i=ll)cout用户名错误或没有该用户!elsefor(j=i+l;jll;j+) (strcpy(upj-1.us

17、ername,upj.username);strcpy(upj-1.password z upj .password); ) ) )void ModifyPassword () /修改用户密码 (char delnamefllzoldpasswordll;int i;coutn请输入用户名:”; cindelname;i=0;while(strcmp(delname,upi.username)!=0 & ill) i+;if(i=ll)cout用户名错误或没有该用户!, else (cout请输入用户旧密码:”; cinoldpassword;if(strcmp(oldpasswordzupi

18、.password)!=0) (coutn用户旧密码错误! ”; else (coutn请榆入用户新密码:n ;cinupi .password; ) )void Printuser () /显示用户名和密码 (int i=0;”用户名七密码n”;while(strcmp(upi.username,n)!=0) (coutup i .usernament,up i .passwordendl; i+; ) )void ModifyUser () /维护用户菜单 (char ynn=*nf Achoice,jxAcho2;ReadFile(); do ( system(nclsn); cout”

19、= 1 a *) choice-=32; cho0=choice; cho1 =10 *; switch(choice) case A:AppendUser();coutnn 按任意键继续nnendl;jx=getch(); break; case : DelUser(); break; case :ModifyPassword(); coutnn 按任意键继续nnendl;jx=getch(); break; case *D1: PrintUser(); coutnn 按任意键继续nnendl;jx=getch(); break; case : WriteFile();cout”nn是否返回

20、主菜单(y/n) ? n ; cinynn; break; while(ynn= F|ynn=!Nf); ) 三、密码类的调用密码类被封装在password.!中,使用时在程序前翻开它即可。如下:#include,zpassword. h在主程序中,定义密码类的对象,然后调用。如定义密码类的对象为a,那么调用:int i;char name12;a. InputUserName (i) ; / 输入用户名 a. InputPassWord (i) ; / 输入密码 a. ModifyUser () /调用密码维护菜单四、改进对密码文件增加加密和解密功能。.增加加密和解密函数 void JiaM

21、i () / 加密 ( int i;for(i=0;i9;i+)int j ;for(j=0;j10;j+)upi.usernamej+=2;for(j=0;j10;j+)upi.passwordj+=2; )void JieMi ()/ 解密(int i;for(i=0;i9;i+) (int j ;for(j=0;j10;j+)upi. usernamej-=2;for(j=0;j10;j+)upi. passwordj-=2; ).修改读文件和写文件函数 void WriteFile () /写用户文件 (fstream userfile;userfile.open(nuser.datn

22、,ios:out); if(!userfile) (coutnpassword file can t open. nn ; abort ();)JiaMi() ;/ 解密userfile.write(char *)up,sizeof(up);userfile.close(); )void ReadFile () /读用户文件 (fstream userfile;userfile.open(user.dat,ios:in); if(!userfile) (int i,j;i=0;coutnnn 您是第一次使用该系统,请设置用户信息nendlendl; coutn 请输入用户名(1-10个字符):

23、”; cinup i . username;coutIf请输入用户密码(1-10个字符):”;cinup i .password; j=0 ;WriteFile(); JieMi();) elseuserfile.read(char *)up,sizeof(up);userfile.close ();JieMi();3.加密前后存储内容比照 加密前的存储内容:加密后的存储内容:4.关键技术 主要是加密和解密算法。本程序采用ASCII码+2算法。 加密和解密算法用于文件的读写中,不需要单独调用。用VC+实现DES加密算法的简略代码/ TestDES.cPP : Defines the entry

24、 Point for the console application./#include stdafx.h#include fstream.hinclude math.hHint data=0;int mk1648;intPC156=57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36,63,55,47,39,31,23,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4;intPC248=14,17,11,24,1,

25、5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2,41,52,31,37,47,55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32);int P32=16,7,20,21,29,12,28,17,1,15,23,26,5,18,31,10,2,8,24,14,32,27,3,9,19,13,30,6,22,11,4,25;intE48=32,1,2,3,4,5,4,5,6,7,8,9,8,9,10,11,12,13,12,13,14,15,16,17,16,17,18,19,20,21,20,21,22,23,24,25,24,25,26,27,28,29,28,29,30,31,32,1;int S8416=14,4,13,1,2,15,11,8,3,10,6,12,5,9,07,0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8,4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0,15,12,8,2,4,9,1,7,5

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论