




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、密码学课程设计实验报告n 标准DES加解密实现n 弱密钥过滤n 短块处理密文挪用n 3圈DES差分攻击计算机科学与技术学院信息平安0801班李晨U200714977指导老师:崔国华2021年3月28日目 录一、实验平台与环境4二、DES加解密相关内容41.标准DES原理与编程实现4标准DES根本框架4G函数实现8内部密钥生成92.DES弱密钥过滤原理与编程实现*11弱密钥定义11弱密钥过滤程序实现113.DES短块处理密文挪用原理与编程实现12密文挪用加解密原理12对于小于64bit数据块的处理174.整体界面设计17界面效果预览17实现特点181)DES加解密、弱密钥过滤、短块处理完全集成1
2、82)支持数据块操作和文件操作183)密钥校验功能184)随机密钥产生功能185.程序主体设计18类BaseCode18类DESCode20类DESHandle226.实现功能测试23短块处理23数据块加解密25文件加解密25弱密钥过滤26随机密钥生成27密钥校验27三、3圈DES差分攻击*291.3圈DES差分攻击原理292.差分表构造303.程序实现32输入数据结构与管理32穷举情况统计33具体破解364.整体界面设计39界面预览39功能特色391)忽略初始和末置换的简单DES实现392)适应任意多组破解数据的设计393)穷举情况的提醒405.实现功能测试40四、总结421.加深了对DES
3、的了解422.通过差分攻击代码实现,理解了差分的根本原理423.应该更好得去把握一个问题424.设计能力有待加强42附:核心类声明源代码42一、 实验平台与环境 操作系统:Windows7 开发平台:Microsoft Visual Studio 2021 界面设计:MFC 核心代码:C+编写 Rn LnIP逆置换输出数据输入数据IP置换 L0 R0G函数R1L1 逐轮加密. Ln Rn内部密钥二、 DES加解密相关内容1. 标准DES原理与编程实现1.1 标准DES根本框架置换函数 / 功 能:实现函数置换/ 参 数:/ _in :输入数据/ _out :输出数据/ _replace:置换数
4、组/ _length :数据长度,以字节为单位/ 返回值:/ 总是返回0/ 说 明:/ 输入数据、输出数据、置换数组的长度必须相同/ 编写者:李晨/ 完成时间:2021/2/14/ 修改时间:2021/2/16测试通过/int BaseCode:Replace(char* _in, char* _out,const int _replace,int _length)/ count_输入数据中的数组位置/ num_输入数据比特中位置int count_ = 0,num_ = BYTESIZE;/ 逐位获得输出数据for(int i = 0; i = 0; j-)/ 获得置换位置count_ =
5、(_replacei * BYTESIZE + BYTESIZE - j - 1 - 1) / BYTESIZE;num_ = (_replacei * BYTESIZE + BYTESIZE - j - 1 - 1) % BYTESIZE; / 获得输入数据的值char mask_ = 1;mask_ = mask_ (BYTESIZE - num_ - 1);mask_ = mask_ & _incount_;mask_ = 0 ? mask_ = 0: mask_ = 1;/ 根据输入数据获得输出数据*(_out + i) &= (0x01 j);*(_out + i) |= mask_
6、 j;return 0;异或函数 / 功 能:实现异或功能/ 参 数:/ _param1:异或的一个输入/ _param2:异或的另一个输入/ _result:异或数据的输出/ _length:数据长度,以字节为单位/ 返回值:/ 总是返回0/ 说 明:/ 数据的长度必须一致。/ 编写者:李晨/ 完成时间:2021/2/14/ 修改时间:2021/2/14测试通过/int BaseCode:ByteAdd(char* _param1, char* _param2, char* _result, int _length)/ 逐比特实现异或for(int i = 0; i _length / BY
7、TESIZE ; i+)_resulti = _param1i _param2i;return 0;DES算法实现 src/ 功 能:完成DES加解密运算/ 参 数:/ _in :输入数据块/ _out :输出数据块/ _mode :模式,指定是加密还是解密/ _circle:加解密圈数/ 返回值:/ 总是返回0/ 说 明:/ 该函数完成DES的核心算法/ 编写者:李晨/ 完成时间:2021/2/15/ 修改时间:2021/2/17测试通过/int DESCode:DES(const DESBlock _in, DESBlock _out, const DESKey _key, Mode _m
8、ode /* = Encrypt */,int _circle /* = 16 */)char temp_BLOCKSIZE = 0;char R_BLOCKSIZE/2 = 0;/ 计算内部密钥CountKey(_key,_mode,16);/ 检查密钥平安性if(CheckKey() = WeakKey)SetLastError(_T(对不起,你输入的是弱密钥!);return -1;/ 初始置换Replace(char*)_in,temp_,IP_replace,BLOCKSIZE*BYTESIZE);for(int i = 0;i _circle;i+)/ G函数FuncG(HalfB
9、lock)(temp_ + BLOCKSIZE/2),m_keysi,(HalfBlock)R_);/ 完成按位加运算得到R ByteAdd(char*)temp_,(char*)R_,(char*)R_,BLOCKSIZE * BYTESIZE /2);/ 得到新的L和Rfor(int j = 0; j BLOCKSIZE/2; j+)temp_j = temp_BLOCKSIZE/2 + j; temp_BLOCKSIZE/2 + j = R_j;char pc_;/ 交换L和R的位置for(int i = 0; i BLOCKSIZE/2; i+)pc_ = temp_i;temp_i
10、= temp_BLOCKSIZE/2 + i;temp_BLOCKSIZE/2 + i = pc_;/ 未置换Replace(temp_,(char*)_out,DE_IP_replace,BLOCKSIZE*BYTESIZE);return 0;输入数据输出数据E扩展置换S 盒置换P 盒置换内部密钥1.2 G函数实现G函数实现 / 功 能:实现DES加密中的G函数/ 参 数:/ _in :输入数据数组/ _key:相应的内部密钥/ _out:输出数据存放数组/ 返回值:/ 总是返回/ 说 明:/ 无/ 编写者:李晨/ 完成时间:2021/2/16/ 修改时间:2021/2/16测试通过/in
11、t DESCode:FuncG(HalfBlock _in,InKey _key,HalfBlock _out)char temp_INKEYSIZE = 0;char data_ = 0;unsigned char mask_ = 1;/ E扩展置换Replace(char*)_in,(char*)temp_,E_replace,INKEYSIZE * BYTESIZE);/ 和内部密钥异或ByteAdd(char*)temp_,(char*)_key,(char*)temp_,INKEYSIZE * BYTESIZE);/ 经过S盒unsigned char line_ = 0, row_
12、 = 0; for(int i = 0 ;i 8; i+)line_ = 0;row_ = 0;/ 获得6 bit数据GetBit(char)temp_ 6 * i / 8,6 * i % 8,&line_,6);GetBit(char)temp_ (6 * i + 1) / 8,(6 * i + 1) % 8,&row_,4);GetBit(char)temp_ (6 * i + 2) / 8,(6 * i + 2) % 8,&row_,5);GetBit(char)temp_ (6 * i + 3) / 8,(6 * i + 3) % 8,&row_,6);GetBit(char)temp
13、_ (6 * i + 4) / 8,(6 * i + 4) % 8,&row_,7);GetBit(char)temp_ (6 * i + 5) / 8,(6 * i + 5) % 8,&line_,7);char output_ = *(SPi + line_ * 16 + row_);*(char*)_out + 4*i/8) &= 0x0f (i % 2)*4);*(char*)_out + 4*i/8) |= output_ (i + 1) % 2)*4);/ 进行P盒置换 for(int i = 0; i BLOCKSIZE/2; i+)temp_i = *(char*)_out +
14、 i);Replace(char*)temp_,(char*)_out,P_replace, BLOCKSIZE * BYTESIZE / 2);return 0;Y密 钥密钥初始置换圈数?左移1或者2位PC选择置换退出N获得一个内部密钥1.3 内部密钥生成内部密钥生成实现 / 功 能:计算内部密钥/ 参 数:/ _key : 用户密钥/ _mode : 模式,指定是加密还是解密/ _circle: 加密或者解密圈数/ 返回值:/ 总是返回/ 说 明:/ 无/ 编写者:李晨/ 完成时间:/2/16/ 修改时间:/2/16测试通过/int DESCode:CountKey(DESKey _key
15、,Mode _mode,int _circle /* = 16 */)char key_7;/ 密钥初始置换Replace(char*)_key,key_,Key_replace,KEYSIZE * BYTESIZE);/ 逐圈计算内部密钥for(int i = 0; i _circle ;i+)/ 左移一位或者两位LeftMove(DESKey)key_);if(Key_Left_Movei = 2)LeftMove(DESKey)key_);/ PC选择置换if(_mode = EncryptMode)Replace(char*)key_,(char*)m_keysi,PC_replace
16、,INKEYSIZE*BYTESIZE);elseReplace(char*)key_,(char*)m_keys_circle - i -1,PC_replace,INKEYSIZE*BYTESIZE);return 0;2. DES弱密钥过滤原理与编程实现*2.1 弱密钥定义如果一个密钥生成的16个内部密钥相同,那么这个密钥就是弱密钥。2.2 弱密钥过滤程序实现弱密钥过滤程序实现 / 功 能:检测密钥的平安性/ 参 数:/ 无/ 返回值:/ 对密钥检测的结果/ 说 明:/ 当前该函数只是用来检测输入的密钥是否为弱密钥/ 编写者:李晨/ 完成时间:/2/18/ 修改时间:/2/18测试通过/
17、DESCode:KeyType DESCode:CheckKey()KeyType type_ = WeakKey;/ 逐项匹配内部密钥,如果内部密钥相等认为是弱密钥for(int i = 1;i MAXCIRCLE;i+)for(int j = 0;j INKEYSIZE;j+)/ 只要检测到一项不相等即不是弱密钥if(m_inkey0j != m_inkeyij)type_ = NormalKey;break;return type_;3. DES短块处理密文挪用原理与编程实现密文挪用加密64Bit64Bit64Bit64Bit.64Bit64Bit64Bit64Bit64Bit.64Bi
18、t短块假设有短块,从已加密数据中借用一局部凑足一个数据块3.1 密文挪用加解密原理密文挪用解密64Bit64Bit64Bit64Bit.64Bit64Bit64Bit64Bit64Bit.64Bit短块假设有短块,先解密短块数据,在从头开始解密数据密文挪用加密实现 / 功 能:加密数据/ 参 数:/ _in :输入数据/ _out :输出数据/ _size :输入数据长度,以字节为单位/ _key :密钥/ _keysize:密钥长度,以字节为单位/ _circle :圈数/ 返回值:/ 成功返回,失败返回-1/ 说 明:/ 当前只实现ECB模式,短块处理采用挪位方式/ 编写者:李晨/ 完成时
19、间:/2/18/ 修改时间:/2/18测试通过/int BaseCode:Encrypt(const char* _in,char* _out,int _size,const char* _key,int _keysize,int _circle)int length_ = _size; / 获得分组长度int size_; / 加密分组长度char tmp_20; / 临时存放数据的数组/ DES算法if(m_Alg = DESAlg)size_ = 8; / DES加密算法分组长度bits/ 无法识别的算法elseSetLastError(_T(未知算法!);return -1;/ 密码本
20、模式if(m_Group = ECB)/ 密码挪用模式,输入数据的长度必须不小于分块长度if(m_Short = PeculateMode)if(_size = 0; length_ -= size_,i+ )if(EncryptBlock(_in + i*size_, _out + i*size_,_key,size_,_keysize,_circle) = -1)return -1;/ 密码挪用模式if(m_Short = PeculateMode)if(length_ != 0)/ 获得最后一块,已加密局部for(int i = 0;i size_ - length_;i+)tmp_i
21、= _out_size - size_ + i;/ 获得最后一块的明文局部for(int i = 0; i length_;i+)tmp_size_ - length_ + i = _in_size - length_ + i;/ 加密最后一块if(EncryptBlock(tmp_,_out + _size - size_,_key,size_,_keysize,_circle) = -1)return -1;/ 填充模式,未实现else if(m_Short = FillMode)elseSetLastError(_T(未知的短块处理方法!);return -1;/ 密码分组链接模式,未实
22、现else if(m_Group = CBC)return 0;/ 功 能:解密数据/ 参 数:/ _in :输入数据/ _out :输出数据/ _size :输入数据长度,以字节为单位/ _key :密钥/ _keysize:密钥长度,以字节为单位/ _circle :圈数/ 返回值:/ 成功返回,失败返回-1/ 说 明:/ 当前只实现ECB模式,短块处理采用挪位方式/ 编写者:李晨/ 完成时间:/2/18/ 修改时间:/2/18测试通过/int BaseCode:Decrypt(const char* _in,char* _out,int _size,const char* _key,in
23、t _keysize,int _circle)int length_ = _size;int size_; / 加密分组长度char tmp_20;/ DES算法if(m_Alg = DESAlg)size_ = 8; / DES加密算法分组长度bits/ 无法识别的算法elseSetLastError(_T(Unknown Algorithms!);return -1;/ 密码本模式if(m_Group = ECB)/ 短块处理挪用模式if(m_Short = PeculateMode)if(_size = 0; length_ -= size_,i+ )if(DecryptBlock(_i
24、n + i*size_, _out + i*size_,_key,size_,_keysize,_circle) = -1)return -1;/ 密码挪用模式if(m_Short = PeculateMode)if(length_ != 0)if(DecryptBlock(_in + _size - size_,_out + _size - size_,_key,size_,_keysize,_circle)return -1;/ 获得最后一块for(int i = 0;i length_;i+)tmp_i = _in_size - size_ - length_ + i;for(int i
25、 = 0; i size_ - length_;i+)tmp_length_ + i = _out_size - size_ + i;/ 重新解密倒数第二块if(DecryptBlock(tmp_,_out + _size - size_ - length_,_key,size_,_keysize,_circle) = -1)return -1;/ 填充模式,未实现else if(m_Short = FillMode)elseSetLastError(_T(未知的短块处理方法!);return -1;/ 分组链接模式else if(m_Group = CBC)return 0;3.2 对于小于
26、64bit数据块的处理对于小于64bit的数据块,密文挪用方式下只剩下短块,本程序实现时采用限制数据长度必须大于或者等于64bit的方法,如果数据长度小于64bit,程序提示用户出错!4. 整体界面设计4.1 界面效果预览4.2 实现特点程序把DES加解密的相关操作很好的集成了在一个界面中,并且提供了几项比较实用的功能。现简单介绍如下:1) DES加解密、弱密钥过滤、短块处理完全集成程序把课程设计中的这三个题目要求集中在一起实现,这三个功能是实用DES加解密程序必须具备的。当前实现的加密模式是ECB模式,短块处理采用密文挪用方式。2) 支持数据块操作和文件操作程序可以完成数据块加解密,直接在编
27、辑框中输入数据即可,数据块加解密支持十六进制;也可以实现文件加解密,可以从文件加解密数据,再把结果写入相应的文件。3) 密钥校验功能程序提供密钥校验能力,支持奇校验和偶校验,输入的密钥可以不带校验,由程序自动添加相应的校验位。4) 随机密钥产生功能为了减轻用户自己输入密钥的麻烦,程序提供了生成随机密钥的能力,方便用户产生密钥。5. 程序主体设计程序界面实现采用MFC,核心算法代码采用C+编写,采用了面向对象的设计。5.1 类BaseCode 提供加解密函数外部调用接口; 完成输入数据级的加解密操作,需要进行加解密模式,短块处理等操作; 提供加解密的公共操作,如置换操作,按位加操作等类 Base
28、Code声明enum AlgorithmsModeDESAlg;class BaseCodepublic:BaseCode(AlgorithmsMode _alg);BaseCode();enum EncryptionModeECB,CBC; / 加密模式,ECB是密码本模式,CBC是密码分组链接模式enum DemeritModePeculateMode,FillMode; / 短块处理,FillMode是填充模式,PeculateMode是挪用模式/ 加密函数int Encrypt(CString _in,CString _out,char* _key,int _keysize,int _
29、circle = 16,bool _isEncrypt = true);int Encrypt(const char* _in,char* _out,int _size,const char* _key,int _keysize,int _circle = 16);/ 解密函数int Decrypt(CString _in,CString _out,char* _key,int _keysize,int _circle);int Decrypt(const char* _in,char* _out,int _size,const char* _key,int _keysize,int _cir
30、cle = 16);/ 设置加密模式int SetMode(EncryptionMode _group,DemeritMode _fill = PeculateMode)m_Group = _group;m_Short = _fill;/ 获得错误字符串const CString& GetLastError()return m_err;protected:/ 设置错误字符串void SetLastError(CString _err)m_err = _err;/ 置换函数int Replace(char* _in, char* _out, const int _replace,int _len
31、gth);/ 按位加,异或int ByteAdd(char* _param1, char* _param2, char* _result, int _length);/ 获得数据的特定位int GetBit(unsigned char _source,unsigned int _pos1,unsigned char* _des,unsigned int _pos2);/ 比较两个数据块是否相等int IsEqual(const char* _block1,const char* _block2,int _size);/ 拷贝一个数组到另外一个数组void BlockCopy(const cha
32、r* _source,char* _des,int _size);/ 设置校验位的函数void CheckOutBit(char* _byte,int _mode);/ 加密数据块virtual int EncryptBlock(const char* _in, char* _out, const char* _key, int _length, int _keysize, int _circle) = 0; / 解密数据块virtual int DecryptBlock(const char* _in, char* _out, const char* _key, int _length, i
33、nt _keysize, int _circle) = 0;private:AlgorithmsMode m_Alg; / 加密算法EncryptionMode m_Group; / 分组模式DemeritMode m_Short; / 短块处理CString m_err; / 错误提示字符串;5.2 类DESCode继承自BaseCode,完成数据块级的操作,主要实现DES数据块加解密操作,弱密钥判断等操作,实现标准DES。类DESCode声明 #include BaseCode.h#define MAXCIRCLE 16#define BLOCKSIZE 8#define KEYSIZE
34、7#define INKEYSIZE 6using namespace std;class DESCode : public BaseCodepublic:DESCode();DESCode();enum ModeEncryptMode,DecryptMode;typedef char (*DESKey)KEYSIZE + 1;typedef char (*DESBlock)BLOCKSIZE;typedef char (*InKey)INKEYSIZE;typedef char (*HalfBlock)BLOCKSIZE / 2;enum KeyTypeNormalKey,WeakKey;p
35、rotected:virtual int EncryptBlock(const char* _in, char* _out, const char* _key,int _length = 8, int _keysize = 7, int _circle = 16);virtual int DecryptBlock(const char* _in, char* _out, const char* _key,int _length = 8, int _keysize = 7, int _circle = 16);/ DES算法int DES(const DESBlock _in, DESBlock
36、 _out, const DESKey _key, Mode _mode = EncryptMode,int _circle = 16); / 计算内部密钥int CountKey(DESKey _key,Mode _mode,int _circle = 16);/ 密钥产生的左移int LeftMove(DESKey _key);/ g函数int FuncG(HalfBlock _in,InKey _key,HalfBlock _out);/ 检测用户密钥的平安性KeyType CheckKey();InKey m_keysMAXCIRCLE;char m_inkeyMAXCIRCLEINK
37、EYSIZE;/ IP置换表const static int IP_replaceBLOCKSIZE * BYTESIZE;/ IP逆置换表const static int DE_IP_replaceBLOCKSIZE * BYTESIZE;/ 密钥产生每轮移动次数表const static int Key_Left_MoveMAXCIRCLE;/ PC选择置换const static int PC_replaceINKEYSIZE * BYTESIZE;/ E扩展置换const static int E_replaceINKEYSIZE * BYTESIZE;/ P置换const stati
38、c int P_replaceBLOCKSIZE * BYTESIZE / 2;/ 8个S盒const static char SP84 * 16;/密钥置换const static int Key_replaceKEYSIZE * BYTESIZE;5.3 类DESHandle实现一些辅助功能,如密钥校验,十六进制显示和内部数据转换,获得随机密钥。类 DESHandle声明 #include #include #include class DESHandlepublic:DESHandle();DESHandle();/ 十六进制字符形式转换为数据形式int Hex2Data(const C
39、String& _hex,char* _data,int length);/ 把数据转换为十六进制显示字符形式CString Data2Hex(const char* _data,int length);/ 把输入字符转换为一般形式int Input2Char(const CString& _input,bool _isText,char* _data,int length); / 检查输入密钥的正确性int KeyCheck(const CString& _str,char* _key,int length,bool _isCheck = true,bool _isOdd = true);C
40、String GetRandKey(bool _isCheck = true,bool _isOdd = true);/ 获得最后一次出错字符串const CString& GetLastError()return m_Err;protected:/ 设置出错字符串void SetLastError(CString _err)m_Err = _err;void CheckOutBit(char* _byte,int _mode);/ 产生随机数double Random(double start, double end)return start+(end-start)*rand()/(RAND
41、_MAX + 1.0);private:CString m_Err;void InitHexMap();std:map m_HexMap;CString m_HexStrMap16;6. 实现功能测试6.1 短块处理输入数据12bit,加密得到的数据也为12bit。再解密数据,确认短块处理成功。6.2 数据块加解密上面的操作也测试了数据块加解密,这里不再赘述。6.3 弱密钥过滤弱输入的密钥为弱密钥,显示效果如下:6.4 随机密钥生成用户如果不想自己输入密钥,程序提供随机密钥生成功能,点击生成随机密钥,即可生成随机密钥。6.5 密钥校验三、 3圈DES差分攻击*略去初始置换和末置换的3圈DES1
42、. 3圈DES差分攻击原理L2R2E扩展8个S盒P置换L3R3K3L2R2L1R1E扩展8个S盒P置换L0R0E扩展8个S盒P置换K1K2位置1位置2位置33圈DES差分攻击原理破解条件:一组明文E1、E2,以及对应的密文C1、C2,其中E1和E2的低32bit相同。令的高32bit, E1.R0表示E1的低32bit, 同理E1.L1表示E1加密一圈后的高32bit,其它的数据同理表示。根本结论:置换传递差分;E扩展传递差分;异或传递差分;。K3 = E1.pos1 E1.pos2 或者 K3 = E2.pos1 根据条件,位置1的值很容易获得,关键是求出位置2的值或者位置2的值的可能情况。根据根本结论,对于这组数据,位置2和位置3的差分容易获得: = E(E1.R2) = E(C1.L3)密文C1高32bit的E扩展 = E(E2.R2) = E(C2.L3)密文C2高32bit的E扩展E1.po
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 冰柜使用合同范本
- MJC13-生命科学试剂-MCE
- GPV574-生命科学试剂-MCE
- 2002-G12-生命科学试剂-MCE
- 1-Phenylethylamine-hydrochloride-生命科学试剂-MCE
- 租借婚纱合同范本
- 综采工作面液压支架安装回撤工职业技能理论考试题库150题(含答案)
- 2025至2030年中国花梨木实木地板数据监测研究报告
- 社交媒体运营新篇章策略与实践双驱动力
- 海鲜交易合同范本
- 四年级语文下册 第一单元 字词专项练习 (含答案)(部编版)
- 2024版2024年《汽车文化》全套教案
- 房地产 -中建科工五大类型项目成本指标库
- 2024小红书保健品行业营销通案
- 未来网络支撑下的数字身份体系:产业和技术发展趋势(2024年)定稿版本
- 新《卷烟营销》理论知识考试题库(附答案)
- 诺如病毒的护理
- 三年级下册语文核心素养教案电子版
- 中考英语688高频词大纲词频表
- 知识产权保护与跨境执法合作
- 肉类食品配送服务投标方案(技术方案)
评论
0/150
提交评论