当前位置:文档之家› DES加密解密算法的实现(Java基本要求)

DES加密解密算法的实现(Java基本要求)

DES加密解密算法的实现(Java基本要求)
DES加密解密算法的实现(Java基本要求)

成都信息工程学院课程设计报告

DES加密解密算法的实现(Java)

课程名称:应用密码算法程序设计

学生姓名:李文浩

学生学号: 2007122054

专业班级:信安072班

任课教师:万武南

2009年 11 月 11 日

附件:课程设计成绩评价表

目录

1.引言 (1)

1.1 背景 (1)

1.2 目的 (1)

1.3 本设计的主要任务 (1)

2.系统设计 (2)

2.1系统主要目标 (2)

2.1.1主要软件需求(运行环境) (2)

2.2 系统结构 (2)

2.2.2 软件操作流程 (2)

2.2.3功能模块 (3)

3 系统功能程序设计 (3)

3.1循环移位 (3)

3.2获取RoundKey (4)

3.3 IP置换,逆置换,E扩展,置换P (5)

3.4 Fnew函数(F函数) (5)

3.5异或 (7)

3.6 S盒代替 (7)

3.7十六进制转二进制 (7)

3.8二进制转十六进制 (8)

3.9加密 (9)

3.10解密 (9)

3.11程序界面预览 (10)

4. 测试报告 (11)

5.结论 (14)

参考文献 (14)

1.引言

1.1 背景

数据加密标准(Data Encryption Standard,,DES)曾被美国国家标准局(NBS,现为国家标准与技术研究所NIST)确定为联邦信息处理标准(FIPS PUB 46),得到过广泛使用,特别是在金融领域,曾是对称密码体制事实上的世界标准。目前在国内,随着三金工程尤其是金卡工程的启动,DES算法在POS,A TM,智能卡,加油站,高速公路收费站等领域被广泛使用,以此来实现关键数据加密,如信用卡持卡人的PIN的加密传输,IC卡与POS间的双向认证、金融交易数据包的MAC校验等,均用到DES算法。

DES起源于1973年美国国家标准局NBS征求国家密码标准方案。IBM就提交了其在20世纪60年代末设立的一个计算机密码编码学方面的研究项目的结果,这个项目在1971年结束时研制出了一种称为Lucifer算法。它是当时提出来的最好的算法,因而在1977年被选为数据加密标准,有效期为5年,随后在1983年、1987年、和1993年三次再度授权该算法续用5年。

DES使用一个56位的密钥以及附加的8位奇偶校验位,产生最大64位的分组大小。这是一个迭代的分组密码,使用称为Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用16 个循环。

1.2 目的

在一些特殊场合,人们交换信息并不希望被其他人知道,需要把消息进行一系列转换后在公共信道中传输,接收方再通过一些手段将消息转换回来,本程序用DES对称密钥加密算法加解密一组长度为64bit的十六进制数,达到保密传递信息的目的.

1.3 本设计的主要任务

根据DES加密算法实现一组长度为64bit的十六进制数加密解密。向用户提供良好的交互,具有良好的操作性。可完成一个明文分组的加解密,明文和密钥是十六进制,长度都为64比特(16个16进制数),输入明文和密钥,输出密文,进行加密后,能够进行正确的解密;程序运行时,要求输出每一轮使用的密钥,以及每一轮加密或解密之后的16进制表示的值。

2.系统设计

2.1系统主要目标

2.1.1主要软件需求(运行环境)

本软件适用java语言编写,编译成功后的.class文件可以在装有JDK开发环境的任何计算机上使用。本软件设计符合DES程序设计基本要求:

(1)在深入理解DES加密/解密算法理论的基础上,设计一个DES加密/解密软件系统;

(2)完成一个明文分组的加解密,明文和密钥是十六进制,长度都为64比特(16个16进制数),输入明文和密钥,输出密文,进行加密后,能够进行正确的解密;

(3)程序运行时,要求输出每一轮使用的密钥,以及每一轮加密或解密之后的16进制表示的值;

(4)要求提供所设计系统的报告及完整的软件。

输入:

加密:8字节定长的十六进制明文(16个十六进制数)。

解密:8字节定长的十六进制密文(16个十六进制数)。

输出:

加密:8字节定长的十六进制已加密的密文(16个十六进制数)。

解密:8字节定长的十六进制的正常解密的明文(16个十六进制数)。

测试平台:Windows Vista Home Basic/Windows XP Professional

2.2 系统结构

2.2.2 软件操作流程

加密:

(1)按提示选择“1”进行加密过程,程序将正常执行下面的加密过程。

(2)按提示输入你加密所需要的长度为16个十六进制的密钥。

(3)按提示输入你要加密的长度为16个十六进制的明文。

(4)加密后,每轮加密结果和最终加密结果(即密文)将显示给用户。

解密:

(1)按提示选择“0”进行解密过程,程序将正常执行下面的解密过程。

(2)按提示输入你解密所需要的长度为16个十六进制的密钥。

(3)按提示输入你要解密的长度为16个十六进制的密文。

(4)解密后,每轮解密的结果和最终解密出的明文将显示给用户。

2.2.3功能模块

3 系统功能程序设计

3.1循环移位

实现循环移位,由于DES算法涉及到得只有循环左移一位或者两位,我考虑用穷举的方法,因为只有两种情况,因此用if条件语句判断每轮循环的位数。我定义了4个中间变量co,do,c1,d1存放中间结果。

V oid LwhDES::LeftBitMove(int[] k, int offset)

{

int i;

// 循环移位操作函数

int[] c0 = new int[28];

int[] d0 = new int[28];

int[] c1 = new int[28];

int[] d1 = new int[28];

for (i = 0; i < 28; i++){

c0[i] = k[i];

d0[i] = k[i + 28];

}

if (offset == 1) {

for (i = 0; i < 27; i++) { // 循环左移一位

c1[i] = c0[i + 1];

d1[i] = d0[i + 1];

}

c1[27] = c0[0];

d1[27] = d0[0];

}

else if (offset == 2) {

for (i = 0; i < 26; i++) { // 循环左移两位

c1[i] = c0[i + 2];

d1[i] = d0[i + 2];

}

c1[26] = c0[0];

d1[26] = d0[0];

c1[27] = c0[1];

d1[27] = d0[1];

}

for (i = 0; i < 28; i++) {

k[i] = c1[i];

k[i + 28] = d1[i];

}

}

3.2获取RoundKey

生成轮子密钥前调用了PC1变换函数,循环过程中调用了循环移位函数和PC2变换函数,最终生成了KeyArray[16][48]的轮子密钥。

int[][] LwhDES::KeyInitialize(int[] key)

{

int i;

int j;

int[][] keyarray=new int[16][48];

int[] K0 = new int[56];

for (i = 0; i < 56; i++) {

K0[i] = key[PC_1[i] - 1]; // 密钥进行PC-1变换

}

for (i = 0; i < 16; i++) {

LeftBitMove(K0, LeftMove[i]);

for (j = 0; j < 48; j++) {

keyarray[i][j] = K0[PC_2[j] - 1]; // 生成子密钥keyarray[i][j]

}

}

return keyarray;

}

3.3 IP置换,逆置换,E扩展,置换P

置换使用的是简单的查表置换,table置换,即将输出的数据与输入的数据相应的数组的对应项查出来。

IP置换:

for (i = 0; i < 64; i++)

{

M[i] = timeData[IP[i] - 1]; // 明文IP变换,IP[]为IP置换表

……}

IP逆置换:

for (i = 0; i < 64; i++)

{

MIP_1[i] = M[IP_1[i] - 1]; // 进行IP-1运算,IP_1[]为IP逆置换表

……}

E扩展:

for (i = 0; i < 48; i++) {

RE[i] = R0[E[i] - 1]; // 经过E变换扩充,由32位变为48位}

置换P:

for (i = 0; i < 32; i++)

{

RP[i] = sV alue[P[i] - 1]; // 经过P变换,P[]为P置换表

……}

3.4 Fnew函数(F函数)

F函数为该加密程序最关键的地方,里面涉及到E扩展,与密钥异或,S盒压缩,P置换,每轮都要使用此函数,此函数编写的好坏很大程度上影响整个程序的执行效率。注意,此处的Fnew函数与标准F函数略有不同,Fnew函数将F函数后Lo,Ro的异或和换位都已经实现。

V oid LwhDES::private void LoopF(int[] M, int times, int flag, int[][] keyarray)

{

int i,j;

int[] L0 = new int[32];int[] R0 = new int[32];int[] L1 = new int[32];int[] R1 = new int[32];

int[] RE = new int[48]; //存放经过E扩展的消息

int[][] S = new int[8][6]; //存放成8行六列,以便进行S盒压缩

int[] sBoxData = new int[8]; //每一行查出的数

int[] sV alue = new int[32]; //

int[] RP = new int[32]; //经过置换P的数

for (i = 0; i < 32; i++) {

L0[i] = M[i]; // 明文左侧的初始化

R0[i] = M[i + 32]; // 明文右侧的初始化

}

for (i = 0; i < 48; i++) {

RE[i] = R0[E[i] - 1]; // 经过E变换扩充,由32位变为48位

RE[i] = RE[i] + keyarray[times][i]; // 与KeyArray[times][i]按位作不进位加法运算

if (RE[i] == 2) { //与48位密钥异或

RE[i] = 0;

}

}

for (i = 0; i < 8; i++) { // 48位分成8组

for (j = 0; j < 6; j++) { /每组六位

S[i][j] = RE[(i * 6) + j];

}

// 下面经过S盒,得到8个数

sBoxData[i] = S_Box [i] [(S[i][0] << 1) + S[i][5]] [ (S[i][1] << 3) + (S[i][2] << 2) + (S[i][3] << 1) + S[i][4] ];

// 8个数变换输出二进制

for (j = 0; j < 4; j++) {

sV alue[((i * 4) + 3) - j] = sBoxData[i] % 2; //从右边一位一位的取数存放

sBoxData[i] = sBoxData[i] / 2;

}

}

for (i = 0; i < 32; i++) {

RP[i] = sV alue[P[i] - 1]; // 经过P变换

L1[i] = R0[i]; // 右边移到左边

R1[i] = L0[i] + RP[i];

if (R1[i] == 2) { //异或

R1[i] = 0;

}

// 重新合成M,返回数组M

// 最后一次变换时,左右不进行互换。此处采用两次变换实现不变

if (((flag == 0) && (times == 0)) || ((flag == 1) && (times == 15)))

{

M[i] = R1[i];

M[i + 32] = L1[i];

}

else

{

M[i] = L1[i];

M[i + 32] = R1[i];

}}}

3.5异或

Java语言我使用” ^ ”符号进行异或,结果没有成功,于是利用循环实现各个位相加,再每位检查,若等于2,则置为0。

for (i = 0; i < 48; i++) { ……

RE[i] = RE[i] + keyarray[times][i]; // 两个数进行不进位加法

if (RE[i] == 2) //若加出的结果为2则置为0,实现了异或

{

RE[i] = 0;

}}

3.6 S盒代替

S盒替换采用了将48个bit数先分为8组,每一组对应一个S盒,再通过行列计算查出S表里的十进制值,再转化为二进制。

int[] RE = new int[48];

int[][] S = new int[8][6];

int[] sBoxData = new int[8];

int[] sV alue = new int[32];

for (i = 0; i < 8; i++) // 48位分成8组

{

for (j = 0; j < 6; j++) //每组6位

{

S[i][j] = RE[(i * 6) + j];

}

// 下面经过S盒,得到8个数

sBoxData[i] = S_Box[i] [(S[i][0] << 1) + S[i][5]] [ (S[i][1] << 3) + (S[i][2] << 2) + (S[i][3] << 1) + S[i][4] ];

// 8个数变换输出二进制

for (j = 0; j < 4; j++)

{

sV alue[((i * 4) + 3) - j] = sBoxData[i] % 2;

sBoxData[i] = sBoxData[i] / 2;

}

}

3.7十六进制转二进制

本函数主要用于十六进制数向二进制数的转换,十六进制数只有十六种情况,本程序使用穷举方法,利用switch、case语句实现十六进制对二进制的转换,避免移位出现不可预计的错误。

int[] LwhDES::changeHtoB(String s) //实现十六进制到二进制的转换;

{

int [] Message=new int[64];

StringBuffer buf = new StringBuffer();

String str=s;

String message="";

int i,j;

for(i=0;i

{

char ch=str.charAt(i);

switch(ch){

case '0' : message = "0000"; break; case '1' : message = "0001"; break;

case '2' : message = "0010"; break; case '3' : message = "0011"; break;

……

case 'e' : message = "1110"; break; case 'f' : message = "1111"; break;

default: break;

}

buf=buf.append(message);

}

//System.out.print(buf);

for(j=0;j<64;j++)

{

if (buf.charAt(j)=='0')

{ Message[j]=0; }

else Message[j]=1;

}

return Message;

}

3.8二进制转十六进制

本函数主要用于将结果二进制数转换成十六进制向用户输出,实现二进制转十六进制数,即4个bool型变量转化为一个十六进制数,先将bool流写入StringBuffer,再调用toString 转化成字符串,对字符串进行取子串,再调用Integer.toHexString方法转换为十六进制。

String LwhDES::changeBtoH(int[] data)

{ //实现二进制到十六进制的转换;

StringBuffer buf=new StringBuffer();

String s=new String();

for(int i=0;i

{

if(data[i]==0) buf.append('0');

else if(data[i]==1) buf.append('1');

}

String string=buf.toString(); //形成一个全是bool变量(0或1)的字符串

int temp=0;

StringBuffer outputbuf=new StringBuffer();

String s1=string.substring(0,data.length);

for(int i=0;i

{

temp=Integer.valueOf( s1.substring(i*4,(i+1)*4) , 2 );

outputbuf=outputbuf.append(Integer.toHexString(temp));

}

//System.out.print(outputbuf);

s=outputbuf.toString();

return s;

}

3.9加密

加密过程其实就是调用以写好的模块,对消息进行16次迭代加密,但在每一轮中要进行中间一些加密结果的显示,又因为加密和解密我写在了同一个Encrypt函数里,因此只用标志位flag区别加解密,1为加密,0为解密。

int[] LwhDES::Encrypt(int[] timeData, int flag, int[][] keyarray)

{

int i;

int flags = flag;

int[] M = new int[64];

int[] MIP_1 = new int[64];

for (i = 0; i < 64; i++)

{

M[i] = timeData[IP[i] - 1]; // 明文IP变换

}

if (flags == 1)

{ // 加密

for (i = 0; i < 16; i++)

{

Fnew(M, i, flags, keyarray); //注意,LoopF函数将每轮迭代运算的Li=Ri-1, //Ri=Li-1^F(Ri-1,Ki)一起写了进去

……//显示中间结果

}

}

3.10解密

解密过程与加密相逆,其实也是调用写好的模块,对密文进行16次迭代解密,但在每一轮中要进行中间一些加密结果的显示,又因为加密和解密我写在了同一个Encrypt函数里,因此只用标志位flag区别加解密,1为加密,0为解密。

int[] LwhDES::Encrypt(int[] timeData, int flag, int[][] keyarray)

{

else if (flags == 0)

{ // 解密

for (i = 15; i > -1; i--)

{

Fnew(M, i, flags, keyarray); //关键的解密步骤,下面代码都是为显示中间结果

int n,j;

int [] k=new int[48];

System.out.println("第" + (16-(i+1)) +"轮输出的密文的十六进制形式:");

System.out.println(changeBtoH(M));

for(j=0;j<48;j++)

{

k[j]=keyarray[i][j];

}

System.out.println("第" + (16-(i+1)) +"轮输出的轮子密钥十六进制形式:");

System.out.println(changeBtoH(k));

}

}}

3.11程序界面预览

在命令行窗口进行操作,界面比较友好,易于操作,下图为开始界面:

图1

4. 测试报告

(1) 对十六进制数加密

明文:31 32 33 34 35 36 37 38

密钥:31 32 33 34 35 36 37 38

密文:96 d0 02 88 78 d5 8c 89

解密后的明文: 31 32 33 34 35 36 37 38

选择加密初始化明文和密钥:

图2 加密结果与标准一致:

图3

图4 对密文进行直接解密,得出正确的结果:

图5

图6

(2) 对十六进制数解密

明文:96 d0 02 88 78 d5 8c 89

密钥:31 32 33 34 35 36 37 38

密文:31 32 33 34 35 36 37 38

经过检测:

1.本软件符合DES基本要求,能对16个十六进制数进行正常的加密和解密,加密和解密结果没有错误,并能显示每轮加密的中间结果。

2.对于错误的输入,能以提示性语言加以提示。

3.没有发现导致致命错误的操作方法。

5.结论

本软件可以实现DES加密解密算法的基本要求,可以正确地对8个字节的明文进行加密,或者对8个字节的密文进行正常的解密。通过本次的课程,我对DES的算法有了进一步深入的了解,深刻了解了DES加密的每轮迭代过程,对简单的异或,移位有了更深的了解,灵活运用可以实现许多功能,通过对DES算法的异或,置换,查S盒压缩等方便的编写,对java 语言编程有了更深刻的掌握,比如编写异或事由于没查到Java语言中异或的运算符,我就简单的使用各位相加后,若为2则置为零来代替。本来希望使用c++实现DES加密解密算法,虽然能正常加解密,但是中间过程输出结果与标准有差异,而且,由于Java中String, StringBuffer提供许多方法,使程序比C++方便的实现了十六进制的转换问题。

参考文献

[1] 胡向东、魏琴芳,应用密码学,电子工业出版社,2008

[2] Mary Campione,语言导学,机械工业出版社,2003

[3] 孙卫琴,Java面向对象编程,电子工业出版社,2006

[4] (美)埃克尔,Java编程思想,机械工业出版社,2007

DES加密算法的实现

常州工学院 计算机信息工程学院 《数据结构》课程设计报告 题目 DES加密算法的实现 班级 14软一 学号姓名王磊(组长) 学号姓名王凯旋 学号姓名陶伟 2016年01月06日

一,实验名称: DES加密算法的实现 二,实验内容: a)熟悉DES算法的基本原理; b)依据所算则的算法,编程实现该该算法; c)执行程序并分析结果; 三,实验原理 1,概述 DES是一种分组加密算法,他以64位为分组对数据加密。64位一组的明文从算法的一端输入,64位的密文从另一端输出。DES是一个对称算法:加密和解密用的是同一个算法(除密钥编排不同以外)。密钥的长度为56位(密钥通常表示为64位的数,但每个第8位都用作奇偶检验,可以忽略)。密钥可以是任意的56位数,且可以在任意的时候改变。 DES算法的入口参数有3个: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的输出结果。

2,DES算法详述 DES算法把64位的明文输入块变为64位的密文输出块,他所使用的密钥也是64位,DES对64 位的明文分组进行操作。通过一个初始置换,将明文分组分成左半部分和右半部分,各32位长。然后进行16轮相同的运算,这些相同的运算被称为函数f,在运算过程中数据和密钥相结合。经过16轮运算后左、右部分在一起经过一个置换(初始置换的逆置换),这样算法就完成了。 (1)初始置换 其功能是把输入的64位数据块按位重新组合,并把输出分为L0,R0两部分,每部分各长32位, 即将输入的第58位换到第1位,第50位换到第2位,…,依次类推,最后一位是原来的第7位,L0,R0则是换位输出后的两部分,L0是输出的左32位,R0是右32位。。 (2)逆置换 经过16次迭代运算后,得到L16,R16,将此作为输入进行逆置换,即得到密文输出。逆置换正好是初始置换的逆运算。例如,第1位经过初始置换后,处于第40位,而通过逆置换,又将第40位换回到第1位。 (3)函数f(Ri,Ki)的计算 “扩展置换”是将32位放大成48位,“P盒置换”是32位到32位换位, 在(Ri,Ki)算法描述图中,选择函数功能是把6 b数据变为4 b数

DES加密算法的JAVA实现

目录 摘要 (3) 一、目的与意义 (4) 二、DES概述 (5) 三、DES加解密算法原理 (7) 1.加密 (6) 2.子密钥生成 (11) 3.解密 (13) 四、加解密算法的实现 (14) 1.软件版本 (14) 2.平台 (14) 3.源代码 (14) 4.运行结果 (24) 五、总结 (25)

【摘要】1973年5月15 日,美国国家标准局(现在的美国国家标准就是研究所,即NIST)在联邦记录中公开征集密码体制,这一举措最终导致了数据加密标准(DES)的出现,它曾经成为世界上最广泛使用的密码体制。DES由IBM开发,它是早期被称为Lucifer体制的改进。DES在1975年3月17日首次在联邦记录中公布,在经过大量的公开讨论后,1977年2月15日DES被采纳为“非密级”应用的一个标准。最初预期DES作为标准只能使用10~15年;然而,事实证明DES要长寿得多。被采纳后,大约每隔5年就被评审一次。DES的最后一次评审是在1999年1月。 本文阐述了DES发展现状及对网络安全的重要意义,并在此基础上对DES算法原理进行详细的介绍和分析。通过应用DES算法加解密的具体实现,进一步加深对DES算法的理解,论证了DES算法具有加密快速且强壮的优点,适合对含有大量信息的文件进行加密,同时分析了DES算法密钥过短(56位)所带来的安全隐患。 【关键词】DES 加密解密明文密文

一、目的与意义 随着计算机和通信网络的广泛应用,信息的安全性已经受到人们的普遍重视。信息安全已不仅仅局限于政治,军事以及外交领域,而且现在也与人们的日常生活息息相关。现在,密码学理论和技术已得到了迅速的发展,它是信息科学和技术中的一个重要研究领域。在近代密码学上值得一提的大事有两件:一是1977年美国国家标准局正式公布实施了美国的数据加密标准(DES),公开它的加密算法,并批准用于非机密单位及商业上的保密通信。密码学的神秘面纱从此被揭开。二是Diffie和Hellman联合写的一篇文章“密码学的新方向”,提出了适应网络上保密通信的公钥密码思想,拉开了公钥密码研究的序幕。 DES(Data Encryption Standard)是IBM公司于上世纪1977年提出的一种数据加密算法。在过去近三十年的应用中,还无法将这种加密算法完全、彻底地破解掉。而且这种算法的加解密过程非常快,至今仍被广泛应用,被公认为安全的。虽然近年来由于硬件技术的飞速发展,破解DES已经不是一件难事,但学者们似乎不甘心让这样一个优秀的加密算法从此废弃不用,于是在DES的基础上有开发了双重DES(DoubleDES,DDES)和三重DES(Triple DES,TDES)。 在国内,随着三金工程尤其是金卡工程的启动,DES 算法在POS、ATM、磁卡及智能卡(IC 卡)、加油站、高速公路收费站等领域被广泛应用,以此来实现关键数据的保密,如信用卡持卡人的PIN 码加密传输,IC 卡与POS 间的双向认证、金融交易数据包的MAC 校验等,均用到DES 算法。DES加密体制是ISO颁布的数据加密标准。 因此研究DES还是有非常重要的意义。

DES加密算法设计(含程序)

DES加密算法分析 [摘要]DES数据加密算法是使用最广的分组加密算法,它作为最著名的保密密钥或对称密钥加密算法,在计算机密码学及计算机数据通信的发展过程中起了重要作用。本次学年论文是主要是学习介绍DES对 称密钥数据加密算法,并用c++实现。DES算法具有较高的安全性,为我们进行一般的计算机数据传输活 动提供了安全保障。 [关键词] 加密与解密,DES算法,S-盒 引言 密码学是伴随着战争发展起来的一门科学,其历史可以追溯到古代,并且还有过辉煌的经历。但成为一门学科则是近20年来受计算机科学蓬勃发展的刺激结果。今天在计算机被广泛应用的信息时代,信息本身就是时间,就是财富。如何保护信息的安全(即密码学的应用)已不再局限于军事、政治和外交,而是扩大到商务、金融和社会的各个领域。特别是在网络化的今天,大量敏感信息(如考试成绩、个人简历、体检结果、实验数据等)常常要通过互联网进行交换。(现代电子商务也是以互联网为基础的。)由于互联网的开放性,任何人都可以自由地接入互联网,使得有些不诚实者就有可能采用各种非法手段进行破坏。因此人们十分关心在网络上交换信息的安全性。普遍认为密码学方法是解决信息安全保护的一个最有效和可行的方法。有效是指密码能做到使信息不被非法窃取,不被篡改或破坏,可行是说它需要付出的代价是可以接受的。 密码是形成一门新的学科是在20世纪70年代。它的理论基础之一应该首推1949年Shannon的一篇文章“保密系统的通信理论”,该文章用信息论的观点对信息保密问题作了全面的阐述。这篇文章过了30年后才显示出它的价值。1976年,Diffie和Hellman发表了论文《密码学的新方向》,提出了公钥密码体制的新思想,这一思想引发了科技界对研究密码学的极大兴趣,大量密码学论文开始公开发表,改变了过去只是少数人关起门来研究密码学的状况。同时为了适应计算机通信和电子商务迅速发展的需要,密码学的研究领域逐渐从消息加密扩大到数字签名、消息认证、身份识别、抗欺骗协议等新课题[1]。 美国国家标准局(NBS)1973年开始研究除国防部外的其它部门的计算机系统的数据加密标准,并批准用于非机密单位及商业上的保密通信。于1973年5月15日和1974年8月27日先后两次向公众发出了征求加密算法的公告。1977年1月,美国政府颁布:采用IBM公司1971年设计出的一个加密算法作为非机密数据的正式数据加密标准(DES : Data Encryption Standard)。DES广泛应用于商用数据加密,算法完全公开,这在密码学史上是一个创举[2]。 在密码学的发展过程中,DES算法起了非常重要的作用。本次学年论文介绍的就是分组加密技术中最典型的加密算法——DES算法。 1概述 1.1加密与解密 加密技术是基于密码学原理来实现计算机、网络乃至一切信息系统安全的理论与技术基础。简单的说,加密的基本意思是改变信息的排列形式,使得只有合法的接受才能读懂,任何他人即使截取了该加密信息也无法使用现有的手段来解读。解密是我们将密文转换成能够直接阅读的文字(即明文)的过程称为解密,它是加密的反向处理,但解密者必须利用相同类型的加密设备和密钥对密

des加密算法的实现及应用

DES加密算法的实现及应用 学生姓名:梁帅指导老师:熊兵 摘要随着信息与通信技术的迅猛发展和广泛应用,人们通过互联网进行信息交流,难免涉及到密码保护问题,这就需要使用DES加密技术来对数据进行加密保护。本课程设计介绍了DES加密的基本原理以及简单的实现方法。本课程设计基于C语言,采用DES算法技术,设计了DES加密程序,实现了DES加密解密功能。经测试,程序能正常运行,实现了设计目标。 关键词DES加密,C语言,信息交流

1 引言 1.1本文主要内容 DES是一个分组密码算法,使用64位密钥(除去8位奇偶校验,实际密钥长度为56位)对64比特的数据分组(二进制数据)加密,产生64位密文数据。DES是一个对称密码体制,加密和解密使用同意密钥,解密和加密使用同一算法(这样,在硬件与软件设计时有利于加密单元的重用)。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等)在公共通信网中传输的安全性和可靠性 DES的加密过程: 第一阶段:初始置换IP。在第一轮迭代之前,需要加密的64位明文首先通过初始置换IP 的作用,对输入分组实施置换。最后,按照置换顺序,DES将64位的置换结果分为左右两部分,第1位到第32位记为L0,第33位到第64位记为R0。 第二阶段:16次迭代变换。DES采用了典型的Feistel结构,是一个乘积结构的迭代密码算法。其算法的核心是算法所规定的16次迭代变换。DES算法的16才迭代变换具有相同的结构,每一次迭代变换都以前一次迭代变换的结果和用户密钥扩展得到的子密钥Ki作为输入;每一次迭代变换只变换了一半数据,它们将输入数据的右半部分经过函数f后将其输出,与输入数据的左半部分进行

DES加密算法与解密(带流程图)

一、DES加密及解密算法程序源代码: #include using namespace std; const static char IP_Table[] = { //IP_Table置换58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7 }; const static char Final_Table[] = { //最终置换40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31, 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29, 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27, 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25 }; const static char S_Box[8][64] = { //s_box /* S1 */ {14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8, 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0, 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13}, /* S2 */ {15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10, 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5, 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15, 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9}, /* S3 */ {10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8, 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1, 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7, 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12},

利用DES加密算法保护Java源代码概要

利用DES加密算法保护Java源代码 摘要:本文首先分析了Java源代码需要加密的原因,简要介绍了DES算法及Java密码体系和Java密码扩展,最后说明了利用DES加密算法保护Java源代码的方法及步骤。 关键词Java 加密 DES算法 Java语言是一种非常适用于网络编程的语言,它的基本结构与C++极为相似,但抛弃了C/C++中指针等内容,同时它吸收了Smalltalk、C++面向对象的编程思想。它具有简单性、鲁棒性、可移植性、动态性等特点。这些特点使得Java 成为跨平台应用开发的一种规范,在世界范围内广泛流传。 1 加密Java源码的原因 Java源代码经过编译以后在JVM中执行。由于JVM界面是完全透明的,Java类文件能够很容易通过反编译器重新转换成源代码。因此,所有的算法、类文件等都可以以源代码的形式被公开,使得软件不能受到保护,为了保护产权,一般可以有以下几种方法: (1)“模糊”类文件,加大反编译器反编译源代码文件的难度。然而,可以修改反编译器,使之能够处理这些模糊类文件。所以仅仅依赖“模糊类文件”来保证代码的安全是不够的。 (2)流行的加密工具对源文件进行加密,比如PGP (Pretty Good Privacy)或GPG(GNU Privacy Guard)。这时,最终用户在运行应用之前必须先进行解密。但解密之后,最终用户就有了一份不加密的类文件,这和事先不进行加密没有什么差别。 (3)加密类文件,在运行中JVM用定制的类装载器(Class Loader)解密类文件。Java运行时装入字节码的机制隐含地意味着可以对字节码进行修改。JVM 每次装入类文件时都需要一个称为ClassLoader的对象,这个对象负责把新的类装入正在运行的JVM。JVM给ClassLoader一个包含了待装入类(例如https://www.doczj.com/doc/0d15553530.html,ng.Object)名字的字符串,然后由ClassLoader负责找到类文件,装入原始数据,并把它转换成一个Class对象。 用户下载的是加密过的类文件,在加密类文件装入之时进行解密,因此可以看成是一种即时解密器。由于解密后的字节码文件永远不会保存到文件系统,所以窃密者很难得到解密后的代码。 由于把原始字节码转换成Class对象的过程完全由系统负责,所以创建定制ClassLoader对象其实并不困难,只需先获得原始数据,接着就可以进行包含解密在内的任何转换。 2 Java密码体系和Java密码扩展 Java密码体系(JCA)和Java密码扩展(JCE)的设计目的是为Java提供与实现无关的加密函数API。它们都用factory方法来创建类的例程,然后把实际的加密函数委托给提供者指定的底层引擎,引擎中为类提供了服务提供者接口在Java中实现数据的加密/解密,是使用其内置的JCE(Java加密扩展)来实现的。Java开发工具集1.1为实现包括数字签名和信息摘要在内的加密功能,推出了一种基于供应商的新型灵活应用编程接口。Java密码体系结构支持供应商的互操作,同时支持硬件和软件实现。Java密码学结构设计遵循两个原则:(1)

DES加密算法文档

北京工业大学 网络与信息安全概论 学院: 专业: 指导老师: 姓名: 学号:

目录 目录 (2) 一、DES算法的基本原理 (3) 1.1背景介绍 (3) 1.2加密原理 (3) 二、DES算法的详细步骤 (4) 2.1加密详细步骤 (4) 2.2压缩置换到56位 (5) 2.3 C0和D0的分类 (6) 2.4循环左移 (6) 2.5压缩置换 (7) 三、DES算法的实现 (7) 3.1详细设计 (8) 3.1.2加密/解密文件的预览 (8) 3.2文件的加密/解密 (9) 3.3系统测试 (11) 3.4总结 (14)

一、DES算法的基本原理 1.1背景介绍 1977年1月,美国政府颁布:采纳IBM公司设计的方案作为非机密数据的正式数据加密标准(DES-Data Encryption Standard)。 DES (Data Encryption Standard),是IBM在上个世纪70年代开发的单密钥对称加解密算法。该算法利用一个56+8奇偶校验位(第8, 16, 24, 32, 40, 48, 56, 64位)=64位的密钥对以64位为单位的块数据进行加解密。 1.2加密原理 DES算法是这样工作的:如Mode为加密,则用Key 去把数据Data进行加密,生成Data的密码形式(64位)作为DES的输出结果;如Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果。 在通信网络的两端,双方约定一致的Key,在通信的源点用Key对核心数据进行DES加密,然后以密码形式在公共通信网(如电话网)中传输到通信网络的终点,数据到达目的地后,用同样的Key对密码数据进行解密,便再现了明码形式的核心数据。这样,便保证了核心数据(如PIN、MAC等)在公共通信网中传输的安全性和可靠性。 通过定期在通信网络的源端和目的端同时改用新的Key,便能更进一步提高数据的保密性,这正是现在金融交易网络的流行做法。

DES加密解密matlab实现

%% 注意这是一个function .m 文件,直接复制即可 function [ out, bin, hex ] = DES( Text, key, flag ) % key and Text 是字符类型 % key ='1011101010100011110100011111001110110100111100111101000110100111' % Text ='1011101010100011110100011111001110110100111100111101000110100111' % DES(Text, key) % when flag = 0(默认),DES 加密 % when flag = 1,DES 解密 %% === initial data === %% === import 左移位数表=== LS = [1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 1] ; %% === import PC-1table=== PC1 = [57 49 41 33 25 17 9 1 58 50 42 34 26 18 10 2 59 51 43 35 27 19 11 3 60 52 44 36 63 55 47 39 31 23 15 7 62 54 46 38 30 22 14 6 61 53 45 37 29 21 13 5 28 20 12 4 ] ; %% === import PC-2table === PC2 = [14 17 11 24 1 5 3 28 15 6 21 10 23 19 12 4 26 8 16 7 27 20 13 2 41 52 31 37 47 55 30 40 51 45 33 48 44 49 39 56 34 53 46 42 50 36 29 32 ] ; %% === import IP table === IP =[58 50 42 34 26 18 10 2 60 52 44 36 28 20 12 4 62 54 46 38 30 22 14 6 64 56 48 40 32 24 16 8 57 49 41 33 25 17 9 1 59 51 43 35 27 19 11 3 61 53 45 37 29 21 13 5 63 55 47 39 31 23 15 7 ] ; %% === import E-table === E = [32 1 2 3 4 5 4 5 6 7 8 9 8 9 10 11 12 13 12 13 14 15 16 17 16 17 18 19 20 21 20 21 22 23 24 25 24 25 26 27 28 29 28 29 30 31 32 1 ] ; %% === import P table ===

DES加密算法的实现(详细版)

v 3DES加密算法的实现毕业论文 一、DES加密及解密算法程序源代码: #include using namespace std; const static char IP_Table[] = { //IP_Table置换58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7 }; const static char Final_Table[] = { //最终置换40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31, 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29, 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27, 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25 }; const static char S_Box[8][64] = { //s_box /* S1 */ {14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8, 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0, 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13}, /* S2 */ {15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10, 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5, 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15, 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9}, /* S3 */ {10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8, 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1, 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,

信息安全概论中的DES加密解密算法的用C++实现,附上实验报告

网络与信息安全Introduction to Network and Security ——DES 加密解密算法的C++实现 姓名: 学号: 学院: 2010年10月

一、DES算法的实现 1.DES简介 本世纪五十年代以来,密码学研究领域出现了最具代表性的两大成就。其中之一就是1971年美国学者塔奇曼(Tuchman)和麦耶(Meyer)根据信息论创始人香农(Shannon)提出的“多重加密有效性理论”创立的,后于1977年由美国国家标准局颁布的数据加密标准。 DES密码实际上是Lucifer密码的进一步发展。它是一种采用传统加密方法的区组密码。它的算法是对称的,既可用于加密又可用于解密。 美国国家标准局1973年开始研究除国防部外的其它部门的计算机系统的数据加密标准,于1973年5月15日和1974年8月27日先后两次向公众发出了征求加密算法的公告。加密算法要达到的目的通常称为DES密码算法要求主要为以下四点: 提供高质量的数据保护,防止数据未经授权的泄露和未被察觉的修改;具有相当高的复杂性,使得破译的开销超过可能获得的利益,同时又要便于理解和掌握DES密码体制的安全性应该不依赖于算法的保密,其安全性仅以加密密钥的保密为基础实现经济,运行有效,并且适用于多种完全不同的应用。 1977年1月,美国政府颁布:采纳IBM公司设计的方案作为非机密数据的正式数据加密标准(DES枣Data Encryption Standard)。 目前在这里,随着三金工程尤其是金卡工程的启动,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,便能更进一步提高数据的保密性,这正是现在金融交易网络的流行做法。 2.DES算法详述 DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,其功能是把输入的64位数据块按位重新组合,并把输出分为L0 、R0两部分,每部分各长32位,其置换规则见下表: 58,50,12,34,26,18,10,2,60,52,44,36,28,20,12,4, 62,54,46,38,30,22,14,6,64,56,48,40,32,24,16,8,

DES加密算法的Java实现

信息安全概论JAVA实现DES加密算法 学号:091401223 姓名:高玉林

Java实现DES加密算法 目录 DES算法概述 (3) DES的加密过程 (4) DES算法细节 (4) DES的解密过程 (8) 源代码与结果(使用Java实现) (9) 源代码 (9) 运行结果截图 (21) 默认密钥(“这不是密码”) (21) 用户自定义密钥(以“nuaasillydes”为例) (21) 总结 (22)

DES算法概述 DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法。它是ANSI的数据加密算法和ISO的DEA-1,成为一个世界范围内的标准已经近30年。尽管DES带有过去时代的特征,但是它很好的抵抗住了多年的密码分析,除可能的最强有力的敌手外,对其他的攻击仍是安全的。 DES是一个分组加密算法,它以64位为一组对数据进行加密。64位一组的明文从算法的一端输入,64位的密文从另一端输出。DES是一个对称算法:加密与解密用的是同一算法(除密钥编排不同以外)。密钥的长度为56位,通常表示为64位的数,但是每个第八位都用作奇偶校验,可以忽略。密钥可以是任意的56位的数,且可在任意的时候改变。DES的整体结构为:

DES 的加密过程 DES 的加密过程如下。 (1)64位的密钥经子密钥产生算法产生出16个子密钥K1,K2,……,K16,分别供第1次,第2次,……,第16次加密迭代使用。 (2)64位明文首先经过初始置换IP (Initial Permutation ),将数据打乱重新排列并分成左右两半。左边32位构成L ,右边32为构成R 。 (3)由加密函数f 实现子密钥k1对R0的加密,结果得到32位的数据组f (R0,K1)。F(R0,K1)再与L0异或,又得到一个32位的数据组L0?f(R0,K1)。以L0?f(R0,K1)作为第2次加密迭代的R1,以R0作为第2次加密迭代的L1。至此,第1次加密迭代结束。 (4)第2次加密迭代至第16次加密迭代分别用子密钥K1,K2,……,K16进行,其过程与第1次加密过程相同。 (5)第16次加密迭代后,左右部分并未交换,而是将R16与L16并在一起形成一个分组作为末置换(逆初始置换IP -1)的输入,将数据重新排列,便得到64位明文。至此,加密过程全部结束。 综上,可将DES 的加密过程用如下的数学表达式描述: DES 算法细节 1. 子密钥的产生 64位密钥经过密钥置换、循环左移、压缩置换等变换,产生16个子密钥。子密钥的产生过程如图所示,其中产生每一个子密钥所需的循环左移位数在表中给出。 1) 密钥置换 64位的密钥分为8个字节,每个字节的前7位是真正的密钥位,而第8位是奇偶校检位。置换选择1的矩阵在表2中给出 L i =R i-1 R i =L i-1?f(R i-1,K i ),其中i=1,2,3,……,16,?表示异或

DES加密解密算法的实现

学 院: 计算机工程学院 专 业: 计算机科学与技术 班 级: 09计3W 学 号: 09141307 姓 名: 张 赛 指导老师: 古春生 网络安全课程设计报告 JI AN GSU TEAC HERS UNIVER SITY OF TECHN OLOGY

一、DES算法的简介 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算法的实现 DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,其功能是把输入的64位数据块按位重新组合,并把输出分为L0 、R0两部分,每部分各长32位,其置换规则见下表: 58,50,12,34,26,18,10,2,60,52,44,36,28,20,12,4, 62,54,46,38,30,22,14,6,64,56,48,40,32,24,16,8, 57,49,41,33,25,17, 9,1,59,51,43,35,27,19,11,3, 61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7, 即将输入的第58位换到第一位,第50位换到第2位,......,依此类推,最后一位是原来的第7位。 L0、R0则是换位输出后的两部分,L0是输出的左32位,R0 是右32位,例:设置换前的输入值为D1D2D3......D64,则经过初始置换后的结果为:L0=D550......D8;R0=D57D49 (7) 经过26次迭代运算后,得到L16、R16,将此作为输入,进行逆置换,即得

DES算法的verilog实现

EDA试验报告 一、实验项目名称 DES算法 二、实验目的与要求 1.掌握DES的原理和设计方法。 2.了解QuartusII硬件电路设计流程,学会利用Modelsim进行仿真。 3.加深对自顶向下设计和分模块化的了解,学会模块化的设计方法。 三、实验步骤 (一).DES算法原理 DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。

其入口参数有三个:key、data、mode。key为加密解密使用的密钥,data为加密解密的数据,mode为其工作模式。当模式为加密模式时,明文按照64位进行分组,形成明文组,key用于对数据加密,当模式为解密模式时,key用于 对数据解密。实际运用中,密钥只用到了64位中的56位,这样才具有高的安全性。DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,整个算法的主流程图如下: (二)、VerilogHDL实现原理 拟采用模块化设计思想,根据DES算法的流程分模

块设计实现各模块,自顶向下最终实现DES加密算法。 各模块功能及实现如下所示: 1.整体结构框架搭建,实现总体功能 module DES(input clk, input des_enable, input reset, input des_mode, input [1:64] data_i, input [1:64] key_i, output wire [1:64] data_o, output ready_o); wire [3:0] inter_num_curr; wire [1:32] R_i_var, L_i_var; wire [1:56] Key_i_var_out; wire [1:64] data_o_var_t; wire [1:32] R_i, L_i; wire [1:32] R_o, L_o; wire [1:56] Key_o; wire [1:28] C0, D0; IP IP1(.in(data_i), .L_i_var(L_i_var), .R_i_var(R_i_var)); IP_ni IP_ni(.in(data_o_var_t), .out(data_o)); pc_1 pc_1(.key_i(key_i), .C0(C0), .D0(D0)); //F(R,K) des_f des_f1(.clk(clk), .reset(reset), .des_mode(des_mode), .inter_num_i(inter_num_curr), .R_i(R_i), .L_i(L_i), .Key_i(Key_i_var_out), .R_o(R_o), .L_o(L_o), .Key_o(Key_o));

DES加密算法的简单实现实验报告

苏州科技学院电子与信息工程学院 实验报告 实验一 (实验)课程名称信息安全技术 实验名称DES加密算法的简单实现

实验报告 一、实验室名称:电子学院213机房 二、实验项目名称:DES加密算法的简单实现 三、实验学时:2学时 四、实验原理: DES的描述 DES是一种分组加密算法,他以64位为分组对数据加密。64位一组的明文从算法的一端输入,64位的密文从另一端输出。DES是一个对称算法:加密和解密用的是同一个算法(除密钥编排不同以外)。 密钥的长度为56位(密钥通常表示为64位的数,但每个第8位都用作奇偶检验,可以忽略)。密钥可以是任意的56位数,且可以在任意的时候改变。 DES算法的入口参数有3个: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的输出结果。 DES算法详述 DES算法把64位的明文输入块变为64位的密文输出块,他所使用的密钥也是64位,DES对64 位的明文分组进行操作。通过一个初始置换,将明文分组分成左半部分和右半部分,各32位长。然后进行16轮相同的运算,这些相同的运算被称为函数f,在运算过程中数据和密钥相结合。经过16轮运算后左、右部分在一起经过一个置换(初始置换的逆置换),这样算法就完成了。 (1)初始置换 其功能是把输入的64位数据块按位重新组合,并把输出分为L0,R0两部分,每部分各长32位, 即将输入的第58位换到第1位,第50位换到第2位,…,依次类推,最后一位是原来的第7位,L0,R0则是换位输出后的两部分,L0是输出的左32位,R0是右32位。。 (2)逆置换

DES_加密解密算法的C++实现--实验报告

1 实验一 1、实验题目 利用C/C++编程实现DES加密算法或MD5加密算法。我选择的是用C++语言实现 DES的加密算法。 2、实验目的 通过编码实现DES算法或MD5算法,深入掌握算法的加密原理,理解其实际应用 价值,同时要求用C/C++语言实现该算法,让我们从底层开始熟悉该算法的实现过程3、实验环境 操作系统:WIN7旗舰版 开发工具:Visual Studio 2010旗舰版开发语言:C++ 4、实验原理 DES加密流程

2 如上图所示为DES的加密流程,其中主要包含初始置换,压缩换位1,压缩换位2,扩展置换,S盒置换,异或运算、终结置换等过程。初始置换是按照初始置换表将64位明文重新排列次序扩展置换是将原32为数据扩展为48位数据,它主要由三个目的:1、产生与子密钥相同的长度2、提供更长的结果,使其在加密过程中可以被压缩 3、产生雪崩效应,使得输入的一位将影响两个替换 S盒置换是DES算法中最核心的内容,在DES中,只有S盒置换是非线性的,它比DES 中其他任何一步都提供更好的安全性 终结置换与初始置换相对应,它们都不影响DES的安全性,主要目的是为了更容易将明文与密文数据一字节大小放入DES的f算法中 DES解密流程与加密流程基本相同,只不过在进行16轮迭代元算时,将子密钥生成的 K的次序倒过来进行迭代运算 5、实验过程记录 在对DES算法有了清晰的认识后,编码过程中我将其分为几个关键部分分别进行编码,最后将整个过程按顺序执行,即可完成DES的加密,代码的主要几个函数如下: 代码 // : 定义控制台应用程序的入口点。// #include "" #include "" #include #include #include using namespace std; //置换矩阵 int IP_EX[64]= { 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6, 64, 5 6, 48, 40, 32, 24, 16, 8, 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13,

DES_加密解密算法的C++实现--实验报告

实验一 1、实验题目 利用C/C++编程实现DES加密算法或MD5加密算法。我选择的是用C++语言实现 DES的加密算法。 2、实验目的 通过编码实现DES算法或MD5算法,深入掌握算法的加密原理,理解其实际应用价值,同时要求用C/C++语言实现该算法,让我们从底层开始熟悉该算法的实现过程3、实验环境 操作系统:WIN7旗舰版 开发工具:Visual Studio 2010旗舰版开发语言:C++ 4、实验原理 DES加密流程

2 如上图所示为DES的加密流程,其中主要包含初始置换,压缩换位1,压缩换位2,扩 展置换,S盒置换,异或运算、终结置换等过程。 初始置换是按照初始置换表将64位明文重新排列次序 扩展置换是将原32为数据扩展为48位数据,它主要由三个目的: 1、产生与子密钥相同的长度 2、提供更长的结果,使其在加密过程中可以被压缩 3、产生雪崩效应,使得输入的一位将影响两个替换 S盒置换是DES算法中最核心的内容,在DES中,只有S盒置换是非线性的,它比DES 中其他任何一步都提供更好的安全性 终结置换与初始置换相对应,它们都不影响DES的安全性,主要目的是为了更容易将明文与密文数据一字节大小放入DES的f算法中 DES解密流程与加密流程基本相同,只不过在进行16轮迭代元算时,将子密钥生成的 K的次序倒过来进行迭代运算 5、实验过程记录 在对DES算法有了清晰的认识后,编码过程中我将其分为几个关键部分分别进行编码,最后将整个过程按顺序执行,即可完成DES的加密,代码的主要几个函数如下: //Byte转为Bit ByteToBit(ElemType ch,ElemType bit[8]) //Bit转为Byte BitToByte(ElemType bit[8],ElemType &ch) //初始置换 InitialEX(ElemType Inorder[64],ElemType Disorder[64]) //终结置换 AntiEx(ElemType Disorder[64]) //扩展置换 ExpandEX(ElemType RightMsg[32],ElemType ExpandMsg[48]) //16轮迭代加密 MoveLeft(ElemType C[28],ElemType D[28],ElemType L0[32],ElemType R0[32]) 3 //16轮迭代解密 mMoveLeft(ElemType C[28],ElemType D[28],ElemType L0[32],ElemType R0[32]) //生成48位子密钥 GetCD48(ElemType C[28],ElemType D[28],ElemType Secret[48]) //48位明文与子密钥进行异或运算 XOR(ElemType ExpandMsg[48],ElemType Secret[48],ElemType Result[48]) //S盒四位输出getSOut(ElemType Result[48],ElemType Sout[32]) //直接置换 DirExchange(ElemType Sout[32],ElemType DirOut[32]) //Li与Ri进行抑或运算 XORLR(ElemType DirOut[32],ElemType Left[32],ElemType Result[32]) 函数执行次序和调用关系关系如下:

相关主题
文本预览
相关文档 最新文档