实验一 古典密码-Vigernere算法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
word[i] = k + 'A';
}
else
{
word[i] = en_word[i];
}
}
word[i]='\0';
printf("Decrypt string:");
puts(word);
}
int main(void)
{
char key[BUF_MAX], ch;
char str[BUF_MAX] = {'\0'};
i = 0;
do
{
scanf("%c", &ch);
str[i++] = ch;
}
while (ch != '\n' && i < BUF_MAX);
printf("Please input the key:");
scanf("%s",key);
UpperKey(key);
return 0;
}
程序运行结果:
int key_length = strlen(key);
int word_length = strlen(word);
int i, j, k;
for(i = 0; i < word_length; i++)
{
j = i % key_length;
if (word[i] >= 'a' && word[i] <= 'z')
三,实验过程及内容
源程序
#include "stdio.h"
#include "string.h"
#define BUF_MAX 100
static int square[27][27];
//密钥统一转换为大写字母
void UpperKey(char key[])
{
int key_length = strlen(key);
实验
班级:学号:姓பைடு நூலகம்:
一、实验目的
1、理解简单加密算法的原理;
2、掌握Vigenere密码的原理,完成Vigenere密码加解密程序的编写;
3、通过实验,加深对古典密码体制的了解,掌握对字符进行灵活处理的方法。
二,实验要求
根据Vigenere密码的原理编写程序,对输入的符号串能够根据设置的密钥分别正确实现Vigenere加密和解密功能。
Vigenere加密
图1Vigenere加密结果
2、Vigenere解密
图2Vigenere解密结果(输入正确密钥)
图3Vigenere解密结果(输入错误密钥)
四,实验中的问题及心得
示范源程序在DEV C++ 上运行时存在一个不足,就是选择输入错误时加密文件和秘钥输入后会提示输入错误,但不会在进行输入程序就结束了,所以我对代码进行部分调整,使选择输入错误时,继续输入字符串和秘钥,然后报错后可以重新选择输入。本次试验主要是要加深对古典密码体制的了解,掌握对字符进行灵活处理的方法。根据Vigenere密码的原理编写程序,对输入的符号串能够根据设置的密钥分别正确实现Vigenere加密和解密功能,由于长时间没有进行编程训练,一些以前掌握的编程技巧现在都不熟悉了,作为计算机专业的学生,还是要注意平时的训练,熟能生巧。
text[i] = k + 'A';
}
else
{
text[i] = word[i];
}
}
text[i] = '\0';
printf("Encrypt string:");
puts(text);
}
//Vigenere解密
void VigenereDecript(char en_word[], char key[])
{
char word[BUF_MAX];
int key_length = strlen(key);
int word_length = strlen(en_word);
int i, j, k;
for(i = 0; i < word_length; i++)
{
j = i % key_length;
if (en_word[i] >= 'a' && en_word[i] <= 'z')
for(int i = 0; i < key_length; i++)
{
if (key[i] >= 'a' && key[i] <= 'z')
{
key[i] -= 32;
}
}
}
//Vigenere加密
void VigenereEncrypt(char word[], char key[])
{
char text[BUF_MAX];
}
}
}
printf("\nVigenere Code");
printf("\n1:Encryption");
printf("\n2:Decryption");
printf("\nPlease input your choose:");
for(i=0; ; i++){
scanf("%d", &j);
if (j==1)
{
k = en_word[i] - 'a';
k = (k - (key[j] - 'A') + 26) % 26;
word[i] = k + 'a';
}
else if (en_word[i] >= 'A' && en_word[i] <= 'Z')
{
k = en_word[i] - 'A';
k = (k - (key[j] - 'A') + 26) % 26;
{
k = word[i] - 'a';
k = (k + key[j] - 'A') % 26;
text[i] = k + 'a';
}
else if (word[i] >= 'A' && word[i] <= 'Z')
{
k = word[i] - 'A';
k = (k + key[j] - 'A') % 26;
{
VigenereEncrypt(str, key);
break;}
else if(j==2)
{
VigenereDecript(str,key);
break;}
else
{
printf("输入错误,重新输入:\n");
}
}
fflush(stdin);
printf("Please input a string:");
int i, j;
//初始化Vigenere方阵
for(i = 1; i < 27; i++)
{
for(j = 1; j < 27; j++)
{
square[i][j]= 63 + i + j;
if(square[i][j] > 90)
{
square[i][j] = square[i][j] - 26;
}
else
{
word[i] = en_word[i];
}
}
word[i]='\0';
printf("Decrypt string:");
puts(word);
}
int main(void)
{
char key[BUF_MAX], ch;
char str[BUF_MAX] = {'\0'};
i = 0;
do
{
scanf("%c", &ch);
str[i++] = ch;
}
while (ch != '\n' && i < BUF_MAX);
printf("Please input the key:");
scanf("%s",key);
UpperKey(key);
return 0;
}
程序运行结果:
int key_length = strlen(key);
int word_length = strlen(word);
int i, j, k;
for(i = 0; i < word_length; i++)
{
j = i % key_length;
if (word[i] >= 'a' && word[i] <= 'z')
三,实验过程及内容
源程序
#include "stdio.h"
#include "string.h"
#define BUF_MAX 100
static int square[27][27];
//密钥统一转换为大写字母
void UpperKey(char key[])
{
int key_length = strlen(key);
实验
班级:学号:姓பைடு நூலகம்:
一、实验目的
1、理解简单加密算法的原理;
2、掌握Vigenere密码的原理,完成Vigenere密码加解密程序的编写;
3、通过实验,加深对古典密码体制的了解,掌握对字符进行灵活处理的方法。
二,实验要求
根据Vigenere密码的原理编写程序,对输入的符号串能够根据设置的密钥分别正确实现Vigenere加密和解密功能。
Vigenere加密
图1Vigenere加密结果
2、Vigenere解密
图2Vigenere解密结果(输入正确密钥)
图3Vigenere解密结果(输入错误密钥)
四,实验中的问题及心得
示范源程序在DEV C++ 上运行时存在一个不足,就是选择输入错误时加密文件和秘钥输入后会提示输入错误,但不会在进行输入程序就结束了,所以我对代码进行部分调整,使选择输入错误时,继续输入字符串和秘钥,然后报错后可以重新选择输入。本次试验主要是要加深对古典密码体制的了解,掌握对字符进行灵活处理的方法。根据Vigenere密码的原理编写程序,对输入的符号串能够根据设置的密钥分别正确实现Vigenere加密和解密功能,由于长时间没有进行编程训练,一些以前掌握的编程技巧现在都不熟悉了,作为计算机专业的学生,还是要注意平时的训练,熟能生巧。
text[i] = k + 'A';
}
else
{
text[i] = word[i];
}
}
text[i] = '\0';
printf("Encrypt string:");
puts(text);
}
//Vigenere解密
void VigenereDecript(char en_word[], char key[])
{
char word[BUF_MAX];
int key_length = strlen(key);
int word_length = strlen(en_word);
int i, j, k;
for(i = 0; i < word_length; i++)
{
j = i % key_length;
if (en_word[i] >= 'a' && en_word[i] <= 'z')
for(int i = 0; i < key_length; i++)
{
if (key[i] >= 'a' && key[i] <= 'z')
{
key[i] -= 32;
}
}
}
//Vigenere加密
void VigenereEncrypt(char word[], char key[])
{
char text[BUF_MAX];
}
}
}
printf("\nVigenere Code");
printf("\n1:Encryption");
printf("\n2:Decryption");
printf("\nPlease input your choose:");
for(i=0; ; i++){
scanf("%d", &j);
if (j==1)
{
k = en_word[i] - 'a';
k = (k - (key[j] - 'A') + 26) % 26;
word[i] = k + 'a';
}
else if (en_word[i] >= 'A' && en_word[i] <= 'Z')
{
k = en_word[i] - 'A';
k = (k - (key[j] - 'A') + 26) % 26;
{
k = word[i] - 'a';
k = (k + key[j] - 'A') % 26;
text[i] = k + 'a';
}
else if (word[i] >= 'A' && word[i] <= 'Z')
{
k = word[i] - 'A';
k = (k + key[j] - 'A') % 26;
{
VigenereEncrypt(str, key);
break;}
else if(j==2)
{
VigenereDecript(str,key);
break;}
else
{
printf("输入错误,重新输入:\n");
}
}
fflush(stdin);
printf("Please input a string:");
int i, j;
//初始化Vigenere方阵
for(i = 1; i < 27; i++)
{
for(j = 1; j < 27; j++)
{
square[i][j]= 63 + i + j;
if(square[i][j] > 90)
{
square[i][j] = square[i][j] - 26;