现代密码学实验报告

合集下载

现代密码学实验报告

现代密码学实验报告
{
SubBytes(); //字节代换
ShiftRows(); //行移位
MixColumns(); //列混合
AddRoundKey(round); //密钥加
}
SubBytes();
ShiftRows();
AddRoundKey(Nr);
// 加密结束,将机密结果填入数组out中以便输出
for(i=0;i<4;i++)
// 把明文赋值到状态数组中
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++)
作用:身份认证,是任何网络安全方案的一个基础。如在大部分情况下, 需要认证的实体是通信的发送者,即需要确定访问者的合法性问题。 S/KEY协议主要是用于身份认证。
二、用MD5实现加密
1、算法简介
MD5即Message-Digest Algorithm 5(信息-摘要算法 5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。

现代密码学-DES加密算法 实验报告

现代密码学-DES加密算法 实验报告

现代密码学实验报告院系:班级:姓名:学号:前言密码学(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。

现代密码学实验报告

现代密码学实验报告

现代密码学实验报告学生姓名学号专业班级指导教师学院完成时间实验一对称密码算法实验[实验目的]1.掌握密码学中经典的对称密码算法DES、AES、RC4的算法原理。

2.掌握DES、AES、RC4的算法流程和实现方法。

[实验内容]1. 分析DES、AES、RC4、SHA的实现过程。

2. 用程序设计语言将算法过程编程实现。

3. 完成字符串数据的加密运算和解密运算输入明文:Idolikethisbook输入密钥:cryption[实验步骤]一、DES算法1、DES算法及原理DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。

明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。

2、DES算法加解密过程(1) DES算法加密过程如下:a.初始置换。

DES的第一阶段包括64位分组的置换,改变每个分组中位的顺序。

术语置换使用其严格的数学意义;只改变了顺序。

这64位数据现在被分成两半:L0(左半部分)和R0(右半部分)。

下标0说明是原始的数据。

在DES算法第二阶段的每次循环后,这些下标加1。

b.循环移位(16次)一种根据密钥,并且依赖于表格的算法。

这种操作通常被称为数据移位。

这个算法要重复16次,但由于每次移位都使用密钥的不同子分组,因此每次移位的操作各不相同。

密钥的子分组由另一组表格和表格的移位算法来确定。

在每次循环以后,L(左半部分)和R(右半部分)的下标依次加一。

第16次循环的结果被称为预输出。

c.逆置换DES的最后一个阶段包括64位分组的置换,改变每个分组中位的顺序,这与第1阶段的操作类似。

这次置换的输出结果就是密文。

(2)解密过程DES的解密过程和加密过程相同,只是在解密过程中将子密钥的使用顺序颠倒。

现代密码学实验报告

现代密码学实验报告

现代密码学实验报告学生姓名学号专业班级指导教师学院信息科学与工程学院完成时间2014年5月实验一对称密码算法实验[实验目的]1.掌握密码学中经典的对称密码算法DES、AES、RC4的算法原理。

2.掌握DES、AES、RC4的算法流程和实现方法。

[实验预备]1.DES算法有什么特点算法中的哪些结构保证了其混淆和扩散的特性答:分组比较短、密钥太短、密码生命周期短、运算速度较慢。

采用替代和置换的方法简单有效地遵循了香农定理,替代操作通过S盒达到了混淆效果,置换操作通过P盒扩散效果。

2.AES算法的基本原理和特点。

答:AES加密数据块分组长度必须为128比特,密钥长度可以是128比特、192比特、256比特中的任意一个(如果数据块及密钥长度不足时,会补齐)。

AES加密有很多轮的重复和变换。

大致步骤如下:1、密钥扩展(KeyExpansion),2、初始轮(Initial Round),3、重复轮(Rounds),每一轮又包括:SubBytes、ShiftRows、MixColumns、AddRoundKey,4、最终轮(Final Round),最终轮没有MixColumns。

3.流密码RC4的密钥流生成以及S盒初始化过程。

答:RC4由伪随机数生成器和异或运算组成。

RC4的密钥长度可变,范围是[1,255]。

RC4一个字节一个字节地加解密。

给定一个密钥,伪随机数生成器接受密钥并产生一个S盒。

S盒用来加密数据,而且在加密过程中S盒会变化。

初始化长度为256的S盒。

第一个for循环将0到255的互不重复的元素装入S盒。

第二个for循环根据密钥打乱S盒。

下面i,j 是两个指针。

每收到一个字节,就进行while循环。

通过一定的算法((a),(b))定位S盒中的一个元素,并与输入字节异或,得到k。

循环中还改变了S盒((c))。

如果输入的是明文,输出的就是密文;如果输入的是密文,输出的就是明文。

[实验内容]1.分析DES、AES、RC4、SHA的实现过程。

现代密码学-RC4校验 实验报告

现代密码学-RC4校验 实验报告

现代密码学实验报告院系:理学院班级:信安二班姓名:学号:前言密码学(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;}实验结果:。

现代密码算法实验报告(3篇)

现代密码算法实验报告(3篇)

第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)输出加密后的密文。

密码学实验报告三

密码学实验报告三
加密流程解密流程
(2)子密钥的产生流程:
子密钥产生流程
2、利用下列程序实现一个文件的加密和解密:(程序的主要代码,整个程序见附件)
//密钥置换1pc-1
intDES_PC1_Transform(ElemTypekey[64],ElemTypetempbts[56]){
intcnt;
for(cnt=0;cnt<56;cnt++){
}
memcpy(data,temp,32);
return0;
}
//循环左移
//左右两边同时循环左移相同的位数.
//10010循环左移1位为00101,左移2位为01010
intDES_ROL(ElemTypedata[56],inttimes){
ElemTypetemp[56];//temp只保存将要循环到右边的位.
其他:
评价教师签名:
一、实验原理和目的
DES算法属于分组加密算法,即在明文加密和密文解密过程中,信息都是按照固定长度分组后进行处理的。混淆和扩散是它采用的两个最重要的安全特性。混淆是指通过密码算法使明文和密文以及密钥的关系非常复杂,无法从数学上描述或者统计。扩散是指明文和密钥中的每一位信息的变动,都会影响到密文中许多位信息的变动,从而隐藏统计上的特性,增加密码的安全。
data[cur2+1]=(output&0X04)>>2;//output=7=0111oxo4=0100
data[cur2+2]=(output&0X02)>>1;//相&得到0100右移2位得到1
data[cur2+3]=output&0x01;
}

密码学实验报告(AES,RSA)

密码学实验报告(AES,RSA)

华北电力大学实验报告||实验名称现代密码学课程设计课程名称现代密码学||专业班级:学生姓名:学号:成绩:指导教师:实验日期:[综合实验一] 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}等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

题目:现代密码学实验报告姓名:夏金启学号:20101003933院(系):计算机学院专业:信息安全指导教师:任伟职称:副教授评阅人:职称:2012年12月一古典密码1.1实验原理代换是古典密码中用到的最基本的处理技巧,它在现代密码学中得到了广泛的应用,内容非常的丰富,人们采用代换密码进行加密时并没有固定的模式。

按照一个明文字母是否总是被一个固定的字母代换进行划分时,代换密码可以分为两大类:单表代换密码:对明文消息中出现的同一个字母,在加密时都用同一个固定的字母来代换,不管它出现在什么地方。

移位密码和仿射密码都属于单表代换密码。

多表代换密码:明文消息中出现的同一个字母,在加密时不是完全被同一个固定的字母代换,而是根据其出现的位置次序,用不同的字母代换,如维吉利亚密码和Playfair密码。

1:移位密码明文空间P与密文空间C都是26个英文字母的集合,密钥空间K={0,1,2,…,25}。

在实际进行加密解密运算时,把26个字母依次与0,1,2,…,25对应。

因而也可以说P=C=K={0,1,…,25}=Z。

E={e:Z->Z,e(x)=x+k(mod 26)},即对每个K∈Z,相应的加密变换为ek(m)=m+k(mod 26),其中m∈Z为明文。

D={d:Z->Z,d(x)=x-k(mod 26)},即对密钥k,解密变换为dk(y)=y-k(mod 26),其中y∈Z为密文。

解密之后要把Z中的元素再变换为英文字母。

2:仿射密码明、密文空间与移位密码相同,密钥空间为K={(k1,k2)|k1,k2∈Z,其中gcd(k1,26=1)} gcd表示两个数的最大公因子,gcd(k1,26)=1,即表示k1还26互素。

对任意的k=(k1,k2)∈K,加密变换为e(m)=k1*m+k2*(mod 26).相应的解密变化为d(c)=k1^(-1)*(c-k2)(mod 26),其中:k1*k1^(-1)=1(mod 26).3:维吉利亚密码该密码有一个参数n。

在加解密时同样把英文字母用数字代替进行运算,并按n个字母一组进行变换。

明、密文空间及密钥空间都是n长的字母串的集合,因此可以表示P=C=K=Z^(26).加密变换如下:设密钥k=(k1,k2,…,kn),明文P=(m1,m2,…,mn),加密函数为e(p)=(c1,c2,…,cn),其中Ci=(mi+ki)(mod 26),i=1,2,…,n。

对密文c=(m1,m2,…,mn),密钥k=(k1,k2,…,kn),解密变换为:e(c)=(m1,m2,…,mn),其中m1=(c1-k1)(mod 26),i=1,2,…,n。

其中mi=(ci-ki)(mod 26),i=1,2,…,n。

4:一般的单表代换密码单表代换密码的原理是:以26个字母的集合上的一个置换∏为密钥对明文消息中的每个字母依次进行变换,变换的方法是把明文中的每个字母用它在置换∏下的像去替换。

解密时用∏的逆置换进行替换。

可描述为P=C={0,1,2,…,25}=Z,K={∏:Z->Z|∏是置换}。

密钥∏对应的加密变换e(x)= ∏(x),解密变换为d(y)= ∏^(-1)(y).前面描述的移位密码和仿射密码都是单表代换密码,而维吉利亚密码不是单表代换密码。

5:列置换密码置换密码是把明文中各字符的位置次序重新排列来得到密文的一种密码体制。

列置换密码的加密方法如下:把明文字符以固定的宽度m(分组长度)水平地(按行)写在一张纸上,按1,2,3,…,m的一个置换∏交换列的次序位置,再按垂直方向(按列)读出即得密文。

解密就是就是将密文按照相同的宽度m垂直的写在纸上,按置换∏的逆置换交换列的位置次序,然后水平的读出得到明文,置换∏就是密钥。

.6:周期置换密码周期置换密码是将明文字符按照一定长度m分组,把每组中的字符按1,2,…,m的一个置换∏重排位置次序来得到密文的一种加密方法。

其中的密钥就是置换∏,在∏的描述中包含了分组长度的信息。

解密时,对密文字符按长度m分组,并按∏的逆置换∏^(-1)把每组字符重排位置次序来得到明文。

2.1实验结果实验截图:二Elgamal签名设计1.1课题内容和要求1主要实现的模块包括,计算体系参数,计算密钥,对文件签名,验证签名文件。

该部分可参考前面给出的问题描述再加以细化一些计算体系参数。

随机素数p,用户的私有密钥x,g和x计算得到的整数y,消息m,随机数k。

计算密钥。

公开密钥(p,g,y),私有密钥x对文件签名任何一个给定的消息都可以产生多个有效的ELGamal签名。

验证签名文件验证算法能够将上述多个ELGamal签名中的任何一个当作可信的签名接受。

2设计思路分析ElGamal算法既能用于数据加密也能用于数字签名,其安全性依赖于计算有限域上离散对数这一难题。

3密钥对产生办法首先选择一个素数p,两个随机数, g 和x,g, x < p, 计算y = g^x ( mod p ),则其公钥为y, g 和p。

私钥是x。

g和p可由一组用户共享。

ElGamal用于数字签名。

被签信息为M,首先选择一个随机数k, k与p - 1互质,计算a= g^k ( mod p )再用扩展Euclidean 算法对下面方程求解b:M = xa + kb ( mod p - 1 )签名就是( a, b )。

随机数k须丢弃。

验证时要验证下式:y^a * a^b ( mod p ) = g^M ( mod p )同时一定要检验是否满足1<= a < p。

否则签名容易伪造。

ElGamal签名的安全性依赖于乘法群(IFp)* 上的离散对数计算。

素数p必须足够大,且p-1至少包含一个大素数。

因子以抵抗Pohlig & Hellman算法的攻击。

M一般都应采用信息的HASH值(如SHA算法)。

ElGamal的安全性主要依赖于p和g,若选取不当则签名容易伪造,应保证g对于p-1的大素数因子不可约。

4一般的ElGam数字签名方案在系统中有两个用户A和B,A要发送消息到B,并对发送的消息进行签名。

B收到A发送的消息和签名后进行验证。

2.1系统初始化选取一个大的素数p,g是GF(p)的本原元。

h:GF(p)→GF(p),是一个单向Hash函数。

系统将参数p、g和h存放于公用的文件中,在系统中的每一个用户都可以从公开的文件中获得上述参数。

3.1对发送的消息进行数字签名的过程假定用户A要向B发送消息m [1,p-1],并对消息m签字。

第一步:用户A选取一个x [1,p-1]作为秘密密钥,计算y= (mod p)作为公钥。

将公钥y存放于公用的文件中。

第二步:随机选取k [1,p-1]且gcd(k,(p-1))=1,计算r= (mod p)。

对一般的ElGamal型数字签名方案有签名方程(Signature Equation):ax=bk+c(mod(p-1))。

其中(a,b,c)是(h(m),r,s)数学组合的一个置换。

由签名方程可以解出s。

那么(m,(r,s))就是A 对消息m的数字签名。

第三步:A将(m,(r,s))发送到B4.1数字签名的验证过程当B接收到A发送的消息(m,(r,s)),再从系统公开文件和A的公开文件中获得系统公用参数p,g,h和A的公钥y。

由(m,(r,s))计算出(a,b,c)验证等式:= (mod p)是否成立。

在该部分中叙述每个模块的功能要求或者如何开展此题目的求解?5.1概要设计在此说明每个部分的算法设计说明(可以是描述算法的流程图),每个程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义,如果用面向对象的方法,应该给出类中成员变量和成员函数原型声明)。

整个程序的流程图产生素数p由用户选择素数p的范围,来算出p函数定义为int prime_number_p();产生随机数gg是一个在1-(p-1)中的一个随机数函数为int random_number_g(int p)p是选择的大素数利用随机函数rand()%p来得g。

产生公钥y自定义函数为int PKI_y(int p,int g,int x)P是产生的大素数,g是大素数的生成元,x是私钥计算公式y=g^x(mod p)产生m签名(a,b)自定义函数void elg_sign_develop(int g,int p,int x,int m)g是p的生成元,p是大素数,x是私钥,m是要签名的数据验证签名自定义函数名void elg_sign_test(int y,int p,int m,int g,char name) y是公钥,p是大素数,m是签名的数据,g是大素数的生成元四、详细设计#include<iostream.h>#include <stdlib.h>#include<time.h>int a,b;int prime_number_p();int random(int);int m_develop(int );/*---------------------------------*/int prime(int p){int i,j;for(i=2;i<p;i++){j=p%i;if(j==0)return 0;}return 1;}//判断是否为素数,若为素数则返回1 /*------------------------------------*/int prime_number_max(int n,int m){int p;for(p=m;p>=n;p--){if(prime(p)==1)return p;}}//求出n,m之间的最大素数/*--------------------------------*/int prime_number_p(){int p,m,n;cout<<"为一组用户产生一个公钥P(p为素数)"<<endl;cout<<"请输入p所在范围n,m(系统将选择最大的素数P)"<<endl;cout<<"n=";cin>>n;cout<<"m=";cin>>m;p=prime_number_max(n,m);if(p==0){cout<<"n,m中无素数";p=prime_number_p();}return p;}//p的产生/*-------------------------------*/int Random_number_g(int p){ int g;srand((int) time (NULL));g=rand()%p;return g;}//g的产生int PKI_y(int p,int g,int x) {int y;int i;y=1;for(i=0;i<x;i++){y*=g;y%=p;}return y;}//公钥y的产生int gcd(int a,int b){int s[50],q[50];if(a>b){s[0]=a;s[1]=b;}else{s[0]=a;s[1]=b;}for(int i=1;i<100;i++){s[i+1]=s[i-1]%s[i];q[i]=s[i-1]/s[i];if(s[i+1]==0) break;}return s[i];}//求a,b的最大公约数/*----------------------------------*/int m_develop(int p){int m;cin>>m;if (m>p){cout<<"无法对输入的m进行签名,请重新输入"<<endl;m=m_develop(p);}return m;}int prime_k(int p){int k,i;k=rand()%p;i=gcd(k,p-1);if(i!=1){k=prime_k(p);}return k;}//随即数k的产生/*-----------------------------------*/void elg_sign_develop(int g,int p,int x,int m){int k;int i=1;k=prime_k(p);//产生一个k的随机数,k与p-1互质//a=(g^k)%p;for(i=0;i<k;i++){a*=g;a%=p;}//while(m!=(a*x+k*i)%(p-1))//{i++;}b=i;for(i=0;i<p-1;i++){b=i;if((x*a+k*b)%(p-1)==m) break;}k=0;//丢弃随即数Kcout<<m<<"的数字签名是("<<a<<","<<b<<")"<<endl; }//产生签名/*———————————————————*/void elg_sign_test(int y,int p,int m,int g,char name){int i,c1,d1,j;c1=d1=j=1;//i=((y^a)*(a^b))%p;for(i=0;i<a;i++){c1*=y;c1%=p;}for(i=0;i<b;i++){d1*=a;d1%=p;}d1*=c1;d1%=p;//j=(g^m)%p;for(i=0;i<m;i++){j*=g;j%=p;}if(d1==j){cout<<"是用户"<<name<<"签名的。

相关文档
最新文档