DES数据加密算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
上海电力学院
实验报告
课程名称信息安全/计算机安全实验项目实验一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 是对数据进行加密还是解密