密码学课程设计实验报告Word文件下载.docx
- 文档编号:16191036
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:52
- 大小:461.88KB
密码学课程设计实验报告Word文件下载.docx
《密码学课程设计实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《密码学课程设计实验报告Word文件下载.docx(52页珍藏版)》请在冰豆网上搜索。
实现函数置换
//参数:
//_in:
输入数据
//_out:
输出数据
//_replace:
置换数组
//_length:
数据长度,以字节为单位
//返回值:
//总是返回0
//说明:
//输入数据、输出数据、置换数组的长度必须相同
//编写者:
//完成时间:
2011/2/14
//修改时间:
2011/2/16(测试通过)
intBaseCode:
:
Replace(char*_in,char*_out,constint_replace[],int_length)
{
//count_输入数据中的数组位置
//num_输入数据比特中位置
intcount_=0,num_=BYTESIZE;
//逐位获得输出数据
for(inti=0;
i<
_length/BYTESIZE;
i++)
{
for(intj=BYTESIZE-1;
j>
=0;
j--)
{
//获得置换位置
count_=(_replace[i*BYTESIZE+BYTESIZE-j-1]-1)/BYTESIZE;
num_=(_replace[i*BYTESIZE+BYTESIZE-j-1]-1)%BYTESIZE;
//获得输入数据的值
charmask_=1;
mask_=mask_<
<
(BYTESIZE-num_-1);
mask_=mask_&
_in[count_];
mask_==0?
mask_=0:
mask_=1;
//根据输入数据获得输出数据
*(_out+i)&
=~(0x01<
j);
*(_out+i)|=mask_<
j;
}
}
return0;
}
异或函数\src\BaseCode.cpp
实现异或功能
//_param1:
异或的一个输入
//_param2:
异或的另一个输入
//_result:
异或数据的输出
//_length:
//数据的长度必须一致。
2011/2/14(测试通过)
ByteAdd(char*_param1,char*_param2,char*_result,int_length)
//逐比特实现异或
_length/BYTESIZE;
_result[i]=_param1[i]^_param2[i];
DES算法实现\src\DesCode.cpp
完成DES加解密运算
输入数据块
输出数据块
//_mode:
模式,指定是加密还是解密
//_circle:
加解密圈数
//该函数完成DES的核心算法
2011/2/15
2011/2/17(测试通过)
intDESCode:
DES(constDESBlock_in,DESBlock_out,constDESKey_key,Mode_mode/*=Encrypt*/,int_circle/*=16*/)
chartemp_[BLOCKSIZE]={0};
charR_[BLOCKSIZE/2]={0};
//计算内部密钥
CountKey(_key,_mode,16);
//检查密钥安全性
if(CheckKey()==WeakKey)
SetLastError(_T("
对不起,你输入的是弱密钥!
"
));
return-1;
//初始置换
Replace((char*)_in,temp_,IP_replace,BLOCKSIZE*BYTESIZE);
i<
_circle;
i++)
//G函数
FuncG((HalfBlock)(temp_+BLOCKSIZE/2),m_keys[i],(HalfBlock)R_);
//完成按位加运算得到R
ByteAdd((char*)temp_,(char*)R_,(char*)R_,BLOCKSIZE*BYTESIZE/2);
//得到新的L和R
for(intj=0;
j<
BLOCKSIZE/2;
j++)
temp_[j]=temp_[BLOCKSIZE/2+j];
temp_[BLOCKSIZE/2+j]=R_[j];
charpc_;
//交换L和R的位置
pc_=temp_[i];
temp_[i]=temp_[BLOCKSIZE/2+i];
temp_[BLOCKSIZE/2+i]=pc_;
//未置换
Replace(temp_,(char*)_out,DE_IP_replace,BLOCKSIZE*BYTESIZE);
1.2
G函数实现
G函数实现\src\DESCode.cpp
实现DES加密中的G函数
输入数据数组
//_key:
相应的内部密钥
//_out:
输出数据存放数组
//总是返回
//无
2011/2/16
FuncG(HalfBlock_in,InKey_key,HalfBlock_out)
chartemp_[INKEYSIZE]={0};
chardata_={0};
unsignedcharmask_=1;
//E扩展置换
Replace((char*)_in,(char*)temp_,E_replace,INKEYSIZE*BYTESIZE);
//和内部密钥异或
ByteAdd((char*)temp_,(char*)_key,(char*)temp_,INKEYSIZE*BYTESIZE);
//经过S盒
unsignedcharline_=0,row_=0;
for(inti=0;
8;
line_=0;
row_=0;
//获得6bit数据
GetBit((char)temp_[6*i/8],6*i%8,&
line_,6);
GetBit((char)temp_[(6*i+1)/8],(6*i+1)%8,&
row_,4);
GetBit((char)temp_[(6*i+2)/8],(6*i+2)%8,&
row_,5);
GetBit((char)temp_[(6*i+3)/8],(6*i+3)%8,&
row_,6);
GetBit((char)temp_[(6*i+4)/8],(6*i+4)%8,&
row_,7);
GetBit((char)temp_[(6*i+5)/8],(6*i+5)%8,&
line_,7);
charoutput_=*(SP[i]+line_*16+row_);
*((char*)_out+4*i/8)&
=0x0f<
((i%2)*4);
*((char*)_out+4*i/8)|=output_<
(((i+1)%2)*4);
//进行P盒置换
temp_[i]=*((char*)_out+i);
Replace((char*)temp_,(char*)_out,P_replace,BLOCKSIZE*BYTESIZE/2);
1.3
内部密钥生成
内部密钥生成实现src\DESCode.cpp
计算内部密钥
//_key:
用户密钥
模式,指定是加密还是解密
加密或者解密圈数
/2/16
/2/16(测试通过)
CountKey(DESKey_key,Mode_mode,int_circle/*=16*/)
charkey_[7];
//密钥初始置换
Replace((char*)_key,key_,Key_replace,KEYSIZE*BYTESIZE);
//逐圈计算内部密钥
_circle;
//左移一位或者两位
LeftMove((DESKey)key_);
if(Key_Left_Move[i]==2)
LeftMove((DESKey)key_);
//PC选择置换
if(_mode==EncryptMode)
Replace((char*)key_,(char*)m_keys[i],PC_replace,INKEYSIZE*BYTESIZE);
else
Replace((char*)key_,(char*)m_keys[_circle-i-1],PC_replace,INKEYSIZE*BYTESIZE);
2.DES弱密钥过滤原理与编程实现(*)
2.1弱密钥定义
如果一个密钥生成的16个内部密钥相同,那么这个密钥就是弱密钥。
2.2弱密钥过滤程序实现
弱密钥过滤程序实现/src/DESCode.cpp
检测密钥的安全性
//对密钥检测的结果
//当前该函数只是用来检测输入的密钥是否为弱密钥
/2/18
/2/18(测试通过)
DESCode:
KeyTypeDESCode:
CheckKey()
KeyTypetype_=WeakKey;
//逐项匹配内部密钥,如果内部密钥相等认为是弱密钥
for(inti=1;
MAXCIRCLE;
j<
INKEYSIZE;
j++)
//只要检测到一项不相等即不是弱密钥
if(m_inkey[0][j]!
=m_inkey[i][j])
{
type_=NormalKey;
break;
}
returntype_;
3.DES短块处理(密文挪用)原理与编程实现
3.1
密文挪用加解密原理
密文挪用加密实现/src/BaseCode.cpp
加密数据
//_size:
输入数据长度,以字节为单位
密钥
//_keysize:
密钥长度,以字节为单位
//_circle:
圈数
//成功返回,失败返回-1
//当前只实现ECB模式,短块处理采用挪位方式
Encrypt(constchar*_in,char*_out,int_size,constchar*_key,int_keysize,int_circle)
intlength_=_size;
//获得分组长度
intsize_;
//加密分组长度
chartmp_[20];
//临时存放数据的数组
//DES算法
if(m_Alg==DESAlg)
size_=8;
//DES加密算法分组长度bits
//无法识别的算法
else
未知算法!
//密码本模式
if(m_Group==ECB)
//密码挪用模式,输入数据的长度必须不小于分块长度
if(m_Short==PeculateMode)
if(_size<
size_)
SetLastError(_T("
短块处理挪用模式的输入明文必须不小于分块大小!
return-1;
//逐项加密
for(inti=0;
length_-size_>
length_-=size_,i++)
if(EncryptBlock(_in+i*size_,_out+i*size_,_key,size_,_keysize,_circle)==-1)
//密码挪用模式
if(length_!
=0)
//获得最后一块,已加密部分
for(inti=0;
size_-length_;
{
tmp_[i]=_out[_size-size_+i];
}
//获得最后一块的明文部分
length_;
tmp_[size_-length_+i]=_in[_size-length_+i];
//加密最后一块
if(EncryptBlock(tmp_,_out+_size-size_,_key,size_,_keysize,_circle)==-1)
return-1;
//填充模式,未实现
elseif(m_Short==FillMode)
SetLastError(_T("
未知的短块处理方法!
return-1;
//密码分组链接模式,未实现
elseif(m_Group==CBC)
密文挪用解密实现/src/BaseCode.cpp
解密数据
Decrypt(constchar*_in,char*_out,int_size,constchar*_key,int_keysize,int_circle)
UnknownAlgorithms!
//短块处理挪用模式
//逐项解密
if(DecryptBlock(_in+i*size_,_out+i*size_,_key,size_,_keysize,_circle)==-1)
if(DecryptBlock(_in+_size-size_,_out+_size-size_,_key,size_,_keysize,_circle))
//获得最后一块
tmp_[i]=_in[_size-size_-length_+i];
tmp_[length_+i]=_out[_size-size_+i];
//重新解密倒数第二块
if(DecryptBlock(tmp_,_out+_size-size_-length_,_key,size_,_keysize,_circle)==-1)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 密码学 课程设计 实验 报告