没有合适的资源?快使用搜索试试~ 我知道了~
密码学实验报告.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 87 浏览量
2022-11-10
21:06:04
上传
评论
收藏 625KB PDF 举报
温馨提示
试读
21页
。。。
资源推荐
资源详情
资源评论
密码学实验报告
学院: 计算机科学与技术
班级:
学号:
姓名:
指导老师:
密码学 实验日志
实验题目
:
DES(或 AES)分组密码
实验目的
:
熟悉分组密码加解密算法的基本原理,加深对所提供的部分源程序的理解;
分组密码将明文分成一组一组,在密钥的控制下,经过加密变换生成一组一组的密文。
具 体 而 言 , 分 组 密 码 就 是 将 明 文 消 息 序 列
m
1
, m
2
,, m
i
,
划 分 成 等 长 的 消 息 组
(
m
1
,
m
2
,,
m
n
), (
m
n1
,
m
n2
,,
m
2n
),
在密钥
k
k
1
,k
2
,
,k
t
的控制下按固定的加密算法一组一
组进行加密,输出一组一组密文
(c
1
,c
2
,,c
l
),(c
l1
,c
l2
,,c
2l
),
。
下面的实验以 DES 算法为例,DES 算法明文分组长为 64bit,加密后得到 64bit 的密文,输
入初始种子密钥为 64bit,第 8、16、24、32、40、48、56、64 为奇偶校验位,实际的密钥
长为 56bit。DES 加密过程由三个阶段来完成:
(1) 初始置换 IP,用于重排明文分组的 64bit 数据;
(2) 相同结构的 16 轮迭代,每轮中都有置换和代换运算,第 16 轮变换的输出分为左右两半,
并交换次序。
-1
(3) 逆初始置换 IP (为 IP 的逆)后,产生 64bit 的密文。
实验要求:
(1) Windows 系列操作系统;
(2) VC6.0 编程环境。
(3) 提交完整的程序代码清单和详细的注释;
(4) 要求有程序运行结果显示。当加密成功时,得到密文;输入相同的密钥,能将密文恢复
成明文。
实验主要步骤:
(1) 熟悉分组密码加解密算法的基本原理,加深对所提供的部分源程序的理解;
(2) 分析源程序中密码算法的加解密和子密钥生成等典型模块的主要功能,并对源程序加上
注释;
(3) 在已提供的部分源程序的基础上,添加源程序省缺的部分;
(4) 对给定的消息分组进行加解密运算和验证。
源代码:
#include <stdio.h>
#include <memory.h>
#include <string.h>
typedef bool (*PSubKey)[16][48];
enum {ENCRYPT,DECRYPT}; //选择:加密;解密
static bool SubKey[2][16][48]; // 16 圈子密钥
static bool Is3DES; // 3 次 DES 标志
static char Tmp[256], deskey[16]; //暂存字符串,密钥串
static void DES(char Out[8], char In[8], const PSubKey pSubKey, bool Type);//标准 DES 加/解密
static void SetKey(const char* Key, int len);// 设置密钥
static void SetSubKey(PSubKey pSubKey, const char Key[8]);// 设置子密钥
static void F_func(bool In[32], const bool Ki[48]);// f 函数
static void S_func(bool Out[32], const bool In[48]);// S 盒代替
static void Transform(bool *Out, bool *In, const char *Table, int len);// 变换
static void Xor(bool *InA, const bool *InB, int len);// 异或
static void RotateL(bool *In, int len, int loop);// 循环左移
static void ByteToBit(bool *Out, const char *In, int bits);// 字节组转换成位组
static void BitToByte(char *Out, const bool *In, int bits);// 位组转换成字节组
// Type(选择)—ENCRYPT:加密,DECRYPT:解密
// 输出缓冲区(Out)的长度 >= ((datalen+7)/8)*8,即比 datalen 大的且是 8 的倍数的最小正整数
// In 可以= Out,此时加/解密后将覆盖输入缓冲区(In)的内容
// 当 keylen>8 时系统自动使用 3 次 DES 加/解密,否则使用标准 DES 加/解密.超过 16 字节后
只取前 16 字节
//加密解密函数:
bool DES_Act(char *Out,char *In,long datalen,const char *Key,int keylen,bool Type =
ENCRYPT);
void main()
{
char plain_text[100]; // 设置明文
char key[100] ; // 密钥设置
printf("请输入明文:\n");
gets(plain_text);
printf("\n 请输入密钥:\n");
gets(key);
char encrypt_text[255]; // 密文
char decrypt_text[255]; // 解密文
memset(encrypt_text,0,sizeof(encrypt_text));
memset(decrypt_text,0,sizeof(decrypt_text));
// 进行 DES 加密:
DES_Act(encrypt_text, plain_text, sizeof(plain_text), key, sizeof(key), ENCRYPT);
printf("\nDES 加密后的密文:\n");
printf("%s\n\n",encrypt_text);
// 进行 DES 解密:
DES_Act(decrypt_text, encrypt_text, sizeof(plain_text), key, sizeof(key), DECRYPT);
printf("\n 解密后的输出:\n");
printf("%s",decrypt_text);
printf("\n\n");
getchar();
}
//下面是 DES 算法中用到的各种表:
// 初始置换 IP 表
const static char IP_Table[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
};
// 逆初始置换 IP1 表
const static char IP1_Table[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
};
// 扩展置换 E 表
static const char Extension_Table[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
};
// P 盒置换表
const static char P_Table[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
};
剩余20页未读,继续阅读
资源评论
G11176593
- 粉丝: 6646
- 资源: 3万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功