实验一 凯撒加密解密
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机安全基础上机实验报告
学院年级
专业班
学生姓名
学生学号
实验一凯撒加密解密
凯撒密码简介:恺撒密码的替换方法是通过排列明文和密文字母表,密文字母表示通过将
明文字母表向左或向右移动一个固定数目的位置。例如,当偏移量是左移3的时候(解密时
的密钥就是3):
明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ 密文字母表:DEFGHIJKLMNOPQRSTUVWXYZABC
使用时,加密者查找明文字母表中需要加密的消息中的每一个字母所在位置,并且写下密文字母表中对应的字母。需要解密的人则根据事先已知的密钥反过来操作,得到原来的明文。
例如:
明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG 密文:WKH TXLFN EURZQ IRA MXPSV RYHU WKH ODCB GRJ
源代码:
#include "kaisa.h"
using namespace std;
void Kaisa::setI()
{
cout << "\n请输入加密密码:";
cin >> i;
}
void Kaisa::jiami()
{
char a, b, c;
cout << "\n请输入明文:\t";
cin >> a;
b = char('z' - i%26);
c = char('Z' - i%26);
cout << "\n密文是:\t";
while(a != '\n')
{
if((a <= 'z' && a >= 'a') || ( a <= 'Z' && a >='A'))
{ if((a <= b && a >= 'a') || ( a <= c && a >='A'))
cout << char(a + i%26);
if(a > c && a <= 'Z')
cout << char(a + i%26 - 26);
if(a > b && a <= 'z')
cout << char(a + i%26 - 26);
if(a == ' ')
cout << " ";
}
else
cout << a;
a = cin.get();
}
cout << endl;
}
void Kaisa::setX()
{
cout << "\n请输入解密密码:";
cin >> i;
}
void Kaisa::jiemi()
{
char a, b, c;
cout << "\n请输入密文:\t";
cin >> a;
b = char('a' + i%26);
c = char('A' + i%26);
cout << "\n明文是:\t";
while(a != '\n')
{
if((a <= 'z' && a >= 'a') || ( a <= 'Z' && a >='A')) { if((a <= 'z' && a >= b) || ( a <= 'Z' && a >= c)) cout << char(a - i%26);
if(a >= 'a' && a < b)
cout << char(a - i%26 + 26);
if(a >= 'A' && a < c)
cout << char(a - i%26 + 26);
if(a == ' ')
cout << " ";
}
else
cout << a;
a = cin.get();
}
cout << endl;
}
int main()
{
while(1)
{
int t;
cout << "1.加密" << endl
<< "2.解密" << endl
<<"按其他键退出"< << "选择:"; cin >> t; Kaisa kaisa; if(t == 1) { kaisa.setI(); kaisa.jiami(); cout<<"加密完成\n"< } else if(t == 2) { kaisa.setX(); kaisa.jiemi(); cout<<"解密完成\n"< } else return 0; } } 测试:密钥:4,明文:abcdefg 实验结果: 实验二DES加密解密 加密原理:DES 使用一个56 位的密钥以及附加的8 位奇偶校验位,产生最大64 位 的分组大小。这是一个迭代的分组密码,使用称为Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用16 个循环,使用异或,置换,代换,移位操作四种基本运算。 源代码: #include #include #include"des_encode.h" int key[16][48]; char str[8]; void main() { EncodeMain(); } void EncodeMain() { int i; char keychar[8]; int key2[8]; int strkey[8]; printf("请输入8个要加密的字符:\n"); for(i=0;i<8;i++) scanf("%c",&str[i]); getchar(); for(i=0;i<8;i++) strkey[i]=str[i]; printf("\n输入明文的十六进制为:\n"); for(i=0;i<8;i++) printf("%10x",strkey[i]); printf("\n请输入密钥(8个字符):\n"); for(i=0;i<8;i++) scanf("%c",&keychar[i]); for(i=0;i<8;i++) key2[i]=keychar[i]; getchar(); Encode(strkey,key2); printf("\n加密后十六进制密文是:\n"); for(i=0;i<8;i++) printf("%10x",strkey[i]);