中南大学现代密码学实验报告
- 格式:doc
- 大小:679.50 KB
- 文档页数:24
现代密码学实验报告院系:班级:姓名:学号:前言密码学(Cryptology)是研究秘密通信的原理和破译秘密信息的方法的一门学科。
密码学的基本技术就是对数据进行一组可逆的数学变换,使未授权者不能理解它的真实含义.密码学包括密码编码学(Cryptography)和密码分析学(Cryptanalyst)两个既对立又统一的主要分支学科。
研究密码变化的规律并用之于编制密码以保护信息安全的科学,称为密码编码学.研究密码变化的规律并用之于密码以获取信息情报的科学,称为密码分析学,也叫密码破译学.密码学在信息安全中占有非常重要的地位,能够为信息安全提供关键理论与技术.密码学是一门古老而深奥的学问,按其发展进程,经历了古典密码和现代密码学两个阶段。
现代密码学(Modern Cryptology)通常被归类为理论数学的一个分支学科,主要以可靠的数学方法和理论为基础,为保证信息的机密性、完整性、可认证性、可控性、不可抵赖性等提供关键理论与技术。
DES加密算法的实现实验目的理解对称加密算法的原理和特点。
实验原理DES是一种分组加密算法,所谓分组加密算法就是对一定大小的明文或密文来做加密或解密动作。
而在DES这个加密系统中,每次加密或解密的分组大小均为64位,所以DES没有密文扩充的问题。
对大于64位的明文只要按每64位一组进行切割,而对小于64位的明文只要在后面补“0"即可。
另一方面,DES所用的加密或解密密钥也是64位大小,但因其中有8个位是用来作奇偶校验的,所以64位中真正起密钥作用的只有56位,密钥过短也是DES 最大的缺点。
DES加密与解密所用的算法除了子密钥的顺序不同外,其他部分完全相同。
实验环境运行Windows或Linux操作系统的PC机。
实验代码:—--————-——-——本实验采用56位密钥加密64位数据—-———--———--#include <stdlib.h〉#include 〈stdio.h〉#include "bool。
现代密码学实验报告院系:理学院班级:信安二班姓名:学号:前言密码学(Cryptology)是研究秘密通信的原理和破译秘密信息的方法的一门学科。
密码学的基本技术就是对数据进行一组可逆的数学变换,使未授权者不能理解它的真实含义。
密码学包括密码编码学(Cryptography)和密码分析学(Cryptanalyst)两个既对立又统一的主要分支学科。
研究密码变化的规律并用之于编制密码以保护信息安全的科学,称为密码编码学。
研究密码变化的规律并用之于密码以获取信息情报的科学,称为密码分析学,也叫密码破译学。
密码学在信息安全中占有非常重要的地位,能够为信息安全提供关键理论与技术。
密码学是一门古老而深奥的学问,按其发展进程,经历了古典密码和现代密码学两个阶段。
现代密码学(Modern Cryptology)通常被归类为理论数学的一个分支学科,主要以可靠的数学方法和理论为基础,为保证信息的机密性、完整性、可认证性、可控性、不可抵赖性等提供关键理论与技术。
RC4密码算法算法实现实验目的:理解流密码的概念及相关结构; 理解并能够编写基本的流密码体制; 熟练应用C/C++编程实现RC4密码算法体制。
实验内容:编程实现RC4加/解密算法。
实验原理:RC4算法是一种序列密码体制或称流密码体制,其加密密钥和解密密钥相同RC4的密钥长度可变,但为了确保哪去安全强度,目前RC4至少使用128位的密钥。
用1~256个字节(8~2048位)的可变长度密钥初始化一个256个字节的状态向量S,S的元素记为S[0],S[1],…,S[255],从始至终置换后的S包含从0到255的所有8位数。
对于加密和解密,字节K是从S的255个元素中按一种系统化的方式选出的一个元素生成的。
每生成一个K的值,S中的元素个体就被重新置换一次。
实验代码:Encrypt.h文件:#ifndef _ENCRYPT_RC4_#define _ENCRYPT_RC4_#include <string.h>#define BOX_LEN 256intGetKey(const unsigned char* pass, intpass_len, unsigned char *out);int RC4(const unsigned char* data, intdata_len, const unsigned char* key, intkey_len, unsigned char* out, int* out_len);static void swap_byte(unsigned char* a, unsigned char* b);char* Encrypt(const char* szSource, const char* szPassWord); // 加密,返回加密结果char* Decrypt(const char* szSource, const char* szPassWord); // 解密,返回解密结果char* ByteToHex(const unsigned char* vByte, constintvLen); // 把字节码pbBuffer转为十六进制字符串,方便传输unsigned char* HexToByte(const char* szHex); // 把十六进制字符串转为字节码pbBuffer,解码#endif // #ifndef _ENCRYPT_RC4_Encrypt.cpp文件:#include "Encrypt.h"char* Encrypt(const char* szSource, const char* szPassWord) // 加密,返回加密结果{if(szSource == NULL || szPassWord == NULL) return NULL;unsigned char* ret = new unsigned char[strlen(szSource)];intret_len = 0;if(RC4((unsigned char*)szSource,strlen(szSource),(unsigned char*)szPassWord,strlen(szPassWord),ret,&ret_len) == NULL)return NULL;char* ret2 = ByteToHex(ret, ret_len);delete[] ret;return ret2;}char* Decrypt(const char* szSource, const char* szPassWord) // 解密,返回解密结果{if(szSource == NULL || (strlen(szSource)%2 != 0) || szPassWord == NULL) return NULL;unsigned char* src = HexToByte(szSource);unsigned char* ret = new unsigned char[strlen(szSource) / 2 + 1];intret_len = 0;memset(ret, strlen(szSource) / 2 + 1,0);if(RC4(src, strlen(szSource) / 2, (unsigned char*)szPassWord, strlen(szPassWord), ret, &ret_len) == NULL)return NULL;ret[ret_len] = '/0';return (char*)ret;}int RC4(const unsigned char* data, intdata_len, const unsigned char* key, intkey_len, unsigned char* out, int* out_len){if (data == NULL || key == NULL || out == NULL)return NULL;unsigned char* mBox = new unsigned char[BOX_LEN];if(GetKey(key, key_len, mBox) == NULL)return NULL;inti=0;int x=0;int y=0;for(int k = 0; k <data_len; k++){x = (x + 1) % BOX_LEN;y = (mBox[x] + y) % BOX_LEN;swap_byte(&mBox[x], &mBox[y]);out[k] = data[k] ^ mBox[(mBox[x] + mBox[y]) % BOX_LEN];}*out_len = data_len;delete[] mBox;return -1;}intGetKey(const unsigned char* pass, intpass_len, unsigned char* out) {if(pass == NULL || out == NULL)return NULL;inti;for(i = 0; i< BOX_LEN; i++)out[i] = i;int j = 0;for(i = 0; i< BOX_LEN; i++){j = (pass[i % pass_len] + out[i] + j) % BOX_LEN;swap_byte(&out[i], &out[j]);}return -1;}static void swap_byte(unsigned char* a, unsigned char* b){unsigned char swapByte;swapByte = *a;*a = *b;*b = swapByte;}// 把字节码转为十六进制码,一个字节两个十六进制,内部为字符串分配空间char* ByteToHex(const unsigned char* vByte, constintvLen){if(!vByte)return NULL;char* tmp = new char[vLen * 2 + 1]; // 一个字节两个十六进制码,最后要多一个'/0'int tmp2;for (inti=0;i<vLen;i++){tmp2 = (int)(vByte[i])/16;tmp[i*2] = (char)(tmp2+((tmp2>9)?'A'-10:'0'));tmp2 = (int)(vByte[i])%16;tmp[i*2+1] = (char)(tmp2+((tmp2>9)?'A'-10:'0'));}tmp[vLen * 2] = '/0';return tmp;}// 把十六进制字符串,转为字节码,每两个十六进制字符作为一个字节unsigned char* HexToByte(const char* szHex){if(!szHex)return NULL;intiLen = strlen(szHex);if (iLen<=0 || 0!=iLen%2)return NULL;unsigned char* pbBuf = new unsigned char[iLen/2]; // 数据缓冲区int tmp1, tmp2;for (inti=0;i<iLen/2;i++){tmp1 = (int)szHex[i*2] - (((int)szHex[i*2]>='A')?'A'-10:'0');if(tmp1>=16)return NULL;tmp2 = (int)szHex[i*2+1] - (((int)szHex[i*2+1]>='A')?'A'-10:'0');if(tmp2>=16)return NULL;pbBuf[i] = (tmp1*16+tmp2);}return pbBuf;}main.cpp文件#include <iostream>#include <string>#include <stdio.h>#include "Encrypt.h"intmain(){inti;std::cout<< "请选择你要进行的操作:1 .加密 2.解密" <<std::endl;std::cin>>i;if (i == 1){char source[100];char pass[100];char *result = NULL;std::cout<< "请输入明文:";std::cin>> source; std::cout<<std::endl;std::cout<< "请输入密钥:";std::cin>> pass;result = Encrypt(source, pass);printf("密文为:%s/n", result);delete[]result;}else if (i == 2){char result[100];char pass[100];char *source = NULL;std::cout<< "请输入密文:";std::cin>> result; std::cout<<std::endl;std::cout<< "请输入密钥:";std::cin>> pass;source = Encrypt(result, pass);printf("明文为:%s/n", source);delete[]source;}elsestd::cout<< "您输入的不合法!" <<std::endl;return 0;}实验结果:。
第1篇一、实验目的1. 了解现代密码学的基本原理和数论基础知识;2. 掌握非对称密码体制的著名代表RSA加密算法的工作原理和流程;3. 设计实现一个简单的密钥系统;4. 掌握常用加密算法AES和DES的原理及实现。
二、实验内容1. RSA加密算法实验2. AES加密算法实验3. DES加密算法实验三、实验原理1. RSA加密算法RSA算法是一种非对称加密算法,由罗纳德·李维斯特、阿迪·沙米尔和伦纳德·阿德曼三位密码学家于1977年提出。
其基本原理是选择两个大质数p和q,计算它们的乘积n=pq,并计算欧拉函数φ(n)=(p-1)(q-1)。
选择一个整数e,满足1<e<φ(n)且e与φ(n)互质。
计算e关于φ(n)的模逆元d。
公开密钥为(e,n),私有密钥为(d,n)。
加密过程为C=Me mod n,解密过程为M=Cd mod n。
2. AES加密算法AES(Advanced Encryption Standard)是一种分组加密算法,采用128位分组大小和128、192或256位密钥长度。
AES算法主要分为四个阶段:初始轮、密钥扩展、中间轮和最终轮。
每个轮包括字节替换、行移位、列混淆和轮密钥加。
3. DES加密算法DES(Data Encryption Standard)是一种分组加密算法,采用64位分组大小和56位密钥长度。
DES算法主要分为16轮,每轮包括置换、置换-置换、S盒替换和密钥加。
四、实验步骤及内容1. RSA加密算法实验(1)选择两个大质数p和q,计算n=pq和φ(n)=(p-1)(q-1);(2)选择一个整数e,满足1<e<φ(n)且e与φ(n)互质,计算e关于φ(n)的模逆元d;(3)生成公开密钥(e,n)和私有密钥(d,n);(4)用公钥对明文进行加密,用私钥对密文进行解密。
2. AES加密算法实验(1)选择一个128、192或256位密钥;(2)初始化初始轮密钥;(3)进行16轮加密操作,包括字节替换、行移位、列混淆和轮密钥加;(4)输出加密后的密文。
华北电力大学实验报告||实验名称现代密码学课程设计课程名称现代密码学||专业班级:学生姓名:学号:成绩:指导教师:实验日期:[综合实验一] AES-128加密算法实现 一、实验目的及要求(1)用C++实现;(2)具有16字节的加密演示;(3)完成4种工作模式下的文件加密与解密:ECB, CBC, CFB,OFB.二、所用仪器、设备计算机、Visual C++软件。
三. 实验原理3.1、设计综述AES 中的操作均是以字节作为基础的,用到的变量也都是以字节为基础。
State 可以用4×4的矩阵表示。
AES 算法结构对加密和解密的操作,算法由轮密钥开始,并用Nr 表示对一个数据分组加密的轮数(加密轮数与密钥长度的关系如表2所示)。
AES 算法的主循环State 矩阵执行1 r N 轮迭代运算,每轮都包括所有 4个阶段的代换,分别是在规范中被称为 SubBytes(字节替换)、ShiftRows(行位移变换)、MixColumns(列混合变换) 和AddRoundKey ,(由于外部输入的加密密钥K 长度有限,所以在算法中要用一个密钥扩展程序(Keyexpansion)把外部密钥 K 扩展成更长的比特串,以生成各轮的加密和解密密钥。
最后执行只包括 3个阶段 (省略 MixColumns 变换)的最后一轮运算。
表2 AES 参数比特。
3.2、字节代替(SubBytes )AES 定义了一个S 盒,State 中每个字节按照如下方式映射为一个新的字节:把该字节的高4位作为行值,低4位作为列值,然后取出S 盒中对应行和列的元素作为输出。
例如,十六进制数{84}。
对应S 盒的行是8列是4,S 盒中该位置对应的值是{5F}。
S 盒是一个由16x16字节组成的矩阵,包含了8位值所能表达的256种可能的变换。
S 盒按照以下方式构造:(1) 逐行按照升序排列的字节值初始化S 盒。
第一行是{00},{01},{02},…,{OF};第二行是{10},{l1},…,{1F}等。
中南大学《数论与密码学基础实践》学生姓名 ***********学号 **************专业班级 **************** 指导老师 *****数学与统计学学院2012年5月7日实验目的:通过实验, 熟练掌握两种以上密码系统加密解密过程及用Maple 实现加密解密过程的方法, 数论是一门理论与实践结合性很强的课程, 在掌握好理论方法的基础之上结合实践, 能够加深印象,巩固学习效果。
1、找费马素数,要写出你找的范围。
n:0到7> seq(fermat(n), n = 0 .. 7);3, 5, 17, 257, 65537, 4294967297, 18446744073709551617,340282366920938463463374607431768211457>with(numtheory):> Fermat:=proc(n::posint)> local i;> for i from 0 to n while i<=n do> if isprime(2^(2^i)+1)=true> then print(i,true);> else print(i,false);> fi;> od;> end:Fermat(7);0, true1, true2, true3, true4, true5, false6, false7, false所以找n=0,1,,,7时,只有当n=0,1,2,3,4时才是费马素数。
2、实现ELG 公钥密码系统ELG 公钥密码系统的描述Alice 要求Bob 将信息m 加密送回,Alice 找到大素数p ,p 的原根a ,大整数A X (私钥),计算()A X A h a p ≡,将,,A p a h ,发送给Bob ;Bob 收到后,随机取{}1,2,,1k p ∈- ,计算()(),k A u a p v h m p ≡≡⋅,将,u v 发送给Alice ;Alice 收到后,计算()A A A A X k X k X k X A v u h m a a m a m p --⋅⋅-⋅⋅≡⋅⋅≡⋅⋅≡,这样就得到了原信息m。
密码学实验报告信息安全实验报告学号:学生姓名:班级:实验三密码学实验一、古典密码算法实验一、实验目的通过编程实现替代密码算法和置换密码算法,加深对古典密码体制的了解,为深入学习密码学奠定基础。
二、编译环境运行windows 或linux 操作系统的PC 机,具有gcc、VC 等C语言编译环境。
三、实验原理古典密码算法历史上曾被广泛应用,大都比较简单,使用手工和机械操作来实现加密和解密。
它的主要应用对象是文字信息,利用密码算法实现文字信息的加密和解密。
下面介绍两种常见的具有代表性的古典密码算法,以帮助读者对密码算法建立一个初步的印象。
1.替代密码替代密码算法的原理是使用替代法进行加密,就是将明文中的字符用其它字符替代后形成密文。
例如:明文字母a、b、c、d ,用D、E、F、G做对应替换后形成密文。
替代密码包括多种类型,如单表替代密码、多明码替代密码、多字母替代密码、多表替代密码等。
下面我们介绍一种典型的单表替代密码,恺撒密码,又叫循环移位密码。
它的加密方法,就是将明文中的每个字母用此字符在字母表中后面第k个字母替代。
它的加密过程可以表示为下面的函数:E= mod n其中:m 为明文字母在字母表中的位置数;n 为字母表中的字母个数;k 为密钥;E为密文字母在字母表中对应的位置数。
例如,对于明文字母H,其在字母表中的位置数为8,设k=4,则按照上式计算出来的密文为L:E = mod n = mod 26 = 12 = L2.置换密码置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现明文信息的加密。
置换密码有时又称为换位密码。
矩阵换位法是实现置换密码的一种常用方法。
它将明文中的字母按照给的顺序安排在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中字母,从而形成密文。
例如,明文为attack begins at five,密钥为cipher,将明文按照每行6 列的形式排在矩阵中,形成如下形式: a ttack b e gins a tfive根据密钥cipher中各字母在字母表中出现的先后顺序,给定一个置换: 1 2 3 4 5 6 f =1 4 5 32 6根据上面的置换,将原有矩阵中的字母按照第 1 列,第 4 列,第5 列,第 3 列,第2列,第 6 列的顺序排列,则有下面形式: a a c t tk b i n g e s a I v f te从而得到密文:abatgftetcnvaiikse其解密的过程是根据密钥的字母数作为列数,将密文按照列、行的顺序写出,再根据由密钥给出的矩阵置换产生新的矩阵,从而恢复明文。
安全SnoWolF/百度B英俊制作课程名称现代密码学实验实验项目名称古典密码算法练习一 Caesar密码加密时每一个字母向前推移k位,例如当k=5时,置换表如表2所示。
表2 Caesar置换表于是对于明文:datasecurityhasevolvedrapidly经过加密后就可以得到密文:IFYFXJHZWNYDMFXJATQAJIWFUNIQD若令26个字母分别对应整数0~25,如表3所示。
表3 Caesar置换表则Caesar加密变换实际上是:c=(m+k)mod26其中m是明文对应的数据,c是与明文对应的密文数据,k是加密用的参数,也称为密钥。
很容易得到相应的Caesar解密变换是:m=D(c)=(c–k)mod26例如明文:datasecurity对应的数据序列:301901842201781924当k=5时经过加密变换得到密文序列:852452397252213243对应的密文为:IFYFXJHZWNYD【实验步骤】本练习主机A、B为一组,C、D为一组,E、F为一组。
首先使用“快照X”恢复Windows系统环境。
一.手动完成Caesar密码(1) 在实验原理部分我们已经了解了Caesar密码的基本原理,那么请同学们写出当密钥k=3时,对应明文:data security has evolved rapidly的密文: GDWD VHFXULWB KDV HYROYHG UDSLGOB 。
(2) 进入实验平台,单击工具栏中的“密码工具”按钮,启动密码工具,在向导区点击“Caesar密码”。
在明文输入区输入明文:data security has evolved rapidly。
将密钥k调节到3,查看相应的密文,并与你手动加密的密文进行比较。
请根据密钥验证密文与明文对应关系是否正确。
二.Caesar加密(1) 进入“加密解密”|“Caesar密码”视图,在明文输入区输入明文(明文应为英文),单击“加密”按钮进行加密。
现代密码学与加解密技术实验一、实验教学目标与基本要求现代密码学与加解密技术实验是本课程重要的实践教学环节。
实验的目的不仅仅是验证理论知识,更重要的是通过实验加强学生的实验手段与实践技能,培养学生分析问题、解决问题、应用知识的能力和创新精神,全面提高学生的综合素质。
通过本实验简要了解密码学以及现代密码算法的基本知识,学会常用文件加密的实现、了解系统加密解密技术,具体掌握几种加解密方法。
实验后完成要求撰写实验报告,报告内容包括题目、测试数据、运行结果、遇到的问题和解决方法、关键代码或程序清单,学生可以在实验报告中提出对实验的建议和意见。
二、实验项目及教学安排三、实验成绩考核办法每次实验后,要求从以下几个方面书写实验报告:实验题目,程序清单,实验用数据及结果,学生可以在实验报告中提出对实验的建议和意见。
实验成绩满分100分,并按10%折算记入课程总成绩,实验成绩不合格者不得参加期末考试。
实验成绩按下面7条进行考核评定。
(1)做好实验内容的预习,写出预习报告;占10%。
(2)了解实验题目的调试方法;占10%。
(3)按实验要求预先设计好程序;占10%。
(4)认真记录实验数据并分析实验结果;占10%。
(5)实验后按要求书写实验报告,记录实验用数据及运行结果;占30%。
(6)创新能力强,在实验中设计的程序有一定的通用性,算法优化;20%。
(7)实验过程中,具有严谨的学习态度,认真、踏实、一丝不苟的科学作风;10%四、实验教材及参考书1.Richard J.Spillman:《CLASSICAL AND CONTEMPORARY CRYPTOLOGY》,清华大学出版社,2005-72.William Stallings: Cryptography and Network Security: Principles and Practice. 2nd ed. Prentice Hall, 1998.3.杨波著:《现代密码学》,清华大学出版社,2003-8.4.Wenbo Mao. Modern Cryptography: Theory and Practicce. 电子工业出版社,2004-7.5.许主洪著:《加密与解密-密码技术剖析与实战应用》,人民邮电出版社,2002-8.6.张焕国,刘玉珍著:《密码学引论》,武汉大学出版社,2003.7.段钢著:《加密与解密》,电子工业出版社,2005-3.五、实验内容与报告的要求实验1、2的内容要求(提示性的)与封面见附录一(打印时将“附录一”3个字去掉)。
中南大学现代密码学实验报告学生姓名郁博文学号0906130205专业班级信息安全1302指导教师段桂华学院信息科学与工程学院完成时间2015年5月AES1.背景AES,密码学中的高级加密标准(Advanced Encryption Stan dard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。
这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。
经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。
2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。
AES 有一个固定的128位的块大小和128,192或256位大小的密钥大小。
Rijndael算法汇聚了安全性、效率高、易实现性和灵活性等优点,是一种较DES更好的算法。
该算法为比利时密码学家Joan Daemen和Vincent Rijmen 所设计,结合两位作者的名字,以Rijndael之命名之,投稿高级加密标准的甄选流程。
(Rijdael的发音近于 "Rhine doll"。
)AES在软体及硬件上都能快速地加解密,相对来说较易于实作,且只需要很少的记忆体。
作为一个新的加密标准,目前正被部署应用到更广大的范围.1.1 Rijndael密码的设计标准:①抵抗所有已知的攻击。
②在多个平台上速度快,编码紧凑。
③设计简单。
当前的大多数分组密码,其轮函数是Feistel结构。
Rijndael没有这种结构。
Rijndael轮函数是由3个不同的可逆均匀变换1.2 设计思想⏹分组和密钥长度可变,各自可独立指定为128、192、256比特。
⏹状态⏹算法中间的结果也需要分组,称之为状态,状态可以用以字节为元素的矩阵阵列表示,该阵列有4行,列数N b为分组长度除32⏹种子密钥⏹以字节为元素的矩阵阵列描述,阵列为4行,列数N k为密钥长度除322.系统设计2.1系统主要目标基本要求部分:1.在深入理解AES加密/解密算法理论的基础上,设计一个AES加密/解密软件系统;2.2功能模块与系统结构主要功能模块如下:2.2.1字节替换SubByte非线性代换是可逆的,由以下两个变换的合成得到:① 首先,将字节看作GF(28)上的元素,映射到自己的乘法逆元,‘00’映射到自己。
现代密码学实验报告学生姓名代巍学号**********专业班级信息安全1201指导教师段桂华学院信息科学与工程学院完成时间2014年5月实验一对称密码算法实验[实验目的]1.掌握密码学中经典的对称密码算法DES、AES、RC4的算法原理。
2.掌握DES、AES、RC4的算法流程和实现方法。
[实验预备]1.DES算法有什么特点?算法中的哪些结构保证了其混淆和扩散的特性?2.AES算法的基本原理和特点。
3.流密码RC4的密钥流生成以及S盒初始化过程。
[实验内容]1. 分析DES、AES、RC4、SHA的实现过程。
2. 用程序设计语言将算法过程编程实现。
3. 完成字符串数据的加密运算和解密运算输入明文:Idolikethisbook输入密钥:cryption[实验步骤]1. 预习DES、AES、RC4算法。
2. 写出算法流程,用程序设计语言将算法过程编程实现。
3. 输入指定的明文、密钥进行实验,验证结果。
4. 自己选择不同的输入,记录输出结果。
写出所编写程序的流程图和运行界面、运行结果。
一、DES算法1.DES算法及原理DES密码实际上是Lucifer密码的进一步发展。
它是一种采用传统加密方法的区组密码。
它的算法是对称的,既可用于加密又可用于解密。
美国国家标准局1973年开始研究除国防部外的其它部门的计算机系统的数据加密标准,于1973年5月15日和1974年8月27日先后两次向公众发出了征求加密算法的公告。
加密算法要达到的目的通常称为DES密码算法要求主要为以下四点:提供高质量的数据保护,防止数据未经授权的泄露和未被察觉的修改;具有相当高的复杂性,使得破译的开销超过可能获得的利益,同时又要便于理解和掌握DES密码体制的安全性应该不依赖于算法的保密,其安全性仅以加密密钥的保密为基础实现经济,运行有效,并且适用于多种完全不同的应用。
目前在这里,随着三金工程尤其是金卡工程的启动,DES算法在POS、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收费站等领域被广泛应用,以此来实现关键数据的保密,如信用卡持卡人的PIN的加密传输,IC卡与POS 间的双向认证、金融交易数据包的MAC校验等,均用到DES算法。
DES算法的入口参数有三个:Key、Data、Mode。
其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。
DES算法是这样工作的:如Mode为加密,则用Key 去把数据Data进行加密,生成Data的密码形式(64位)作为DES的输出结果;如Mode为解密,则用Key 去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果。
在通信网络的两端,双方约定一致的Key,在通信的源点用Key对核心数据进行DES加密,然后以密码形式在公共通信网(如电话网)中传输到通信网络的终点,数据到达目的地后,用同样的Key对密码数据进行解密,便再现了明码形式的核心数据。
这样,便保证了核心数据(如PIN、MAC等)在公共通信网中传输的安全性和可靠性。
通过定期在通信网络的源端和目的端同时改用新的Key,便能更进一步提高数据的保密性,这正是现在金融交易网络的流行做法。
DES算法流程图子密钥产生流程图2.DES算法加密解密过程(1)加密过程。
a.初始置换。
DES的第一阶段包括64位分组的置换,改变每个分组中位的顺序。
术语置换使用其严格的数学意义;只改变了顺序。
这64位数据现在被分成两半:L0(左半部分)和R0(右半部分)。
下标0说明是原始的数据。
在DES算法第二阶段的每次循环后,这些下标加1。
b.循环移位(16次)一种根据密钥,并且依赖于表格的算法。
这种操作通常被称为数据移位。
这个算法要重复16次,但由于每次移位都使用密钥的不同子分组,因此每次移位的操作各不相同。
密钥的子分组由另一组表格和表格的移位算法来确定。
在每次循环以后,L(左半部分)和R(右半部分)的下标依次加一。
第16次循环的结果被称为预输出。
c.逆置换DES的最后一个阶段包括64位分组的置换,改变每个分组中位的顺序,这与第1阶段的操作类似。
这次置换的输出结果就是密文。
(2)解密过程DES的解密过程和加密过程相同,只是在解密过程中将子密钥的使用顺序颠倒。
3. DES算法C++实现模块化设计(囿于篇幅,举几个代表的例子)(1) 二进制转换(将输入的字符串转化为比特数组)void erjinzhi(char z[8],int *q){char ch;int i,j,a=7;for(i=0;i<8;i++){ch=z[i];for(j=0;j<8;j++){*(q+a)=ch%2;ch=ch/2;a--;}a=a+16;}for(i=0;i<=63;i++){if(i%8==0) printf( " ");printf("%d",*(q+i));}printf("\n");}(2)密钥生成时 C D移位void LS_yiwei(int (*p)[28],int i){int j;if(i==1||i==2||i==9||i==16){for(j=0;j<=27;j++){if(j==27)*(*(p+i)+j)=*(*(p+i-1)+0);else*(*(p+i)+j)=*(*(p+i-1)+j+1);}}else{for(j=0;j<=27;j++){if(j==26)*(*(p+i)+j)=*(*(p+i-1)+0);else if(j==27)*(*(p+i)+j)=*(*(p+i-1)+1);else*(*(p+i)+j)=*(*(p+i-1)+j+2);}}}(2)密文生成模块void miwen(int *ip_1){int i,j,a,c,b,x[8];for(i=0;i<=7;i++){a=i*8;x[i]=0;for(j=7;j>=0;j--){c=*(ip_1+a);b=pow(2,j);x[i]=x[i]+b*c;miwens[i]=x[i];//把密文copy在miwens数组中为了输出使用a++;}}// printf("密文为:");for(i=0;i<=7;i++){a=x[i]%127;printf("%c",(char)(a));}printf("\n");}4. 实验结果二、AES算法1.AES算法简介AES 是一种可用来保护电子数据的新型加密算法。
特别是,AES 是可以使用 128、192 和 256 位密钥的迭代式对称密钥块密码,并且可以对 128 位(16 个字节)的数据块进行加密和解密。
与使用密钥对的公钥密码不同的是,对称密钥密码使用同一个密钥来对数据进行加密和解密。
由块密码返回的加密数据与输入数据具有相同的位数。
迭代式密码使用循环结构来针对输入数据反复执行排列和置换运算。
2.算法实现以加密函数为例,如下所示,首先对密钥进行预处理密钥扩展,然后明文进行Nr(Nr与密钥长度有关)次迭代运算,包括字节代换ShiftRows行移位、MixColumns、列混合以及AddRoundKey密钥加。
void Cipher(){int i,j,round=0;// 把明文赋值到状态数组中for(i=0;i<4;i++)for(j=0;j<4;j++)state[j][i] = in[i*4 + j];// 先与初始轮密钥相加AddRoundKey(0);// 第一轮至(Nr-1)轮的迭代运算,第Nr轮不用进行列混合运算for(round=1;round<Nr;round++){SubBytes(); //字节代换ShiftRows(); //行移位MixColumns(); //列混合AddRoundKey(round); //密钥加}SubBytes();ShiftRows();AddRoundKey(Nr);// 加密结束,将机密结果填入数组out中以便输出for(i=0;i<4;i++)for(j=0;j<4;j++)out[i*4+j]=state[j][i];}解密函数的流程和加密函数是一致的,只是对于行变换、列变换、以及相关s盒子为加密的逆过程。
字节代换(SubBytes)字节代换是非线形变换,独立地对状态的每个字节进行。
行移位(ShiftRows)是将状态阵列的各行进行循环移位,不同状态行的位移量不同。
第0行不移动,第1行循环左移C1个字节,第2行循环左移C2个字节,第3行循环左移C3个字节。
位移量C1、C2、C3的取值与Nb有关。
列混合(MixColumns)是将状态阵列的每个列视为多项式,再与一个固定的多项式c(x)进行模x4+1乘法。
Rijndael的设计者给出的c(x)为(系数用十六进制数表示):c(x)=‘03’x3+‘01’x2+‘01’x+‘02’。
密钥加(AddRoundKey)是将轮密钥简单地与状态进行逐比特异或。
轮密钥由种子密钥通过密钥编排算法得到,轮密钥长度等于分组长度Nb。
程序流程图AES流程图3.实验结果首先,输入密钥cryption,输入明文Idolikethisbook,实验结果如图所示。
实验结果三、RC4算法1.算法简介RC4加密算法是大名鼎鼎的RSA三人组中的头号人物Ron Rivest在1987年设计的密钥长度可变的流加密算法簇。
首先,用从1到256个字节的可变长度密钥初始化一个256个字节的状态盒S[256]。
然后,通过S盒子对密钥按字节进行变换。
最后可以得到变换后的密钥。
对于加密,只要让密钥按字节与明文进行异或。
而解密,只要让密钥按字节与密文进行异或。
2.算法实现开始时,S中元素的值被置为按升序从0到255,即S[0]=0,S[1]=1,……,S[255]=255。
同时对密钥key[key_len]的进行填充到随机序列密钥rc4key[256]中,(key_len为key的字节长度,且不大于256)。
循环重复用key,直到rc4key的所有字节都被赋值。
然后根据密钥re4key去对S盒进行变换。
这些预操作可概括如下://S盒先初始化为s[0]=0,s[1]=1...s[255]=255for(i = 0; i < 255; i++)S[i]=i;//初始化序列化密钥for(i = 0; i < 256; i++){j = i % key_len ;rc4key[i] = key_data[j];}//根据密钥rc4key,填充S盒for( j = 0, i = 0; i < 256; i++){j = (rc4key[i] + S[i] + j) % 256;swap(&S[i], &S[j]); //交换S[i]和S[j]的数值}矢量S一旦完成初始化,输人密钥就不再被使用.密钥流的生成是从s[0]到S[255],对每个S[i],根据当前S的值,将S[i]与S中的另一字节置换.当S[255]完成置换后,操作继续重复,从S[0]开始。