当前位置:文档之家› DES数据加密算法

DES数据加密算法

DES数据加密算法
DES数据加密算法

上海电力学院

实验报告

课程名称信息安全/计算机安全实验项目实验一DES数据加密算法

姓名张三学号班级专业电子信息工程

同组人姓名指导教师姓名魏为民实验日期2011年月日

一、实验目的

通过本实验的学习,深刻理解DES加密标准,提高算法设计能力,为今后继续学习密码技术和数字签名奠定基础。

二、实验内容

根据DES加密标准,用C++设计编写符合DES算法思想的加、解密程序,能够实现对字符串和数组的加密和解密。

三、实验步骤

1. 在操作系统环境下启动VC++集成环境(Microsoft Visual C++ 6.0 ,其中6.0为版本号,也可为其它版本),则产生如图1所示界面。

图1 VC++ 集成环境界面

2. 选择“文件”菜单下的“新建”命令,出现如图2所示界面(不可直接按“新建”按钮,此按钮是新建一个文本文件)。此界面缺省标签是要为新程序设定工程项目,但编辑小的源程序也可以不建立项目,可以直接选择其左上角的“文件”标签,产生如图3所示界面。

3. 在图3所示的界面中左边选定文件类型为“C++ Source File”,右边填好文件名并选定文件存放目录,

然后单击“确定”按钮,出现如图4所示编程界面,开始输入程序。

4. 输入完源程序后,按"编译"菜单下的编译命令,对源程序进行编译。系统将在下方

的窗口中显示编译信息。如果无此窗口,可按"Alt + 2"键或执行"查看"菜单下的"输出"命令。

如果编译后已无提示错误,则可按"编译"菜单下的"构件"命令来生成相应的可执行文件,随后可按"编译"菜单下的"执行"命令运行的程序。

图2 新建VC++工程项目界面

图3 新建VC++源程序文件界面

图4 VC++源程序编辑界面

四、DES算法的过程

1. 处理密钥:

1.1 从用户处获得64位密钥Key。(每第8位为校验位,为使密钥有正确的奇偶校验,每个字节要有奇数个“1”位。

1.2 处理过程:

1.2.1 对密钥实施变换,经过子密钥换位表PC-1的变换后,Key 的位数由64 位变成了56位。

1.2.2 把变换后的密钥等分成两部分,前28位记为C0,后28位记为D0。

1.2.3 计算子密钥(共16个),从i=1开始。

1.2.3.1 分别对Ci-1、Di-1作循环左移来生成Ci、Di(共16次)。

1.2.3.2 串联Ci、Di,得到一个56位数,然后对此数作子密钥换位表PC-2变换以产生48位子密钥Ki 。

1.2.3.3 按以上方法计算出16个子密钥。

2.对64位数据块的处理:

2.1 把数据分成64位的数据块,不够64位的以适当方式填补。

2.2 对数据块利用初始变换IP表作变换。

2.3 将变换后的数据块等分成前后两部分,前32位记为L0,后32位记为R0。

2.4 用16个子密钥对数据加密。

2.4.1 利用扩展置换E,将32位R(i-1)数据扩展成48位。

2.4.2 用E{R (i-1)}与子密钥K(i)作按位异或运算。

2.4.3 把所得的48位数分成8个6位数组。1-6位为Z1,7-12位为Z2,……43-48位为Z8。

2.4.4 从j=1开始,用S盒里的值替换Zj。S盒里的值为4位数,共8个S盒,输出32位数。

2.4.4.1 取出Z j的第1和第6位串联起来成一个2位数,记为m。m即是Sj盒里用来替换Z j的数所在的行数。

2.4.4.2 取出Z j的第2至第5位串联起来成一个4位数,记为n。n即是Sj盒里用来替换Z j的数所在的列数。2.4.4.3 用坐标(m,n)在S盒中查找出相应的值作为S盒的输出。

2.4.5 八个选择函数Sj(1≤j≤8)的输出拼接为32位二进制数据,把它作为P盒置换的输入,得到输出

2.4.6 把得到的结果与L(i-1)作异或运算。把计算结果賦给R(i)。

2.4.7 把R(i-1)的值賦给L(i),完成1轮乘积变换。

2.4.8 从2.4.1起循环执行16次,直到K(16)也被用到。

2.5 把R(16)和L(16)顺序串联起来得到一个64位数。对这个数实施2.2变换的逆变换IP-1。

五.算法实现

(1)源程序:

#ifndef _DES_ENCRYPT_DECRYPT

#define _DES_ENCRYPT_DECRYPT

#define BYTE unsigned char

#define LPBYTE BYTE*

#define LPCBYTE const BYTE*

#define BOOL int

class DES

{

public:

BOOL CDesEnter(LPCBYTE in, LPBYTE out, int datalen, const BYTE key[8], BOOL type);

BOOL CDesMac(LPCBYTE mac_data, LPBYTE mac_code, int datalen, const BYTE key[8]); private:

void XOR(const BYTE in1[8], const BYTE in2[8], BYTE out[8]);

LPBYTE Bin2ASCII(const BYTE byte[64], BYTE bit[8]);

LPBYTE ASCII2Bin(const BYTE bit[8], BYTE byte[64]);

void GenSubKey(const BYTE oldkey[8], BYTE newkey[16][8]);

void endes(const BYTE m_bit[8], const BYTE k_bit[8], BYTE e_bit[8]);

void undes(const BYTE m_bit[8], const BYTE k_bit[8], BYTE e_bit[8]);

void SReplace(BYTE s_bit[8]);

};

/*

* CDesEnter 函数说明:

* des加密/解密入口

* 返回:

* 1则成功,0失败

* 参数:

* in 需要加密或解密的数据

* 注意:in缓冲区的大小必须和datalen相同.

* out 加密后或解密后输出。

* 注意:out缓冲区大小必须是8的倍数而且比datalen大或者相等。

* 如datalen=7,out缓冲区的大小应该是8,datalen=8,out缓冲区的大小应该是8,

* datalen=9,out缓冲区的大小应该是16,依此类推。

* datalen 数据长度(字节)。

* 注意:datalen 必须是8的倍数。

* key 8个字节的加密或解密的密码。

* type 是对数据进行加密还是解密

* 0 表示加密 1 表示解密

*/

BOOL DES::CDesEnter(LPCBYTE in, LPBYTE out, int datalen, const BYTE key[8], BOOL type) {

//判断输入参数是否正确,失败的情况为:

//!in: in指针(输入缓冲)无效

//!out: out指针(输出缓冲)无效

//datalen<1:数据长度不正确

//!key:加/解密密码无效

//type && ((datalen % 8) !=0:选择解密方式但是输入密文不为8的倍数

if((!in) || (!out) || (datalen<1) || (!key) || (type && ((datalen % 8) !=0)))

return false;

if(type==0) //选择的模式是加密

{

// 用于存储待加密字串最后的若干字节

// DES算法是以8个字节为单位进行加密,如果待加密字串以8为单位分段加密时,最后一段不足 //8字节,则在后面补0,使其最后一段的长度为8字节

// te8bit是作为存储待加密字串最后一段(不足8字节)的变量

BYTE te8bit[8]={0,0,0,0,0,0,0,0};

// 这是待加密字串的调整长度

// 如果原始长度是8的整数倍,则调整长度的值和原来的长度一样

// 如果原始长度不是8的整数倍,则调整长度的值是能被8整除且不大于原来长度的最大整数。 //也就是不需要补齐的块的总长度

int te_fixlen = datalen - (datalen % 8);

// 将待加密密文以8为单位分段,把最后长度不足8的一段存储到te8bit中

for(int i = 0; i < (datalen % 8); i++)

te8bit[i] = in[te_fixlen + i];

// 将待加密字串分以8字节为单位分段加密

for(i = 0; i < te_fixlen; i += 8)

endes(in + i, key, out + i);

// 如果待加密字串不是8的整数倍,则将最后一段补齐(补0)后加密

if(datalen % 8 != 0)

endes(te8bit, key, out + datalen / 8 * 8);

}

else //选择的模式是解密

{

// 将密文以8字节为单位分段解密

for(int i = 0; i < datalen; i += 8)

undes(in + i, key, out + i);

}

return true;

}

/*

* CDesMAC 函数说明:

* DESMAC 数据验校

* 返回:

* 1则成功,0失败

* 参数:

* mac_data MAC验校数据

* 注意:Mac_data缓冲区的大小(16字节以上)必须和datalen相同,而且应是8的倍数。* out_mac MAC验校输出(8字节)

* dadalen 数据长度(字节)。

* 注意:datalen 必须是16以上而且是8的倍数。

* key 8个字节的验校密码。

*/

BOOL DES::CDesMac(LPCBYTE mac_data, LPBYTE mac_code, int datalen, const BYTE key[8]) {

//判断输入参数是否正确,失败的情况为:

//!mac_data: mac_data指针(输入缓冲)无效

//!mac_code: mac_code指针(输出缓冲)无效

//datalen<16:数据长度不正确

//datalen % 8 != 0:数据长度不为8的整数倍

//!key:密码不符合要求

if((!mac_data) || (!mac_code) || (datalen < 16) || (datalen % 8 != 0) || (!key))

return false;

endes(mac_data, key, mac_code);

for(int i = 8; i < datalen; i += 8)

{

XOR(mac_code, mac_data + i, mac_code);

endes(mac_code, key, mac_code);

}

return true;

}

/*

* XOR 函数说明:

* 将输入的两个8字节字符串异或

* 返回:

* 无

* 参数:

* const BYTE in1[8] 输入字符串1

* const BYTE in2[8] 输入字符串2

* BYTE out[8] 输出的结果字符串

*/

void DES::XOR(const BYTE in1[8], const BYTE in2[8], BYTE out[8])

{

for(int i = 0; i < 8; i++)

out[i] = in1[i] ^ in2[i];

}

/*

* Bin2ASCII 函数说明:

* 将64字节的01字符串转换成对应的8个字节

* 返回:

* 转换后结果的指针

* 参数:

* const BYTE byte[64] 输入字符串

* BYTE bit[8] 输出的转换结果

*/

LPBYTE DES::Bin2ASCII(const BYTE byte[64], BYTE bit[8]) {

for(int i = 0; i < 8; i++)

{

bit[i] = byte[i * 8] * 128 + byte[i * 8 + 1] * 64 + byte[i * 8 + 2] * 32 + byte[i * 8 + 3] * 16 + byte[i * 8 + 4] * 8 + byte[i * 8 + 5] * 4 + byte[i * 8 + 6] * 2 + byte[i * 8 + 7];

}

return bit;

}

/*

* ASCII2Bin 函数说明:

* 将8个字节输入转换成对应的64字节的01字符串

* 返回:

* 转换后结果的指针

* 参数:

* const BYTE bit[8] 输入字符串

* BYTE byte[64] 输出的转换结果

*/

LPBYTE DES::ASCII2Bin(const BYTE bit[8], BYTE byte[64]) {

for(int i=0; i < 8; i++)

for(int j = 0; j < 8; j++)

byte[i * 8 + j] = ( bit[i] >> (7 - j) ) & 0x01; return byte;

}

/*

* GenSubKey 函数说明:

* 由输入的密钥得到16个子密钥

* 返回:

* 无

* 参数:

* const BYTE oldkey[8] 输入密钥

* BYTE newkey[16][8] 输出的子密钥

*/

void DES::GenSubKey(const BYTE oldkey[8], BYTE newkey[16][8])

{

int i, k, rol = 0;

//缩小换位表1

int pc_1[56] = {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};

//缩小换位表2

int pc_2[48] = {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};

//16次循环左移对应的左移位数

int ccmovebit[16] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};

BYTE oldkey_byte[64];

BYTE oldkey_byte1[64];

BYTE oldkey_byte2[64];

BYTE oldkey_c[56];

BYTE oldkey_d[56];

BYTE newkey_byte[16][64];

ASCII2Bin(oldkey, oldkey_byte);

//位变换

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

oldkey_byte1[i] = oldkey_byte[pc_1[i] - 1];

//分为左右两部分,复制一遍以便于循环左移

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

oldkey_c[i] = oldkey_byte1[i], oldkey_c[i + 28] = oldkey_byte1[i],

oldkey_d[i] = oldkey_byte1[i + 28], oldkey_d[i + 28] = oldkey_byte1[i + 28];

//分别生成16个子密钥

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

{

//循环左移

rol += ccmovebit[i];

//合并左移后的结果

for(k = 0; k < 28; k++)

oldkey_byte2[k] = oldkey_c[k + rol], oldkey_byte2[k + 28] = oldkey_d[k + rol]; //位变换

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

newkey_byte[i][k] = oldkey_byte2[pc_2[k] - 1];

}

//生成最终结果

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

Bin2ASCII(newkey_byte[i], newkey[i]);

}

/*

* endes 函数说明:

* DES加密

* 返回:

* 无

* 参数:

* const BYTE m_bit[8] 输入的原文

* const BYTE k_bit[8] 输入的密钥

* BYTE e_bit[8] 输出的密文

*/

void DES::endes(const BYTE m_bit[8], const BYTE k_bit[8], BYTE e_bit[8])

{

//换位表IP

int ip[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,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

};

//换位表IP_1

int ip_1[64] = {

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

};

//放大换位表

int e[48] = {

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

};

BYTE m_bit1[8] = {0};

BYTE m_byte[64] = {0};

BYTE m_byte1[64] = {0};

BYTE key_n[16][8] = {0};

BYTE l_bit[17][8] = {0};

BYTE r_bit[17][8] = {0};

BYTE e_byte[64] = {0};

BYTE e_byte1[64] = {0};

BYTE r_byte[64] = {0};

BYTE r_byte1[64] = {0};

int i, j;

//根据密钥生成16个子密钥

GenSubKey(k_bit, key_n);

//将待加密字串变换成01串

ASCII2Bin(m_bit, m_byte);

//按照ip表对待加密字串进行位变换

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

m_byte1[i] = m_byte[ip[i] - 1];

//位变换后的待加密字串

Bin2ASCII(m_byte1, m_bit1);

//将位变换后的待加密字串分成两组,分别为前4字节L和后4字节R,作为迭代的基础(第0次迭代) for(i = 0; i < 4; i++)

l_bit[0][i] = m_bit1[i], r_bit[0][i] = m_bit1[i + 4];

//16次迭代运算

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

{

//R的上一次的迭代结果作为L的当前次迭代结果

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

l_bit[i][j] = r_bit[i-1][j];

ASCII2Bin(r_bit[i-1], r_byte);

//将R的上一次迭代结果按E表进行位扩展得到48位中间结果 for(j = 0; j < 48; j++)

r_byte1[j] = r_byte[e[j] - 1];

Bin2ASCII(r_byte1, r_bit[i-1]);

//与第I-1个子密钥进行异或运算

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

r_bit[i-1][j] = r_bit[i-1][j] ^ key_n[i-1][j];

//进行S选择,得到32位中间结果

SReplace(r_bit[i - 1]);

//结果与L的上次迭代结果异或得到R的此次迭代结果

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

{

r_bit[i][j] = l_bit[i-1][j] ^ r_bit[i-1][j];

}

}

//组合最终迭代结果

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

e_bit[i] = r_bit[16][i], e_bit[i + 4] = l_bit[16][i];

ASCII2Bin(e_bit, e_byte);

//按照表IP-1进行位变换

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

e_byte1[i] = e_byte[ip_1[i] - 1];

//得到最后的加密结果

Bin2ASCII(e_byte1, e_bit);

}

/*

* undes 函数说明:

* DES解密,与加密步骤完全相同,只是迭代顺序是从16到1 * 返回:

* 无

* 参数:

* const BYTE m_bit[8] 输入的密文

* const BYTE k_bit[8] 输入的密钥

* BYTE e_bit[8] 输出解密后的原文

*/

void DES::undes(const BYTE m_bit[8], const BYTE k_bit[8], BYTE e_bit[8]) {

//换位表IP

int ip[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,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

};

//换位表IP_1

int ip_1[64] = {

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

};

//放大换位表

int e[48] = {

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

};

BYTE m_bit1[8] = {0};

BYTE m_byte[64] = {0};

BYTE m_byte1[64] = {0};

BYTE key_n[16][8] = {0};

BYTE l_bit[17][8] = {0};

BYTE r_bit[17][8] = {0};

BYTE e_byte[64] = {0};

BYTE e_byte1[64] = {0};

BYTE l_byte[64] = {0};

BYTE l_byte1[64] = {0};

int i = 0, j = 0;

//根据密钥生成16个子密钥

GenSubKey(k_bit, key_n);

//将待加密字串变换成01串

ASCII2Bin(m_bit, m_byte);

//按照ip表对待加密字串进行位变换

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

m_byte1[i] = m_byte[ip[i] - 1];

//位变换后的待加密字串

Bin2ASCII(m_byte1, m_bit1);

//将位变换后的待加密字串分成两组,分别为前4字节R和后4字节L,作为迭代的基础(第16次迭代) for(i = 0; i < 4; i++)

r_bit[16][i] = m_bit1[i], l_bit[16][i] = m_bit1[i + 4];

//16次迭代运算

for(i = 16; i > 0; i--)

{

//L的上一次的迭代结果作为R的当前次迭代结果

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

r_bit[i-1][j] = l_bit[i][j];

ASCII2Bin(l_bit[i], l_byte);

//将L的上一次迭代结果按E表进行位扩展得到48位中间结果

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

l_byte1[j] = l_byte[e[j] - 1];

Bin2ASCII(l_byte1, l_bit[i]);

//与第I-1个子密钥进行异或运算

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

l_bit[i][j] = l_bit[i][j] ^ key_n[i-1][j];

//进行S选择,得到32位中间结果

SReplace(l_bit[i]);

//结果与R的上次迭代结果异或得到L的此次迭代结果

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

{

l_bit[i-1][j] = r_bit[i][j] ^ l_bit[i][j];

}

}

//组合最终迭代结果

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

e_bit[i] = l_bit[0][i], e_bit[i + 4] = r_bit[0][i];

ASCII2Bin(e_bit, e_byte);

//按照表IP-1进行位变换

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

e_byte1[i] = e_byte[ip_1[i] - 1];

//得到最后的结果

Bin2ASCII(e_byte1, e_bit);

}

/*

* SReplace 函数说明:

* S选择

* 返回:

* 无

* 参数:

* BYTE s_bit[8] 输入暨选择后的输出

*/

void DES::SReplace(BYTE s_bit[8])

{

int p[32] = {

16,7,20,21,

29,12,28,17,

1,15,23,26,

5,18,31,10,

2,8,24,14,

32,27,3,9,

19,13,30,6,

22,11,4,25

};

BYTE s[][4][16] ={

{

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 },

{

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 },

{

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 },

{

7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15,

13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9,

10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4,

3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14

},

{

2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9,

14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6,

4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14,

11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3,

},

{

12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11,

10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8,

9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6,

4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13

},

{

4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1,

13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6,

1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2,

6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12

},

{

13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7,

1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2,

7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8,

2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11

}

};

BYTE s_byte[64] = {0};

BYTE s_byte1[64] = {0};

BYTE row = 0, col = 0;

BYTE s_out_bit[8] = {0};

//转成二进制字符串处理

ASCII2Bin(s_bit, s_byte);

for(int i = 0; i < 8; i++)

{

//0、5位为row,1、2、3、4位为col,在S表中选择一个八位的数

row = s_byte[i * 6] * 2 + s_byte[i * 6 + 5];

col = s_byte[i * 6 + 1] * 8 + s_byte[i * 6 + 2] * 4 + s_byte[i * 6 + 3] * 2 + s_byte[i * 6 + 4]; s_out_bit[i] = s[i][row][col];

}

//将八个选择的八位数据压缩表示

s_out_bit[0] = (s_out_bit[0] << 4) + s_out_bit[1];

s_out_bit[1] = (s_out_bit[2] << 4) + s_out_bit[3];

s_out_bit[2] = (s_out_bit[4] << 4) + s_out_bit[5];

s_out_bit[3] = (s_out_bit[6] << 4) + s_out_bit[7];

//转成二进制字符串处理

ASCII2Bin(s_out_bit, s_byte);

//换位

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

s_byte1[i] = s_byte[p[i] - 1];

//生成最后结果

Bin2ASCII(s_byte1, s_bit);

}

#endif

(2)实现效果:

六.实验小结:

DES数据加密标准是对称密码体制的杰出代表。DES算法综合多次组合迭代算法和换位算法,利用分散和错乱的相互作用,把明文编制成密码强度很高的密文。DES算法的加密和解密的流程是完全相同的,区别仅仅是加密与解密使用子密钥序列的顺序正好相反。

DES算法具有极高安全性,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法。而56位长的密钥的穷举空间为256,这意味着如果一台计算机的速度是每一秒种检测一百万个密钥,则它搜索完全部密钥就需要将近2285年的时间,可见,这是难以实现的,当然,随着科学技术的发展,当出现超高速计算机后,我们可考虑把DES密钥的长度再增长一些,以此来达到更高的保密程度。

由上述DES算法介绍我们可以看到:DES算法中只用到64位密钥中的其中56位,而第8、16、24、......64位8个位并未参与DES运算,这一点,向我们提出了一个应用上的要求,即DES的安全性是基于除了8,16,24,......64位外的其余56位的组合变化256才得以保证的。因此,在实际应用中,我们应避开使用第8,16,24,......64位作为有效数据位,而使用其它的56位作为有效数据位,才能保证DES算法安全可靠地发挥作用。

//将八个选择的八位数据压缩表示

s_out_bit[0] = (s_out_bit[0] << 4) + s_out_bit[1];

s_out_bit[1] = (s_out_bit[2] << 4) + s_out_bit[3];

s_out_bit[2] = (s_out_bit[4] << 4) + s_out_bit[5];

s_out_bit[3] = (s_out_bit[6] << 4) + s_out_bit[7];

//转成二进制字符串处理

ASCII2Bin(s_out_bit, s_byte);

//换位

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

s_byte1[i] = s_byte[p[i] - 1];

//生成最后结果

Bin2ASCII(s_byte1, s_bit);

}

#endif

(3)实现效果:

六.实验小结:

DES数据加密标准是对称密码体制的杰出代表。DES算法综合多次组合迭代算法和换位算法,利用分散和错乱的相互作用,把明文编制成密码强度很高的密文。DES算法的加密和解密的流程是完全相同的,区别仅仅是加密与解密使用子密钥序列的顺序正好相反。

DES算法具有极高安全性,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法。而56位长的密钥的穷举空间为256,这意味着如果一台计算机的速度是每一秒种检测一百万个密钥,则它搜索完全部密钥就需要将近2285年的时间,可见,这是难以实现的,当然,随着科学技术的发展,当出现超高速计算机后,我们可考虑把DES密钥的长度再增长一些,以此来达到更高的保密程度。

由上述DES算法介绍我们可以看到:DES算法中只用到64位密钥中的其中56位,而第8、16、24、......64位8个位并未参与DES运算,这一点,向我们提出了一个应用上的要求,即DES的安全性是基于除了8,16,24,......64位外的其余56位的组合变化256才得以保证的。因此,在实际应用中,我们应避开使用第8,16,24,......64位作为有效数据位,而使用其它的56位作为有效数据位,才能保证DES算法安全可靠地发挥作用。

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数

数据加密方案

数据加密方案

一、什么是数据加密 1、数据加密的定义 数据加密又称密码学,它是一门历史悠久的技术,指通过加密算法和加密密钥将明文转变为密文,而解密则是通过解密算法和解密密钥将密文恢复为明文。数据加密目前仍是计算机系统对信息进行保护的一种最可靠的办法。它利用密码技术对信息进行加密,实现信息隐蔽,从而起到保护信息的安全的作用。 2、加密方式分类 数据加密技术要求只有在指定的用户或网络下,才能解除密码而获得原来的数据,这就需要给数据发送方和接受方以一些特殊的信息用于加解密,这就是所谓的密钥。其密钥的值是从大量的随机数中选取的。按加密算法分为对称密钥和非对称密钥两种。 对称密钥:加密和解密时使用同一个密钥,即同一个算法。如DES和MIT的Kerberos算法。单密钥是最简单方式,通信双方必须交换彼此密钥,当需给对方发信息时,用自己的加密密钥进行加密,而在接收方收到数据后,用对方所给的密钥进行解密。当一个文本要加密传送时,该文本用密钥加密构成密文,密文在信道上传送,收到密文后用同一个密钥将密文解出来,形成普通文体供阅读。在对称密钥中,密钥的管理极为重要,一旦密钥丢失,密文将无密可保。这种

方式在与多方通信时因为需要保存很多密钥而变得很复杂,而且密钥本身的安全就是一个问题。 对称加密 对称密钥是最古老的,一般说“密电码”采用的就是对称密钥。由于对称密钥运算量小、速度快、安全强度高,因而如今仍广泛被采用。 DES是一种数据分组的加密算法,它将数据分成长度为64位的数据块,其中8位用作奇偶校验,剩余的56位作为密码的长度。第一步将原文进行置换,得到64位的杂乱无章的数据组;第二步将其分成均等两段;第三步用加密函数进行变换,并在给定的密钥参数条件下,进行多次迭代而得到加密密文。 非对称密钥:非对称密钥由于两个密钥(加密密钥和解密密钥)各不相同,因而可以将一个密钥公开,而将另一个密钥保密,同样可以起到加密的作用。

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 1977年1月,美国政府将IBM研制的一种乘积密码宣布为国家的数据加密标准。这个标准的确立刺激了很大一批厂商去实现加密算法的硬件化,以提高处理速度。这种密码术的核心是乘积变换,在硬件产业中常常简称为DES(Data Encryption Standard)。这样一来,由于可以得到便宜高速的硬件,所以反过来也鼓励了许多其他用户采纳DES。 1.DES算法描述 现在我们来说明DES算法,它的过程如图9-2所示。对明文按64位分组,每组明文经初始排列(第1步),通过子密钥K1--K16进行16次乘积变换(第2步),再通过最终排列(第3步)得到64位密文。 图9-2 DES算法过程图 16次乘积变换的目的是使明文增大其混乱性和扩散性,使得输出不残存统计规律,使破译者不能从反向推算出密钥。 第1步:初始排列(IP) IP(Initial Permutation)取排数据的方法如表9-2所示,其中的数据表示明文的位标(1~64)。例如,58指该组明文中的第58位,50指该组明文中的第50位,其他类推。第l 步初始排列的目的是将明文的顺序打乱。 表9-2 初始排列法(IP)

[例12-1]明文X=0123456789ABCDEF(十六进制形式),写成二进制形式,共64位:X=0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111经过初始排列(IP)后,结果变成: 1100 1100 0000 0000 1100 1100 1111 1111 1111 0000 1010 1010 1111 0000 1010 1010即 写成十六进制形式是:CC00CCFFFOAAFOAA。 第2步:乘积变换 把通过第1步得出的64位一分为二,用L0表示前32位,R0表示后32位,那么在上例中有: L0=CC00CCFF R0=FOAAFOAA 其16次乘积变换的过程可以用图9-3表示。其中K1~K16为16次变换所采用的密钥。每一个密码函数f(R i-1,K i)(i=1,…,16)都是通过3个子过程(扩展置换,压缩代换,P排列)得到的。由于16次变换过程是类似的,我们只要对其中的一个展开讨论就行了。在上面的例子中,我们不妨看一下i=1(第1次变换)的情况。其具体过程如图9-4所示。

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加密与解密 加密技术是基于密码学原理来实现计算机、网络乃至一切信息系统安全的理论与技术基础。简单的说,加密的基本意思是改变信息的排列形式,使得只有合法的接受才能读懂,任何他人即使截取了该加密信息也无法使用现有的手段来解读。解密是我们将密文转换成能够直接阅读的文字(即明文)的过程称为解密,它是加密的反向处理,但解密者必须利用相同类型的加密设备和密钥对密

高级加密标准AES

AES加密方法的讨论 姓名:贾泽宇学号:912106840226 AES(The Advanced Encryption Standard)是美国国家标准与技术研究所用于加密电子数据的规范。它被预期能成为人们公认的加密包括金融、电信和政府数字信息的方法。本文展示了AES的概貌并解析了它使用的算法。 AES 是一个新的可以用于保护电子数据的加密算法。明确地说,AES 是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,并且用 128 位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换(permutations )和替换(substitutions)输入数据。 AES 算法是基于置换和代替的。置换是数据的重新排列,而代替是用一个单元数据替换另一个。AES 使用了几种不同的技术来实现置换和替换。为了阐明这些技术,我们讨论一个具体的 AES 加密例子。下面是你要加密的128位值以及它们对应的索引数组: 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 192位密钥的值是: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 0 1 2 3 4 5 6 7 8 9 10 1112 13 14 15 16 17 18 19 20 21 22 23 Figure 2 S-盒(Sbox ) 当 AES 的构造函数(constructor)被调用时,用于加密方法的两个表被初始化。第一个表是代替盒称为S-盒。它是一个16×16的矩阵。S-盒的前五行和前五列如 Figure 2 所示。在幕后,加密例程获取该密钥数组并用它来生成一个名为w[]的密钥调度表,Figure 3 所示。 Figure 3 密钥调度表(Key Sched)

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后将其输出,与输入数据的左半部分进行

加密算法

加密算法介绍 褚庆东 一.密码学简介 据记载,公元前400年,古希腊人发明了置换密码。1881年世界上的第一个电话保密专利出现。在第二次世界大战期间,德国军方启用“恩尼格玛”密码机,密码学在战争中起着非常重要的作用。 随着信息化和数字化社会的发展,人们对信息安全和保密的重要性认识不断提高,于是在1997年,美国国家标准局公布实施了“美国数据加密标准(DES)”,民间力量开始全面介入密码学的研究和应用中,采用的加密算法有DES、RSA、SHA等。随着对加密强度需求的不断提高,近期又出现了AES、ECC等。 使用密码学可以达到以下目的: 保密性:防止用户的标识或数据被读取。 数据完整性:防止数据被更改。 身份验证:确保数据发自特定的一方。 二.加密算法介绍 根据密钥类型不同将现代密码技术分为两类:对称加密算法(秘密钥匙加密)和非对称加密算法(公开密钥加密)。 对称钥匙加密系统是加密和解密均采用同一把秘密钥匙,而且通信双方都必须获得这把钥匙,并保持钥匙的秘密。 非对称密钥加密系统采用的加密钥匙(公钥)和解密钥匙(私钥)是不同的。 对称加密算法 对称加密算法用来对敏感数据等信息进行加密,常用的算法包括: DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合。 3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。 AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高;

AES 2000年10月,NIST(美国国家标准和技术协会)宣布通过从15种侯选算法中选出的 一项新的密匙加密标准。Rijndael被选中成为将来的AES。Rijndael是在 1999 年下半年,由研究员 Joan Daemen和 Vincent Rijmen 创建的。AES 正日益成为加密各种形式的电子 数据的实际标准。 美国标准与技术研究院 (NIST) 于 2002 年 5 月 26 日制定了新的高级加密标 准 (AES) 规范。 算法原理 AES 算法基于排列和置换运算。排列是对数据重新进行安排,置换是将一个数据单元替换为另一个。AES 使用几种不同的方法来执行排列和置换运算。 AES 是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,并 且用 128位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换和替换输入数据。 非对称算法 常见的非对称加密算法如下: RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的; DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准); ECC(Elliptic Curves Cryptography):椭圆曲线密码编码学。 ECC

常用加密方式

常用加密方式 Base64 --------------------非对称加密-------------------------- Sha1(Secure Hash Algorithm) Sha256 Sha512 MD5(Message Digest Algorithm 5) RSA -----------------------对称加密----------------------------- DES(Data Encryption Standard) 3DES(Triple DES) AES(Advanced Encryption Standard) .net 数据加密算法 目前企业面临的计算环境和过去有很大的变化,许多数据资源能够依靠网络来远程存取,而且越来越多的通讯依赖于公共网络公共网络(如Internet),而这些环境并不保证实体间的安全通信,数据在传输过程可能被其它人读取或篡改。 加密将防止数据被查看或修改,并在原本不安全的信道上提供安全的通信信道,它达到以下目的:?保密性:防止用户的标识或数据被读取。 ?数据完整性:防止数据被更改。 ?身份验证:确保数据发自特定的一方。 一、数据加密/编码算法列表 常见用于保证安全的加密或编码算法如下: 1、常用密钥算法 密钥算法用来对敏感数据、摘要、签名等信息进行加密,常用的密钥算法包括: ?DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合; ?3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高; ?RC2和RC4:用变长密钥对大量数据进行加密,比DES 快; ?IDEA(International Data Encryption Algorithm)国际数据加密算法,使用128 位密钥提供非常强的安全性; ?RSA:由RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件快的长度也是可变的; ?DSA(Digital Signature Algorithm):数字签名算法,是一种标准的DSS(数字签名标准); ?AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前AES 标准的一个实现是Rijndael 算法; ?BLOWFISH,它使用变长的密钥,长度可达448位,运行速度很快; ?其它算法,如ElGamal、Deffie-Hellman、新型椭圆曲线算法ECC等。 2、单向散列算法 单向散列函数一般用于产生消息摘要,密钥加密等,常见的有: ?MD5(Message Digest Algorithm 5):是RSA数据安全公司开发的一种单向散列算法,MD5被广泛使用,可以用来把不同长度的数据块进行暗码运算成一个128位的数值; ?SHA(Secure Hash Algorithm)这是一种较新的散列算法,可以对任意长度的数据运算生成一个160位的

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},

用新的高级加密标准(AES)保持你的数据安全毕业论文外文翻译

Keep Your Data Secure with the New Adva need En crypti on Stan dard James McCaffrey SUMMARY The Advaneed Encryption Standard (AES) is a National Institute of Standards and Tech no logy specificati on for the en cryptio n of electr onic data. It is expected to become the accepted means of encrypting digital information, including financial, telecom muni catio ns, and gover nment data. This article prese nts an overview of AES and explains the algorithms it uses..After reading this article you will be able to en crypt data using AES, test AES-based software, and use AES en crypti on in your systems. Note that the code presented in this article and any other implementation based on this article is subject to applicable Federal cryptographic module export controls (see Commercial En crypti on Export Con trols for the exact regulati on s). AES is a new cryptographic algorithm that can be used to protect electr onic data. Specifically, AES is an iterative, symmetric-key block cipher that can use keys of 128, 192, and 256 bits, and en crypts and decrypts data in blocks of 128 bits (16 bytes) Uni ike public-key ciphers, which use a pair of keys, symmetric-key ciphers use the same key to en crypt and decrypt data. En crypted data returned by block ciphers have the same nu mber of bits that the in put data had. Iterative ciphers use a loop structur that repeatedly performs permutati ons and substitutio ns of the in put data. Figure 1 shows AES in action encrypting and then decrypting a 16-byte block of data using a 192-bit key. Figure 1 Some Data AES is the successor to the older Data Encryption Standard (DES). DES was approved as a Federal standard in 1977 and remained viable until 1998 when a comb in ati on of adva ncesi n hardware, software, and crypta nalysis theory allowed a DES-e ncrypted message to be decrypted in 56 hours. Since that time nu merous other successful attacks on DES-encrypted data have been made and DES is now considered past its useful lifetime.

最新-计算机网络安全中的数据加密技术 精品

计算机网络安全中的数据加密技术 [摘要]数据加密,即根据某种密码算法使明文信息转变为加秘钥的基本设置。 数据加密是计算机安全防护的关键技术,设置秘钥的目的在于数据保护。 数据加密大体可分为节点加密、端口加密以及链路加密三种表现形式。 在交换机与防火墙中,它主要是对传输信息实现加密处理与检测,最终达到对计算机系统数据的保护目的。 [关键词]计算机;网络安全;数据加密技术1数据加密技术种类1对称加密技术。 对称加密,又称共享密钥加密,即信息发送、接收方通过某种密钥分别对数据进行加密、解密。 它要求通信双方在密文安全传输前,应先确定某个公用密钥。 所以,只有双方都不透露密钥,方可保证数据传输的可靠性、完整性。 对称加密技术,属于最常见的数据加密技术。 数据加密算法大体包含、与三种。 数据加密标准算法,主要是针对二元数据进行加密,是一种分组密码对称64位数据,密钥可随意设置为56位,剩下8位为奇偶校验。 加密效率较高、速度较快,它的加密范围很广,在各个领域内均有普适应用。 而算法则是在算法的基础上加强密钥,达到128位,使数据更安全。 2非对称加密技术。 非对称加密,又称公钥加密。 简而言之,非对称加密,即信息发送与接收方分别选择不同的密钥,来对数据进行加密、解密,密钥通常包含公开密钥加密与私有密钥解密两类,现有技术与设备还无法从公钥推向私钥。 非对称加密技术的前提在于密钥交换协议,通信双方在不交换秘钥的情况下,便可直接传输通信数据,不存在密钥安全隐患,数据传输的保密性显著提升。 非对称加密技术,通常包含、以及-等数据加密算法。 公钥算法中应用最广的算法是算法,可有效防御现有密码的攻击。 非对称加密技术可应用于数据加密,同时也可认证身份、验证数据的完整性,在数字证书、签名等领域得到广泛应用。

利用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/696225676.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 ===

常用加密算法比较研究

2010年10月(上) 常用加密算法比较研究 刘宇 (天津交通职业学院,天津市 300110) [摘要]信息加密技术是利用数学或物理手段,对电子信息在传输过程中和存储体内进行保护,以防止泄漏的技术。由于计算机软件的非 法复制,通信的泄密、数据安全受到威胁,解密及盗版问题日益严重,甚至引发国际争端。所以在信息安全技术中,加密技术占有不可替代的位置,本文作者就几种常用的加密算法加以比较。[关键词]信息加密;算法;解密 信息加密技术是利用数学或物理手段,对电子信息在传输过程中和存储体内进行保护,以防止泄漏的技术。由于计算机软件的非法复制,通信的泄密、数据安全受到威胁,解密及盗版问题日益严重,甚至引发国际争端,所以在信息安全技术中,加密技术占有不可替代的位置,因此对信息加密技术和加密手段的研究与开发,受到各国计算机界的重视,发展日新月异。现就几种常用的加密算法加以比较。 1DES DES 算法是由IBM 公司研制的,并于1977年定为美国联邦信息加密标准。它是一种分组密码,以64位为分组对数据加密,它的密钥长度是56位(每个第8位作为奇偶校验),加密解密用同一算法。 DES 算法是对密钥进行保密,而公开算法,包括加密和解密算法。这样,只有掌握了和发送方相同密钥的人才能解读由DES 算法加密的密文数据。因此,破译DES 算法实际上就是搜索密钥的编码。对于56位长度的密钥来说,如果用穷举法来进行搜索的话,其运算次数为256。 随着计算机系统能力的不断发展,DES 的安全性比它刚出现时会弱得多,然而从非关键性质的实际出发,仍可以认为它是足够的。不过,DES 现在仅用于旧系统的鉴定,而更多地选择新的加密标准—高级加密标准( AdvancedEncryptionStandard ,AES )。2AES 密码学中的高级加密标准(Advanced Encryption Standard , AES ),又称Rijndael 加密法,为比利时密码学家Joan Daemen 和VincentRijmen 所设计,结合两位作者的名字,以Rijndael 命名。该算法采用对称分组密码体制,密钥长度的最少支持为128、192、256,分组长度128位,算法应易于各种硬件和软件实现。这种算法是美国联邦政府采用的区块加密标准,这个标准用来替代原先的DES ,已经被多方分析且广为全世界所使用。 AES 算法被设计为支持128/192/256位(/32=Nb)数据块大小(即分组长度);支持128/192/256位(/32=Nk )密钥长度,在10进制里,对应3.4×1038、6.2×1057、1.1×1077个密钥。 3RSA RSA 是目前最有影响力的公钥加密算法,并且被普遍认为是目前最优秀的公钥方案之一。RSA 是第一个能同时用于加密和数字签名的算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO 推荐为公钥数据加密标准。RSA 算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。 4BASE64 Base64是网络上最常见的用于传输8Bit 字节代码的编码方式之一,Base64编码可用于在HTTP 环境下传递较长的标识信息。例如,在JavaPersistence 系统Hibernate 中,采用了Base64来将一个较长的唯一标识符(一般为128-bit 的UUID )编码为一个字符串,用作HTTP 表单和HTTPGETURL 中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL (包括隐藏表单域)中的形式。此时,采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。 这个编码的规则:1)把3个字符变成4个字符;2)每76个字符 加一个换行符;3)最后的结束符也要处理。 5MD5 Message DigestAlgorithm MD5为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。 对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。 MD5被广泛用于各种软件的密码认证和钥匙识别上。MD5用的是哈希函数,它的典型应用是对一段信息(Message )产生信息摘要 (Message-Digest ),以防止被篡改。MD5的典型应用是对一段Message(字节串)产生fingerprint(指纹),以防止被“篡改”。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。MD5还广泛用于操作系统的登陆认证上,如Unix 、各类BSD 系统登录密码、数字签名等诸多方。 6SHA1SHA1(Secure Hash Algorithm )是和MD5一样流行的消息摘要算法。1995年,联邦信息处理标准(FIPS )发布了180-1,作为安 全散列标准。180-1出版的算法被定义为安全散列算法1( SHA1)。国家标准技术研究所(NIST )和国家安全局(NSA )开发了SHA1算法。 SHA1算法模仿MD4算法。现在有一个更新SHA1算法的FIPS 180-2草案。SHA1设计为和数字签名算法(DSA )一起使用。SHA1主要适用于数字签名标准(Digital Signature Standard DSS )里面定义的数字签名算法(DigitalSignature Algorithm DSA )。对于长度小于2^ 64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。SHA1不可以从消息摘要中复原信息,而两个不同的消息不会产生同样的消息摘要。这样,SHA1就可以验证数据的完整性,所以说SHA1是为了保证文件完整性的技术。 SHA1算法可以采用不超过264位的数据输入,并产生一个160位的摘要。输入被划分为512位的块,并单独处理。160位缓冲器用来保存散列函数的中间和最后结果。缓冲器可以由5个32位寄存器(A 、B 、C 、D 和E )来表示。 SHA1是一种比md5的安全性强的算法,理论上,凡是采取“消息摘要”方式的数字验证算法都是有“碰撞”的——— 也就是两个不同的东西算出的消息摘要相同,互通作弊图就是如此。但是安全性高的算法要找到指定数据的“碰撞”很困难,而利用公式来计算“碰撞”就更困 难———目前为止通用安全算法中仅有md5被破解。 密码算法是密码技术的核心,以上这些密码算法是常用的密码算法,而这些算法有些已经遭到破译,有些安全度不高,有些强度不明,有些待进一步分析,有些需要深入研究,而神秘的密码算法世界,又会有新的成员加入,期待更安全的算法诞生。 [参考文献] [1]电子商务中常用的RSA 算法实现.花蓓.商场现代化,2008.[2]分形数据加密算法.刘文涛,孙文生.信息通信技术,2008. 280

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