一、实验目的
理解、掌握DES分组密码算法流程。
二、实验内容
二、DES分组密码算法流程
四、实验过程
工具函数:
ByteTobit将字节转换成二进制
BitToByte二进制转换成字节
Char8ToBit64 将长度为8的字符串转为二进制位串
Bit64ToChar8 将二进制位串转为长度为8的字符串
DES相关函数:
DES_MakeSubKeys 生成子密钥
DES_PC1_Transform 密钥置换1
DES_PC2_Transform 密钥置换2
DES_ROL循环左移
DES_IP_Transform IP置换
DES_IP_1_Transform IP逆置换
DES_E_Transform 扩展置换(E置换)
DES_P_Transform P置换
DES_XOR 异或
DES_SBOX S盒置换
DES_Swap 交换
DES_EncryptBlock 加密单个分组(8字节)
DES_DecryptBlock 解密单个分组(8字节)
DES_Encrypt 加密任意长度文件
DES_Decrypt 解密任意长度文件
int main()
{
/*明文 加密后的密文 密钥 解密后的结果*/
ElemType plainBlock[8],cipherBlock[8], keyBlock[8],resultBlock[8];
/*二进制流 子密钥*/
ElemType bKey[64],subKeys[16][48];
char *keyStr = "12345678";
/* 设置密钥,因为keyStr是9位的,结尾多了\0 */
memcpy(keyBlock, keyStr, 8);
/*将密钥转换为二进制流*/
Char8ToBit64(keyBlock, bKey);
/*生成子密钥*/
DES_MakeSubKeys(bKey, subKeys);
//1、加密
char * text = "12345678";
memcpy(plainBlock, text, 8);
DES_EncryptBlock(plainBlock, subKeys, cipherBlock);
printf("加密完成\n");
for (int i = 0; i < 8; i++)
printf("%c", cipherBlock[i]);
printf("\n");
//2、解密
DES_DecryptBlock(cipherBlock, subKeys, resultBlock);
printf("解密完成\n");
for(int i=0;i<8;i++)
printf("%c", resultBlock[i]);
printf("\n");
getchar();
return 0;
}
五、实验结果:
输入的明文是"12345678"
注意:由于直接打印string的话,得遇到\0才会停止,会有多余的输出,所以这里使用了for循环只打印8个字符,密文长度和明文相同
int DES_Encrypt(char *plainFile, char *keyStr, char *cipherFile);
int DES_Decrypt(char *cipherFile, char *keyStr, char *plainFile);
int main()
{
//把1.txt文件的内容加密后放到2.txt里
//再把2.txt文件的内容解密,放到3.txt里
DES_Encrypt("1.txt", "12345678", "2.txt");
printf("加密完成\n");
DES_Decrypt("2.txt", "12345678", "3.txt");
printf("解密完成\n");
return 0;
}
1.txt文件 明文
1234567890123456789012345678901234567890
2.txt文件 密文
?躊克?谀9蟮?晕2_x0016__x0019_两~)懕?芻JubK/F氽D鍬逘&稟
3.txt文件 解密后的密文
1234567890123456789012345678901234567890
* 特别注意在这里我的UTF8编码的文本文档的开头三个字符为EF BB BF,所以总字符为43个而不是40个