电子商务安全电子商务安全电子商务安全电子商务安全实验指导书管理科学与工程学院2009年9月第一部分信息加密技术实验第一部分信息加密技术实验一、实验目的:在数据加密、解密的算法中,DES算法是典型的单密钥体制,RSA是典型的双密钥体制,目前均在大量使用。通过实验,让学生充分理解和掌握DES和RSA算法,PGP加密工具的使用。以及通过网络进行数据加密传输的概念。二、实验内容和要求:(一)基础型:典型单密钥体制DES或典型双密钥体制RSA加、解密系统实现,具体要求如下:(1)DES或RSA加解密软件调试通过。(2)利用DES或RSA对某一数据文件进行单次加密和解密操作。(3)提供大素数生成功能:可产生长度最大可达300位16进制(约合360位10进制数)的大素数,你可以导出素数,也可以从文件中导入素数,也可以产生一个指定长度的随机大素数。(4)界面简洁、友好,便于操作。(二)提高型:1.实现一种基本的混合密码系统,具体要求如下:(1)数据采用DES加密算法,DES密钥采用RSA加、解密算法。(2)系统可产生长度最大可达300位16进制(约合360位10进制数)的大素数,你可以导出素数,也可以从文件中导入素数,也可以产生一个指定长度的随机大素数。(3)本系统产生RSA密钥对。产生后,可以将密钥对导出到文本文件,对于公开密钥和模n你可以不加密,但秘密密钥最好用本系统提供的DES接口加密,使用时再解密。(4)系统的混合加密模块也具有对RSA密钥检错的功能,主要通过解密后DES密钥的长度来判断的,因为如果RSA密钥错误,那么解密后的DES密钥长度一定超过16个字节。2.实现点到点(即一台计算机到别一台计算机)保密传输系统,采用混合加密方法。数据加密采用DES算法,DES密钥采用RSA算法,每进行一次通信,更改一次会话密钥。三、实验:第一项任务:(1)通过《RSA》演示软件,了解RSA的加密、解密过程和性能,掌握其工作原理;(2)编写RSA编码程序;(3)总结实验过程(实验报告,左侧装订):方案、编程、调试、结果、分析、结论。2、实验环境:Windws9x/NT/2000/XP3、编程工具:VisualC++6.04、操作步骤:(1)RSA实验内容:运行《RSA》演示软件:①掌握RSA产生公钥和私钥的方法;②掌握和验证RSA的加密、解密过程;③尝试编写RSA编码的程序。RSA实验:运行《RSATool》演示软件:产生公钥和私钥第二项任务DESDESDESDES加密解密工具2.12.12.12.1及其代码————————支持字符串及文件加密,支持3333重DESDESDESDES1.DES1.DES1.DES1.DES2.12.12.12.1说明说明说明说明先看看DES2.1的截图:2.2.2.2.DESDESDESDES2.12.12.12.1的简介:的简介:的简介:的简介:1.支持任意长度字符串加密解密2.明文、密钥可以不足8字节3.支持回车换行,Tab等特殊字符4.密文可以选择三种方式显示5.支持3重DES6.支持文件加密、解密7.加密时显示进度3.DES3.DES3.DES3.DES算法介绍算法介绍算法介绍算法介绍关于DES算法的介绍大家可以看我博客里的另一篇文章,[原创]DES算法的介绍以及实现(含上次DES程序1.0的源码),所以在此不在重述。4.4.4.4.yxyDES2yxyDES2yxyDES2yxyDES2ClassClassClassClass提供的提供的提供的提供的PublicPublicPublicPublic函数函数函数函数下面我们来看看yxyDES2类(Class)里public函数和它们的用法://功能:产生16个28位的key//参数:源8位的字符串(key),存放key的序号0-1//结果:函数将调用privateCreateSubKey将结果存于charSubKeys[keyN][16][48]voidInitializeKey(char*srcBytes,unsignedintkeyN);//功能:加密8位字符串//参数:8位字符串,使用Key的序号0-1//结果:函数将加密后结果存放于privateszCiphertext[16]//用户通过属性Ciphertext得到voidEncryptData(char*_srcBytes,unsignedintkeyN);//功能:解密16位十六进制字符串//参数:16位十六进制字符串,使用Key的序号0-1//结果:函数将解密候结果存放于privateszPlaintext[8]//用户通过属性Plaintext得到voidDecryptData(char*_srcBytes,unsignedintkeyN);//功能:加密任意长度字符串//参数:任意长度字符串,长度,使用Key的序号0-1//结果:函数将加密后结果存放于privateszFCiphertextAnyLength[8192]//用户通过属性CiphertextAnyLength得到voidEncryptAnyLength(char*_srcBytes,unsignedint_bytesLength,unsignedintkeyN);//功能:解密任意长度十六进制字符串//参数:任意长度字符串,长度,使用Key的序号0-1//结果:函数将加密后结果存放于privateszFPlaintextAnyLength[8192]//用户通过属性PlaintextAnyLength得到voidDecryptAnyLength(char*_srcBytes,unsignedint_bytesLength,unsignedintkeyN);//功能:Bytes到Bits的转换,//参数:待变换字符串,处理后结果存放缓冲区指针,Bits缓冲区大小voidBytes2Bits(char*srcBytes,char*dstBits,unsignedintsizeBits);//功能:Bits到Bytes的转换,//参数:待变换字符串,处理后结果存放缓冲区指针,Bits缓冲区大小voidBits2Bytes(char*dstBytes,char*srcBits,unsignedintsizeBits);//功能:Int到Bits的转换,//参数:待变换字符串,处理后结果存放缓冲区指针voidInt2Bits(unsignedintsrcByte,char*dstBits);//功能:Bits到Hex的转换//参数:待变换字符串,处理后结果存放缓冲区指针,Bits缓冲区大小voidBits2Hex(char*dstHex,char*srcBits,unsignedintsizeBits);//功能:Bits到Hex的转换//参数:待变换字符串,处理后结果存放缓冲区指针,Bits缓冲区大小voidHex2Bits(char*srcHex,char*dstBits,unsignedintsizeBits);//szCiphertextInBinary的get函数char*GetCiphertextInBinary();//szCiphertextInHex的get函数char*GetCiphertextInHex();//Ciphertext的get函数char*GetCiphertextInBytes();//Plaintext的get函数char*GetPlaintext();//CiphertextAnyLength的get函数char*GetCiphertextAnyLength();//PlaintextAnyLength的get函数char*GetPlaintextAnyLength();5.5.5.5.加密、解密示例加密、解密示例加密、解密示例加密、解密示例加密时,首先初始化Key,如果是3重DES需要初始化两个Key,InitializeKey函数的第一个参数是char*key,第二个参数含义是指定初始化第几个key,即keyNum:myDES-InitializeKey(szSourceKey1,0);if(bIs3DES){myDES-InitializeKey(szSourceKey2,1);}初始化完Key以后我们就可以调用加密、解密函数进行相应操作了,以下代码展示了任意长度字符串解密:myDES-InitializeKey(szSourceKey1,0);if(bIs3DES){myDES-InitializeKey(szSourceKey2,1);//key2//D(key0)-E(key1)-D(key0)myDES-DecryptAnyLength(szCiphertextData,ConvertOtherFormat2Ciphertext(strCiphertext.GetBuffer()),0);myDES-EncryptAnyLength(myDES-GetPlaintextAnyLength(),strlen(myDES-GetPlaintextAnyLength()),1);myDES-DecryptAnyLength(myDES-GetCiphertextAnyLength(),strlen(myDES-GetCiphertextAnyLength()),0);}else{//DecryptmyDES-DecryptAnyLength(szCiphertextData,ConvertOtherFormat2Ciphertext(strCiphertext.GetBuffer()),0);}6.6.6.6.关于一些特殊情况的特别说明:关于一些特殊情况的特别说明:关于一些特殊情况的特别说明:关于一些特殊情况的特别说明:yxyDES2yxyDES2yxyDES2yxyDES2提供一些转换函数提供一些转换函数提供一些转换函数提供一些转换函数具体示例我的代码里都有,大家可以下载了看看,对于有特殊要求的朋友来说,比如要用16进制Key,或2进制明文等,大家可以调用yxyDES2类里的几个相应的转换函数,将其转换成byte,即char*。以下是这几个函数的定义://功能:Bytes到Bits的转换,//参数:待变换字符串,处理后结果存放缓冲区指针,Bits缓冲区大小voidBytes2Bits(char*srcBytes,char*dstBits,unsignedintsizeBits);//功能:Bits到Bytes的转换,//参数:待变换字符串,处理后结果存放缓冲区指针,Bits缓冲区大小voidBits2Bytes(char*dstBytes,char*srcBits,unsignedintsizeBits);//功能:Int到Bits的转换,//参数:待变换字符串,处理后结果存放缓冲区指针voidInt2Bits(unsignedintsrcByte,char*dstBits);//功能:Bits到Hex的转换//参数:待变换字符串,处理后结果存放缓冲区指针,Bits缓冲区大小voidBits2Hex(char*dstHex,char*srcBits,unsignedintsizeBits);//功能:Bits到Hex的转换//参数:待变换字符串,处理后结果存放缓冲区指针,Bits缓冲区大小voidHex2Bits(char*srcHex,char*dstBits,unsignedintsizeBits);7.7.7.7.关于文件加密关于文件加密关于文件加密关于文件加密其实文件加密很简单的,类里没有提供,但是调用yxyDES2类里的标准加密函数很容易就搞定了,这是示例:voidCDESToolDlg::OnBnClickedButtonFileGoE(){FILE*fpSrc,*fpDst;CStringszSrcPath,szDstPath,szKey1,szKey2;charbuff[8]={0};longfileSize=0,hasDon