沧州英文网站制作,wordpress调用用户名,ftp 网站管理,南昌网站搭建实验四、古典密码#xff08;上#xff09;
一、实验目的
1、 通过本次实验#xff0c;了解古典加密算法的主要思想#xff0c;掌握常见的古典密码。 2、 学会应用古典密码#xff0c;掌握针对部分古典密码的破译方法。
二、原理简介
古典密码的编码方法主要有两种上
一、实验目的
1、 通过本次实验了解古典加密算法的主要思想掌握常见的古典密码。 2、 学会应用古典密码掌握针对部分古典密码的破译方法。
二、原理简介
古典密码的编码方法主要有两种置换和代替。置换密码重新排列明文中字符的顺序不改变字符本身代替密码不改变明文中的字符顺序而是将字符替换成其他字符。置换密码通常主要包括列置换和周期置换 2种代替密码则主要包括单表代替密码和多表代替密码2种。
三、实验内容
1、仿射密码Affine Cipher
1、算法原理
加密原理 由式 c (k * p b) mod 26 可得仿射密码的加密原理为先将明文进行0~25字母编码再按照该式计算出密文对应位置的字母编码最后从密文的字母编码还原出密文对应位置的字母得到密文。
解密原理 由 c (k * p b) mod 26得p (c – b) * (1/k) mod 26其中1/k为k在模26下的逆元。先将密文进行0~25字母编码再按照该式计算出明文对应位置字母的编码最后从明文的字母编码还原出明文字母得到明文。
2、算法流程
本算法的大致流程如下图所示 3、算法的代码实现C语言
#include stdio.h
#include string.hchar plaintext[10010] { 0 };
char ciphertext[10010] { 0 };
int plain[10010] { 0 };
int cipher[10010] { 0 };
int k, b;
void encrypt(char plaintext[], int k, int b);
void decrypt(char ciphertext[], int k, int b);
int euclid(int a, int b);
int inverse(int a);int main()
{int input;printf(请输入选项1为加密2为解密\n);scanf(%d, input);printf(请输入k的值\n);scanf(%d, k);printf(请输入b的值\n);scanf(%d, b);printf(你输入的值为k %d, b %d\n, k, b);if(input 1){// 加密printf(请输入要加密的明文);scanf(%s, plaintext);printf(加密结果\n);encrypt(plaintext, k, b);}else if(input 2){// 解密printf(请输入要解密的密文);scanf(%s, ciphertext);printf(解密结果\n);decrypt(ciphertext, k, b);}elseprintf(错误的选项只能为1或2。程序退出。);return 0;
}void encrypt(char plaintext[], int k, int b)
{int i;if(euclid(k, 26) ! 1){printf(wrong k. try again\n);return;}else{for(i 0;i strlen(plaintext);i ){plain[i] plaintext[i] - a;cipher[i] (plain[i] * k b) % 26;ciphertext[i] cipher[i] a;}puts(ciphertext);return;}return;
}void decrypt(char ciphertext[], int k, int b)
{int i;for(i 0;i strlen(ciphertext);i ){cipher[i] ciphertext[i] - a;plain[i] ((cipher[i] - b) * inverse(k)) % 26;if(plain[i] 0){plaintext[i] plain[i] a;}else{plaintext[i] plain[i] 26 a;}}puts(plaintext);return;
}int euclid(int a, int b)
{if(b 0){return a;}else{return euclid(b, a % b);}
}int inverse(int a)
{int i;for(i 1;i 26;i ){if((a * i) % 26 1){return i;}}return -1;
}4、算法测试
加密过程演示
参数k 3, b 3, 明文ciphertext
运行截图 得到的密文jbwypcipui
解密过程演示
参数k 3, b 3, 密文jbwypcipui
运行截图 得到的明文ciphertext
“鲁棒性”
1、输入了错误的选项 2、输入的k和26不互素 2、单表代替密码Substitution Cipher
1、算法原理
加密原理利用代替表将明文中的每个字符映射到密文。 解密原理通过对代替表进行反向查找由密文映射回明文。
2、算法流程
加密流程 解密流程 3、算法的代码实现C语言
#include stdio.h
#include string.hchar sub_table[26] {q,a,z,w,s,x,e,d,c,r,f,v,t,g,b,y,h,n,u,j,m,i,k,l,o,p};
char plaintext[10010] { 0 };
char ciphertext[10010] { 0 };
int plain[10010] { 0 };
int cipher[10010] { 0 };void sub_encrypt(char plaintext[]);
void sub_decrypt(char ciphertext[]);int main()
{int input;printf(请输入选项1为加密2为解密\n);scanf(%d, input);if(input 1){// 加密printf(请输入要加密的明文);scanf(%s, plaintext);printf(加密结果\n);sub_encrypt(plaintext);}else if(input 2){// 解密printf(请输入要解密的密文);scanf(%s, ciphertext);printf(解密结果\n);sub_decrypt(ciphertext);}elseprintf(错误的选项只能为1或2。程序退出。);return 0;
}// 加密函数
void sub_encrypt(char plaintext[])
{int i;for(i 0;i strlen(plaintext);i ){plain[i] plaintext[i] - a;ciphertext[i] sub_table[plain[i]];}puts(ciphertext);return;
}// 解密函数
void sub_decrypt(char ciphertext[])
{int i, j;for(i 0;i strlen(ciphertext);i ){for(j 0;j 26;j ){if(ciphertext[i] sub_table[j]){plaintext[i] j a;}}}puts(plaintext);
}4、算法测试
加密过程演示
明文thisisastring 密文jdcucuqujncge 运行截图 解密过程演示
密文jdcucuqujncge 明文thisisastring
运行截图 3、维吉尼亚密码Vigenere Cipher
1、算法原理及流程
加密原理加密过程的一般方程是 Ci (pi k(i mod m)) mod 26通过该方程即可由明文得到密文 解密原理解密过程是加密过程的逆过程解密过程的一般方程是pi (Ci – k(i mod m)) mod 26.
2、算法的代码实现C语言
#include stdio.h
#include string.hchar plaintext[10010] { 0 };
char ciphertext[10010] { 0 };
int plain[10010] { 0 };
int cipher[10010] { 0 };char key[20] { 0 };void vig_encrypt(char plaintext[], char key[]);
void vig_decrypt(char ciphertext[], char key[]);int main(){printf(该程序实现维吉尼亚密码。请输入密钥\n);gets(key);int input;printf(请输入选项1为加密2为解密\n);scanf(%d, input);if(input 1){// 加密printf(请输入要加密的明文);scanf(%s, plaintext);printf(加密结果\n);vig_encrypt(plaintext, key);}else if(input 2){// 解密printf(请输入要解密的密文);scanf(%s, ciphertext);printf(解密结果\n);vig_decrypt(ciphertext, key);}elseprintf(错误的选项只能为1或2。程序退出。);return 0;
}// 加密函数
void vig_encrypt(char plaintext[], char key[])
{int i;for(i 0;i strlen(plaintext); i ){plain[i] plaintext[i] - a;cipher[i] (plain[i] (key[(i % strlen(key))] - a)) % 26;ciphertext[i] cipher[i] a; }puts(ciphertext);return;
}// 解密函数
void vig_decrypt(char ciphertext[], char key[])
{int i;for(i 0;i strlen(ciphertext); i ){cipher[i] ciphertext[i] - a;plain[i] cipher[i] - (key[(i % strlen(key))] - a);if(plain[i] 0){plain[i] 26;}plaintext[i] plain[i] a; }puts(plaintext);return;
}3、算法测试
密钥lemon 明文defuzongxiangsihua 密文oirimzrslvlrsgvsym
运行截图
加密过程 解密过程 四、参考文献
1、《密码编码学与网络安全——原理与实践第七版》Cryptography and Network Security, Principles and Practice, Seventh Edition【美】威廉 斯托林斯 William Stallings 著王后珍等 译北京电子工业出版社2017年12月。
2、《密码学实验教程》郭华 刘建伟等 主编北京电子工业出版社2021年1月。