现代密码学
实
验
报
告
院系:
班级:
姓名:
qq设置在哪里找
学号:
前言
密码学(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.h" // 位处理
#include "tables.h"
void BitsCopy(bool *DatOut,bool *DatIn,int Len); // 数组复制
void ByteToBit(bool *DatOut,char *DatIn,int Num); // 字节到位
void BitToByte(char *DatOut,bool *DatIn,int Num); // 位到字节
void BitToHex(char *DatOut,bool *DatIn,int Num); // 二进制到十六进制 64位 to 4*16字符
void HexToBit(bool *DatOut,char *DatIn,int Num); // 十六进制到二进制
void TablePermute(bool *DatOut,bool *DatIn,const char *Table,int Num); // 位表置换函数
void LoopMove(bool *DatIn,int Len,int Num); // 循环左移 Len长度 Num移动位数
void Xor(bool *DatA,bool *DatB,int Num); // 异或函数
void S_Change(bool DatOut[32],bool DatIn[48]); // S盒变换
void F_Change(bool DatIn[32],bool DatKi[48]); // F函数
void SetKey(char KeyIn[8]); // 设置密钥
void PlayDes(char MesOut[8],char MesIn[8]); // 执行DES加密
void KickDes(char MesOut[8],char MesIn[8]); // 执行DES解密
int main()
{
int i=0;
char MesHex[16]={0}; // 16个字符数组用于存放 64位16进制的密文
char MyKey[8]={0}; // 初始密钥 8字节*8
char YourKey[8]={0}; // 输入的解密密钥 8字节*8
char MyMessage[8]={0}; // 初始明文
/*-----------------------------------------------*/
printf("Welcome! Plea input your Message(64 bit):\n");
gets(MyMessage); // 明文盆底肌肉
printf("Plea input your Secret Key:\n");
gets(MyKey); // 密钥
while(MyKey[i]!='\0') // 计算密钥长度
{
i++;
}
while(i!=8) // 不是8 提示错误
{
三国杀国战
printf("Plea input a correct Secret Key!\n");
gets(MyKey);
i=0;
while(MyKey[i]!='\0') // 再次检测
{
i++;
}
}
SetKey(MyKey); // 设置密钥 得到子密钥Ki
PlayDes(MesHex,MyMessage); // 执行DES加密
printf("Your Message is Encrypted!:\n"); // 信息已加密
完美英文
for(i=0;i<16;i++)
{
printf("%c ",MesHex[i]);
}
printf("\n");
printf("\n");
printf("Plea input your Secret Key to Deciphering:\n"); // 请输入密钥以解密
兴登堡号 gets(YourKey); // 得到密钥
讶 SetKey(YourKey); // 设置密钥
KickDes(MyMessage,MesHex); // 解密输出到MyMessage
禁毒口号
printf("Deciphering Over !!:\n"); // 解密结束
for(i=0;i<8;i++)
{
printf("%c ",MyMessage[i]);
}
printf("\n");
system("pau");
}
/*-------------------------------
把DatIn开始的长度位Len位的二进制
复制到DatOut后
--------------------------------*/