实验一 凯撒加密解密

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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]);

相关文档
最新文档