实验二 密码置换.docx
《实验二 密码置换.docx》由会员分享,可在线阅读,更多相关《实验二 密码置换.docx(13页珍藏版)》请在冰点文库上搜索。
实验二密码置换
实验二密码置换
一.单表置换密码
(1)单击“密码工具”按钮,进入“加密解密”|“单表置换”|“加密/解密”视图,与同组主机协商好一个密钥词组k=key。
(2)根据“单表置换”实验原理计算出置换表。
(3)计算完成置换表以后,在明文输入区输入明文,单击“加密”按钮用置换表的对应关系对明文进行加密,加密完成后,单击“导出”按钮,将密文导出到SingleTable共享目录中,并通告同组主机获取密文。
请将明文记录在这里:
hello。
(4)单击“导入”按钮将同组主机单表置换密文导入,根据同组主机置换表完成本机置换表,单击“解密”按钮对密文进行解密。
SJKVT
(5)本机将解密后的明文与同组主机记录的明文对照,如果双方的明文一致,则说明实验成功,否则说明本机或同组主机的置换表计算错误。
1)图1是由统计学得出的英文字母相对频率表。
由图1可以看出,英文字母E出现的频率最高,而J和Z出现的频率最低,这样,就可以通过英文字母出现的频率大致上判定单表置换密码的置换表,从而得到明文。
(2)本机进入“密码工具”|“加密解密”|“单表置换”|“密码分析”页面,单击“导入”按钮,将密文“单表置换密码分析密文.txt”导入,单击“统计”按钮,统计密文中每个字母出现的频率,回答下列问题:
在密文中出现频率最高的字母是A。
与上表比较,它可能是由字母E置换的。
(3)置换表组框中点击“解密”按钮,这时将得到一个明文。
然而此时的明文并不是最终要得到的,可以通过明文的特征和各个字母的比例来调节置换表中的对应关系,从而得到正确的明文。
依此类推便可以得到明文,请根据你的置换表填写表1。
a
b
c
d
e
f
g
h
i
j
k
l
M
O
G
K
N
A
D
H
E
F
Z
V
R
W
n
o
p
q
r
s
t
u
v
w
x
y
z
L
M
I
Q
C
S
T
T
B
P
X
U
G
三.源码应用(选做)
设计单表置换加密工具,利用单表置换加密算法对文件进行加密。
单击工具栏“单表置换加密工具工程”按钮。
基于此工程进行程序设计。
实验五惟吉尼亚算法
(1)本机单击“密码工具”按钮,进入“加密解密”|“维吉尼亚密码”|“加密/解密”视图,与同组主机协商好密钥=key(此密钥分成标准和扩展型,在实验中自行选择)。
「注」标准型使用26*26矩阵与26取模,扩展型使用94*94矩阵与94取模。
(2)本机在明文输入区输入明文,单击“加密”按钮对明文进行加密,加密完成后,单击“导出”按钮,将密文导出到D:
\Work\Encryption\Vigenere共享目录中,并通告同组主机通过访问共享文件夹获取密文。
请将明文记录在这里:
helloworld。
(3)同组主机打开工具面板中的密码工具,单击“导入”按钮,即将D:
\Work\Encryption\Vigenere中的维吉尼亚密文导入,填入协商好的密钥,单击“解密”按钮对密文进行解密。
(4)本机将解密后的明文与同组主机记录的明文对照,如果双方的明文一致,则说明实验成功,否则说明本机或同组主机的维吉尼亚密码计算错误。
密文:
rijvsuyvjn
一.DES加密解密
(1)本机进入“密码工具”|“加密解密”|“DES加密算法”|“加密/解密”页签,在明文输入区输入明文:
straight。
(2)在密钥窗口输入8(64位)个字符的密钥k,密钥k=fforward。
单击“加密”按钮,将密文导出到DES文件夹(D:
\Work\Encryption\DES\)中,通告同组主机获取密文,并将密钥k告诉同组主机。
(3)单击“导入”按钮,从同组主机的的DES共享文件夹中将密文导入,然后在密钥窗口输入被同组主机通告的密钥k,点击“解密”按钮进行DES解密。
(4)将破解后的明文与同组主机记录的明文比较。
密文:
3329F781095AAFD7
二.DES算法
本机进入“密码工具”|“加密解密”|“DES加密算法”|“演示”页签,向64位明文中输入8个字符(8*8bit=64),向64位密钥中输入8个字符(8*8bit=64)。
点击“加密”按钮。
完成加密操作,分别点击“初始置换”、“密钥生成演示”、“十六轮加密变换”和“终结置换”按钮,查看初始置换、密钥生成演示、十六轮加密变换和终结置换的详细加密操作流程。
二.3DES加密解密
(1)本机进入“密码工具”|“加密解密”|“3DES加密算法”|“加密/解密”视图,确定好密钥K1和K2=__straight___fforward_________。
(2)在明文输入区输入明文(明文为英文),单击“加密”按钮对明文进行加密,加密完成后,单击“导出”按钮,将密文导出到D:
\Work\Encryption\3DES共享目录中,并通告同组主机获取密文,获取后存放在D:
\Work\Encryption\3DES目录下。
单击“重置”按钮,恢复原始状态。
helloworldthisisalittlegirl
(3)同组主机单击“导入”按钮,选择将要导入的密文,填入密钥,单击“解密”按钮对密文进行解密。
(4)将解密后的明文与解密前记录的明文对照,如果双方的明文一致,则说明实验成功,否则说明解密前或导入后的3DES加密算法计算错误。
1110011110000100110100011011101100000000110001101000101011001011110110011110001100010010101000100110010000011011000011000000010011001001100100111101100010100001101001001011111111000100110000001111111101101001111100101000110000111011111101000000000111110010
一.AES加密解密
(1)本机进入“密码工具”|“加密解密”|“AES加密算法”|“加密/解密”页签,在明文输入区输入明文:
straightforwardf。
(2)在密钥窗口输入16(128位)个字符的密钥k,要记住这个密钥以用于解密,密钥k=fdrawrofthgiarts。
单击“加密”按钮,将密文导出到AES文件夹(D:
\Work\Encryption\AES\)中,通告同组主机获取密文,并将密钥k告诉同组主机。
(3)单击“导入”按钮,从同组主机的AES共享文件夹中将密文导入,然后在密钥窗口输入被同组主机通告的密钥k,点击“解密”按钮进行AES解密。
(4)将破解后的明文与同组主机记录的明文比较。
AE83BCFD62FB801EE9585A23176C7B50
二.AES算法
进入“密码工具”|“加密解密”|“AES加密算法”|“演示”页签。
输入128位明文与密钥,执行加密操作,查看各演示模块。
根据实验原理中对AES加密算法的SubBytes变换和ShiftRows变换的介绍,对于以下给出的状态矩阵:
请计算它的SubBytes变换,以及经过SubBytes变换之后,再经过ShiftRows变换的结果。
SubBytes变换
C9
59
82
F0
C0
E1
E0
A4
76
C5
C5
F2
77
ED
59
16
ShiftRows变换
C9
59
82
F0
E1
E0
A4
C0
C5
F2
76
C5
16
77
ED
59
/******************************************************************************/
//工程:
DES
//功能:
DES加、解密文件
//作者:
jlcss|ExpNIS
/******************************************************************************/
#include
#include
#include
#include
#include"des.h"
#include
#defineDECRYPT_FILE"DES加密密文.txt"
#defineENCRYPT_FILE"DES解密明文.txt"
//!
约束文件最大2M
#defineMAX_FILE1024*1024*2
/******************************************************************************/
//名称:
usage
//功能:
帮助信息
//参数:
应用程序名称
//返回:
提示信息
/******************************************************************************/
voidUsage(constchar*appname)
{
printf("\n\tusage:
des-e明文文件64位密钥\n");
printf("\tusage:
des-d密文文件64位密钥\n");
}
/******************************************************************************/
//名称:
FileIn
//功能:
读取磁盘文件到内存
//参数:
strFile:
文件名称;inBuff:
指向文件内容缓冲区
//返回:
实际读取内容大小(字节)
/******************************************************************************/
intFileIn(constchar*strFile,unsignedchar*&inBuff)
{
intiFileLen=0;
//!
打开密文文件
CFilefile(strFile,CFile:
:
modeRead);
iFileLen=(int)file.GetLength();
if(iFileLen>MAX_FILE)
{
printf("文件长度不能大于%dM,!
\n",MAX_FILE/(1024*1024));
gotoout;
}
inBuff=newunsignedchar[iFileLen+1];
if(!
inBuff)
gotoout;
file.Read(inBuff,iFileLen);
file.Close();
inBuff[iFileLen]=0;
out:
returniFileLen;
}
/******************************************************************************/
//名称:
FileOut
//功能:
加/解密结果输出到当前目录磁盘文件中
//参数:
strOut指向输出字符缓冲区,输出大小len,strFile为输出文件
//返回:
无
/******************************************************************************/
voidFileOut(constvoid*strOut,intlen,constchar*strFile)
{
//!
输出到文件
CFileoutfile(strFile,CFile:
:
modeCreate|CFile:
:
modeWrite);
outfile.Write(strOut,len);
outfile.Close();
}
/******************************************************************************/
//名称:
CheckParse
//功能:
校验应用程序入口参数
//参数:
argc等于main主函数argc参数,argv指向main主函数argv参数
//返回:
若参数合法返回true,否则返回false
//备注:
简单的入口参数校验
/******************************************************************************/
boolCheckParse(intargc,char**argv)
{
if((argc!
=4)||
(argv[1][1]!
='e'&&argv[1][1]!
='d')||
(strlen(argv[3])>(64/8)))
{
Usage(argv[0]);
returnfalse;
}
returntrue;
}
voidConvertToStr(constbit*p,intlength,std:
:
string&str)
{
charstrTmp[1000]={0};
str.empty();
for(inti=0;i{
intn=(p[i]*8)+(p[i+1]*4)+(p[i+2]*2)+(p[i+3]*1);
sprintf(strTmp,"%0X",n);
str+=strTmp;
}
}
//!
程序主函数(UseMFCinaSharedDLL)
intmain(intargc,char**argv)
{
clock_ta,b;
a=clock();
DES_Encrypt("1.txt","key.txt","2.txt");
b=clock();
printf("加密消耗%d毫秒\n",b-a);
system("pause");
a=clock();
DES_Decrypt("2.txt","key.txt","3.txt");
b=clock();
printf("解密消耗%d毫秒\n",b-a);
getchar();
return0;
}