现代密码学实验(题目+代码)
现代密码学实验报告

现代密码学实验报告学生姓名学号专业班级指导教师学院完成时间实验一对称密码算法实验[实验目的]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的解密过程和加密过程相同,只是在解密过程中将子密钥的使用顺序颠倒。
现代密码算法实验报告(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)输出加密后的密文。
现代密码学代码实现

现代密码学代码实现现代密码学是一门研究如何保护信息安全的学科,它涵盖了许多不同的密码算法和协议。
在实际应用中,我们可以使用编程语言来实现这些密码算法和协议。
下面我将从几个常见的现代密码学算法和协议的实现角度来回答你的问题。
1. 对称加密算法:对称加密算法使用相同的密钥进行加密和解密。
常见的对称加密算法包括AES、DES和3DES。
在代码实现中,你需要引入相应的密码库或者模块,然后使用库中提供的函数或方法来进行加密和解密操作。
例如,在Python中,你可以使用`cryptography`库来实现AES加密算法,通过调用库中的函数来进行加密和解密操作。
2. 非对称加密算法:非对称加密算法使用一对密钥,分别是公钥和私钥。
常见的非对称加密算法包括RSA和ECC。
在代码实现中,你需要生成密钥对,并使用公钥进行加密,私钥进行解密。
同样,你需要引入相应的密码库或者模块,然后使用库中提供的函数或方法来进行加密和解密操作。
例如,在Java中,你可以使用`java.security`包来实现RSA算法,通过调用包中的类和方法来进行加密和解密操作。
3. 哈希函数:哈希函数是一种将任意长度的输入映射为固定长度输出的函数。
常见的哈希函数包括MD5、SHA-1和SHA-256。
在代码实现中,你需要引入相应的密码库或者模块,然后使用库中提供的函数或方法来计算哈希值。
例如,在C++中,你可以使用`openssl`库来实现SHA-256哈希函数,通过调用库中的函数来计算哈希值。
4. 数字签名:数字签名是一种用于验证消息完整性和身份认证的技术。
常见的数字签名算法包括RSA和ECDSA。
在代码实现中,你需要生成密钥对,并使用私钥进行签名,使用公钥进行验证。
同样,你需要引入相应的密码库或者模块,然后使用库中提供的函数或方法来进行签名和验证操作。
例如,在C#中,你可以使用`System.Security.Cryptography`命名空间来实现RSA数字签名算法,通过调用命名空间中的类和方法来进行签名和验证操作。
现代密码学 蔡东升

0000实验设计报告课程名称现代密码学课题名称LFSR软件实现专业网络工程班级1202学号201203120234姓名蔡东升指导教师冯剑2014年11 月1日一.实验目的实现简单的线性反馈移位寄存器(LFSR)二.实验内容实验时间2学时,用C\C++语言实现LFSR,并上机调试和运行。
设GF(2)上的4级LFSR的反馈函数为f(a1,a2,a3,a4)=a1⊕a2,试以软件方式实现该移位寄存器。
记录输入输出数据,观察输入状态为(a1a2a3a4)=(0100)、(a1a2a3a4)=(1000)的输出序列和周期。
三.实验要求(1)写出源程序,并编译运行(2)详细记录程序调试及运行结果(3)写出算法流程图,程序计算结果四.软件流程图五.实验结果与分析实现LFSR的C代码初始状态为(0 1 0 0)时对应的输出序列(下图)可以看出周期为15初始状态为(1 0 0 0)时对应的输出序列(下图)可以看出周期为15六.实验源代码#include<stdio.h>#include<stdlib.h>#include<string.h>main(){int a,b,c,d,k,t;printf("请输入初始状态a1 a2 a3 a4");scanf("%d%d%d%d",&a,&b,&c,&d);for(k=1;k<60;k++){t=(a+b)%2;printf("%d",a);a=b;b=c;c=d;d=t;}getchar();}七.心得体会。
本次实验,其目的是用软件实现简单的线性移位寄存器LFSR,源代码并不难。
我定义了abcd四个整型数据来充当存储器通过交替赋值来实现移位的功能。
然后当我观察线性移位寄存器的输出序列时,我发现不论初始数据如何变化,它的周期总是固定的15,更改线性函数时,周期便发生了变化。
现代密码学-古典密码-实验报告

现代密码学实验报告院系:理学院班级:信安二班姓名:学号:前言密码学(Cryptology)是研究秘密通信的原理和破译秘密信息的方法的一门学科。
密码学的基本技术就是对数据进行一组可逆的数学变换,使未授权者不能理解它的真实含义。
密码学包括密码编码学(Cryptography)和密码分析学(Cryptanalyst)两个既对立又统一的主要分支学科。
研究密码变化的规律并用之于编制密码以保护信息安全的科学,称为密码编码学。
研究密码变化的规律并用之于密码以获取信息情报的科学,称为密码分析学,也叫密码破译学。
密码学在信息安全中占有非常重要的地位,能够为信息安全提供关键理论与技术。
密码学是一门古老而深奥的学问,按其发展进程,经历了古典密码和现代密码学两个阶段。
现代密码学(Modern Cryptology)通常被归类为理论数学的一个分支学科,主要以可靠的数学方法和理论为基础,为保证信息的机密性、完整性、可认证性、可控性、不可抵赖性等提供关键理论与技术。
古典密码算法实验在密码编码体制中有两种基本也是古老的编码体制一直沿用至今,它们是代替密码和置换密码,其历史悠久并且是现代密码体制的基本组成部分,在密码学中占有重要地位。
古典密码是密码学发展的一个阶段,也是近代密码学产生的渊源,一般把Shannon 在1949 年发表“保密系统的通信理论”之前的时期称为古典密码时期。
尽管古典密码大多比较简单,一般可用手工或机械方式实现,且都可用统计分析方法破译,目前已很少采用。
但是,古典密码所采用的代替技术和置换技术仍然是现代分组密码算法设计的基础,了解它们的设计原理,有助于理解、设计和分析现代密码。
一、实验目的通过编程实现经典的代替密码算法和置换密码,包括移位密码、维吉尼亚密码、周期置换密码、列置换密码,加深对代替技术的了解,为现代分组密码实验奠定基础。
二、实验原理代替(Substitution)是古典密码中基本的处理技巧,就是将明文字母由其他字母表中的字母替换的一种方法。
密码学实验报告(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}等。
现代密码学实验(题目代码).doc

****大学学生实验报告实验课程名称现代密码学学院** 年级** 专业班*********学生姓名******* 学号********开课时间200- 至200- 学年第二学期(2)仿射变换加/解密程序对一段较长的英文文章进行加密下面是文本内容:实验项目名称实验二、流密码(认识LFSR及流密码)成绩一、实验目的通过实现简单的线性反馈移位寄存器(LFSR),理解LFSR的工作原理、本原多项式重要意义。
二、实验内容1)利用C\C++语言实现LFSR(其中LFSR已给定);2)通过不同初始状态生成相应的序列,并观察他们的周期有什么特点;3)利用生成的序列对文本进行加/解密(按对应位作模2加运算)。
其中的LFSR为:三、实验步骤#include<iostream>#include<vector>#include<cmath>#include<fstream>using namespace std;void main(){///下面是密钥的产生/////////////int a[31]={1,1,0,0,1};for(int k=5;k<31;++k)a[k]=(a[k-2]+a[k-5])%2;cout<<"密钥如下:"<<endl;for(int jj=0;jj<31;++jj)cout<<a[jj]<<' ';elsei=i+8;s.push_back((int(c))^sum);}for(int kk=0;kk<s.size();++kk) {out<<char(s[kk]);}}////////////}elsecout<<"操作无效!"<<endl;}四、实验结果及分析在“in.txt”中输入如下内容:实验结果如下:得到密文“out.txt”如下:for(int j=0;cypher[j]!='\0';j++){cyph[j]=cypher[j]^b[j];cout<<cyph[j];}cout<<endl;for(int k=0;k<j;k++){cypher[k]=cyph[k]^b[k];cout<<cypher[k];}cout<<endl;}int main(int argc, char* argv[]){unsigned char buf[10],buf1[10],buf2[10],b[100],c[100];// 函数f 初始状态152lfsr_output_byte(5,(unsigned char)144,(unsigned char)152, buf, 10);lfsr_output_byte(5,(unsigned char)44,(unsigned char)152, buf1, 10);lfsr_output_byte(5,(unsigned char)24,(unsigned char)152, buf2, 10);Geffe(buf,buf1,buf2,b);c[0]=0;JK(buf,buf1,c);cout<<endl;cout<<"Geffe operate:"<<endl;cypt(b);cout<<endl;cout<<"J-K operate:"<<endl;cypt(c);return 0;}四、实验结果及分析if(pDest == NULL){break;}else{int iPos = (int)(pDest - szLast7Chars + 1);if(iPos != 7 - i){break;}else{szLast7Chars[6-i]='\0';continue;}}}memcpy(szFPlaintextAnyLength + strlen(szFPlaintextAnyLength) - 7,szLast7Chars,7); }#include <stdio.h>#include "yxyDES.h"int main(){yxyDES* my_des = new yxyDES();char temp[32] = {0};my_des->InitializeKey("12345678");printf("key is : 12345678 \n");my_des->EncryptAnyLength("yxyDES_test");printf("set plaintext : yxyDES_test \n");printf("after encrypt : %s \n",my_des->GetCiphertextAnyLength());printf("now,decrypting...\n");string test_ciphertext = my_des->GetCiphertextAnyLength();my_des->DecryptAnyLength(test_ciphertext);printf("after decrypt : %s \n",my_des->GetPlaintextAnyLength());return 0;}四、实验结果及分析a[i]=quickindex1(c[i],e,n);cout<<a[i]<<" ";}cout<<endl<<"解密:";//解密过程for(int j=0;a[j]!='\0';j++){b[j]=quickindex1(a[j],d,n);cout<<b[j]<<" ";}cout<<endl;}四、实验结果及分析。
JNU现代密码学实验1

暨南大学本科实验报告专用纸课程名称现代密码学实验成绩评定实验项目名称古典密码算法指导教师许鹏实验项目编号实验一实验项目类型实验地点实B404一.C aesar(恺撒)密码实验原理:Caesar密码是传统的代替加密法,当没有发生加密(即没有发生移位)之前,其置换表如表1所示。
表1 Caesar置换表加密时每一个字母向前推移k位,例如当k=5时,置换表如表2所示。
表2 Caesar置换表于是对于明文:data security has evolved rapidly经过加密后就可以得到密文:IFYF XJHZWNYD MFX JATQAJI WFUNIQD若令26个字母分别对应整数 0 ~ 25,如表3所示。
表3 Caesar置换表则Caesar加密变换实际上是:c = (m + k) mod 26其中m是明文对应的数据,c是与明文对应的密文数据,k是加密用的参数,也称为密钥。
很容易得到相应的Caesar解密变换是:m = D(c) = (c – k) mod 26例如明文:data security 对应的数据序列:3 0 19 0 184 2 20 17 8 19 24当k = 5时经过加密变换得到密文序列:8 5 24 5 23 9 7 25 22 13 24 3对应的密文为:I F Y F X J H Z W N Y D实验步骤:本练习主机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密码”。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
unsigned char temp = (unsigned char)0; for(int j=0; j< 8; j++) {
temp = temp | ( (next_state & (unsigned char)128) >> j );
(ciphertext)、加密密钥(encryption key)、解密密钥(decryption key)、加密算法(encryption algorithm)、解密算法(decryption algorithm)等。
二、实验内容 1)用 C\C++语言实现仿射变换(Affine)加/解密算法;2)用 C\C++语言实现统计 26
if((a<1||a>25)||(b<0||b>25)) cout<<"a,b 的输入范围有错!"<<endl;
else if(gcd(a)==0) cout<<"密钥 a 有误,与 26 不互素"<<endl; else { if(z==0)////加密算法 { ifstream in("a.txt"); ofstream out("b.txt"); vector<int> s; for(char x;in>>x; ) s.push_back(int(x)); for(int i=0;i<s.size();++i) { s[i]=(a*(s[i]-97)+b)%26; out<<char(s[i]+97)<<' '; }out<<endl;cout<<"加密成功!明文请见“b.txt”"<<endl; } else////解密算法 { ifstream in("b.txt"); ofstream out("a.txt"); vector<int> s; for(char x;in>>x; ) s.push_back(int(x)); for(int i=0;i<s.size();++i) { s[i]=inv(a)*(s[i]-97-b+26)%26; out<<char(s[i]+97)<<' '; }out<<endl;cout<<"解密成功!密文请见“a.txt”"<<endl;
三、实验步骤
#include <iostream> using namespace std;
//return next state unsigned char fn_feedback(unsigned char n,
unsigned char c, unsigned char curr_state) { unsigned char t = c & curr_state; unsigned char s = t & (unsigned char)128;//get first bit for(int i =1; i< n; i++) { s = s ^ ( (t << i) & (unsigned char)128 ); } return (unsigned char)((curr_state << 1) | (s >> (n-1))); //return next state }
实验报告
实验课程名称
现代密码学
学
院 理学院 年级 大三 专业班 信科 0802
学 生 姓 名 王尔林 学 号
200810010210
开 课 时 间 2010 至 2011 学年第 二 学期
总成绩 教师签名
实验项目 名称
成绩
实验一、古典密码(认识密码学)
一、实验目的 通过实现简单的古典密码算法,理解密码学的相关概念如明文(plaintext)、密文
next_state = fn_feedback(n, c, next_state); } output_bytes[i] = temp; } }
//output a char type of data in binary way void output_binary(unsigned char c) {
} } //////////////////////////////////////// } else cout<<"所选操作无效!"<<endl; }
}四、实验结果及分析
该程序是对文件进行操作,结果如下:
(1) 统计 26 个英文字母出现的频率的程序
(2) 仿射变换加/解密程序对一段较长的英文文章进行加密
int f=26,g,r; g=a; do{
r=f%g; f=g; g=r; }while(r); if(f==1) return 1; else return 0; } //////////////////求逆////// int inv(int a){ int x,i; for(i=1;i<=30;++i) if((26*i+1)%a==0) {
下面是文本内容:
实验项目 名称
成绩
实验二、流密码(认识 LFSR 及流 密码)
一、实验目的 通过实现简单的线性反馈移位寄存器(LFSR),理解 LFSR 的工作原理、本
原多项式重要意义。
二、实验内容 1)利用 C\C++语言实现 LFSR(其中 LFSR 已给定);2)通过不同初始状
态生成相应的序列,并观察他们的周期有什么特点;3)利用生成的序列对文本 进行加/解密(按对应位作模 2 加运算)。
a[k]=(a[k-2]+a[k-5])%2; cout<<"密钥如下:"<<endl; for(int jj=0;jj<31;++jj)
cout<<a[jj]<<' '; cout<<endl;
////////////////////// int i=0,key; cout<<"请选择操作方式: 1-加密 cin>>key; vector<int> s,ss; if(key==1||key==2) {
cout<<"解密成功,明文见 in.txt"<<endl; ifstream in("out.txt"); ofstream out("in.txt");
char c; while(in>>c)
{ int sum=0; for(int j=0;j<8;++j) sum+=pow(2,7-j)*a[(i+j)%31]; if(i+j>32) i=(i+j-1)%31+1; else
float sum=0.0; for(int j=0;j<26;++j) sum+=n[j]; cout<<"统计结果如下:"<<endl; for(int k=0;k<26;++k){
// n[k]=n[k]/sum; cout<<' '<<char(k+97)<<"出现的概率为:"<<n[k]/sum<<endl; //cout<<n[k]<<endl;
int z; cin>>z; if(z==0||z==1) { ////////////////////////////////////////// cout<<"请输入密钥 a 和 b:"<<endl; int a,b; cin>>a>>b;
0 — 表 示 加 密 "<<endl<<"
1—表示解密
i=i+8; s.push_back((int(c))^sum); } for(int kk=0;kk<s.size();++kk) { out<<char(s[kk]); } } //////////// } else cout<<"操作无效!"<<endl; } 四、实验结果及分析
在“in.txt”中输入如下内容:
x=(26*i+1)/a;break;} return x; }////////////////////////////////////////////////////////// void main(){
cout<<" 请 你 选 择 操 作 密 码 的 方 式 :"<<endl<<" "<<endl;
2-解密"<<endl;
if(key==1) { cout<<"加密成功,密文见 out.txt"<<endl;
ifstream in("in.txt"); ofstream out("out.txt"); char c;