Playfair密码C语言源代码
Playfair算法

Playfair算法Playfair加密算法(C语言)#include#include#include#define NUM 1000int main(){while(true){int i,j,k=0,m,n,temp=0,length; char key[NUM],voa[26]; char table[5][5];char word[NUM];//printf("%d",'z');printf("密钥: ");scanf("%s",key);length=strlen(key);for(i=0;i<length;i++)< p="">{if(key[i]=='j')key[i]='i';}for(i=0;i<="">for(j=i+1;j<length;j++)< p="">if(key[i]==key[j]){for(int t=j;t<length;t++)< p="">{key[t]=key[t+1];}length--;}if(j==1){key[j]=0;break;}}// printf("%d\n",length); for(i=0;i<26;i++){voa[i]=65+i;}for(i=0;i<="">key[i]=key[i]-32;}char p;int count=0;for(i=0;i<26;i++){p=voa[i];for(j=0;j<="">if(p==key[j]){key[i+length]=p; count+=1;break;}//printf("%d",count);if(j==length){key[i+length-count]=p; }}////////////////////////////////////// int u=0; for(i=0;i<26;i++){if(key[i]=='J'){for(u=i;u<26;u++){key[u]=key[u+1];}}if(key[i]=='I')key[i]='*';//printf("%c",word[i]);}temp=0;for(i=0;i<5;i++){for(j=0;j<5;j++){table[i][j]=key[j+temp];printf("%c ",table[i][j]);if(j==4){temp+=5;printf("\n");}}printf("明文: ");scanf("%s",word); length=strlen(word);//printf("%d\n",length);int counter=0;for(i=0;i<length;)< p="">{if(word[i]==word[i+1]){i+=1;counter+=1;}elsei+=2;}//printf("1:%d\n",length+counter); for(i=0;i<=""> if(word[i]==word[i+1]){for(j=length+counter-1;j>i+1;j--) {word[j]=word[j-1];}word[i+1]='x';}}length=length+counter;if(length%2!=0){word[length]='x'; length+=1;for(k=0;k<="">word[k]=word[k]-32;}for(i=0;i<length;i++)< p="">{if(word[i]=='I'||word[i]=='J'){word[i]='*';}}count=0,k=0;loop: for(i=0;i<5,k<length;i++)< p="">{//k=k-2;for(j=0;j<5;j++){for(m=0;m<5;m++){for(n=0;n<5;n++){if((table[i][j]==word[k])&&(table[m][n]==word[k+1])&&(i= =m)) {count=1;word[k]=table[i][j+1];word[k+1]=table[m][n+1];if(j==4){word[k]=table[i][0];//break;if(n==4){word[k+1]=table[m][0];//break;}//printf("1:%c %c %d",word[0],word[1],k);//break;//Sleep(1000);k+=2;if(count==1){goto loop;}}elseif((table[i][j]==word[k])&&(table[m][n]==word[k+1])&&(j==n)) count=1;word[k]=table[i+1][j];word[k+1]=table[m+1][n];if(i==4){word[k]=table[0][j];//break;}if(m==4){word[k+1]=table[0][n];//break;}//printf("2:%c %c",word[0],word[1]);k+=2;if(count==1){goto loop;}}elseif((table[i][j]==word[k])&&(table[m][n]==word[k+1])&&(i!=m) &&(j!=n))count=1;word[k]=table[i][n];word[k+1]=table[m][j];//printf("3:%c %c",word[0],word[1]);k+=2;if(count==1){goto loop;}}}}}}printf("密文: ");for(k=0;k<length;k++)< p="">{printf("%c ",word[k]);}printf("\n\n");system("pause"); }return 0;}</length;k++)<> </length;i++)<> </length;i++)<> </length;)<></length;t++)<> </length;j++)<> </length;i++)<>。
playfair密码规则

playfair密码规则Playfair密码是一种替换密码,它使用了一个特殊的固定矩阵来加密一串明文信息。
下面是Playfair密码的规则:1. 生成密钥矩阵:密钥矩阵是一个5x5的方阵,其中填入了26个字母(I和J使用同一个位置)。
这个矩阵是在加密前由密钥生成的,这个过程被称为“键入”。
2. 消除重复字符:明文中可能有重复出现的字母,一般是在相邻的位置上。
为了避免这些字母在加密过程中对密文产生影响,需要将它们转换成不同的字母。
通常将它们转换成一个字母,比如加入一个“X”作为缓冲区。
3. 将明文转换成一对一对的字母:将明文按照一定的规则分成一对一对的字母,这些字母将被加密成新的字母对。
4. 加密字母对:对于每一对字母,按照下面的规则加密:(1)如果这两个字母在密钥矩阵的同一行(或同一列),则将它们分别替换成该行(或该列)中该字母的右一个字母(或下一个字母),如果是最右或最下,则循环到最左或最上。
(2)如果这两个字母不在同一行和同一列中,则它们的加密字母对为这两个字母所在的行的交点。
5. 输出密文:将加密后的字母对按照原来的顺序排列,并输出为密文。
Playfair密码的优点在于密钥矩阵中填入的字母是固定的,只有密钥才能解密密文。
同时,由于采用了两个字母一组的加密方式,也增加了破解密文的难度。
但是,如果明文中含有过多的相同字母,则加密效果将会受影响。
下面是一个生成Playfair密码的示例:1. 生成密钥矩阵:密钥:HELLO WORLD密钥矩阵:H E L O WR D A BC F G I KM N P Q ST U V X Y2. 消除重复字符:明文为“EXAMPLE”,将其转换为“EXAMPLY”。
3. 将明文转换成一对一对的字母:将其分成“EX AM PL Y”四对。
4. 加密字母对:对于每一对字母,按照下面的规则加密:(1)(E,X):不在同一行和同一列,加密为(R,U)。
(2)(A,M):不在同一行和同一列,加密为(EC,ST)。
信息安全-1:python之playfair密码算法详解[原创]
![信息安全-1:python之playfair密码算法详解[原创]](https://img.taocdn.com/s3/m/0dd25d2fdc36a32d7375a417866fb84ae45cc32d.png)
信息安全-1:python之playfair密码算法详解[原创]转发注明出处:⼀、基本概念1. 古典密码是基于字符替换的密码。
加密技术有:Caesar(恺撒)密码、Vigenere(维吉尼尔)密码、Playfair密码、Hill密码……2. 明⽂:未经过加密的信息;密⽂:加密后的信息3. 加密解密的过程:如下图⼆、Caesar密码 这⾥我先简单讲下恺撒密码,咸觉挺简单的,后⾯再主要讲Playfair算法原理与编程。
基本原理:在开拓罗马帝国的时候,恺撒担⼼信使会阅读他送给⼠兵的命令,因此发明了对命令进⾏加密的算法--恺撒密码器恺撒密码器挺简单的:把字母表中的每个字母向前循环移动3位加密信息将字母向前移动三位解密信息将字母向后移动三位移动的位数是关键,称之为密钥加密和解密的密钥是相同的,我们称之为对称密码器数学表达恺撒密码的加密算法表⽰为:C=E(p)=(p+3) mod 26恺撒密码的解密算法表⽰为:p=D(C)=(C-3) mod 26改进的恺撒密码明⽂的发送⽅和接收⽅事先协商好⼀个密钥K(1<=K<=25),则:恺撒密码的加密算法表⽰为:C=E(p)=(p+K) mod 26恺撒密码的解密算法表⽰为:p=D(C)=(C-K) mod 26三、Playfair密码基本原理Playfair算法基于⼀个5*5的字母矩阵,该矩阵使⽤⼀个关键词构造,⽅法是按从左到右、从上到下顺序,填⼊关键词的字母(去除重复字母)后,将字母表其作余字母填⼊。
例如: 关键词取:monarchy时,字母矩阵为下图如⽰(矩阵只能放25个字母,I与J同)加密规则(重要)Playfair加密算法是先将明⽂按两个字母⼀组进⾏分组,然后在矩阵中找对应的密⽂。
取密⽂的规则如下:1. 若明⽂出现相同字母在⼀组,则在重复的明⽂字母中插⼊⼀个填充字母(eg:z)进⾏分隔后重新分组(eg: balloon被重新分组为ba lz lo on)2. 若分组到最后⼀组时只有⼀个字母,则补充字母z3. 若明⽂字母在矩阵中同⾏,则循环取其右边下⼀个字母为密⽂(矩阵最右边的下⼀个是最左边的第⼀个)(eg: ar被加密为RM)4. 若明⽂字母在矩阵中同列,则循环取其下边下⼀个字母为密⽂(矩阵最下边的下⼀个是最上边的第⼀个)(eg: mu被加密为CM)5. 若明⽂字母在矩阵中不同⾏不同列,则取其同⾏且与同组另⼀字母同列的字母为密⽂(eg: hs被加密为BP,ea被加密为IM或JM)PS:上述规则第⼀次看时挺烦的,但照着例⼦看就⼀定可以看懂的!举例(这个例⼦后⾯测试会⽤到的):明⽂为we are discovered save yourself,分组成为we ar ed is co ve re ds av ey ou rs el fz;⽤上述矩阵加密后的密⽂为:UG RM KC SX HM UF MK BT OX GC MV AT LU KV四、Playfair算法编程这⾥我不想直接贴代码。
playfair加密算法

if(p<4 && s<4)
{
r[n]=c[p+1][q];
n++;
r[n]=c[s+1][t];
n++;
}
else if(p==4 && s<4)
{
r[n]=c[0][q];
n++;
r[n]=c[s+1][t];
n++;
}
else
{
r[n]=c[p+1][q];
n++;
r[n]=c[0][t];
#include <stdio.h>
#include <string.h>
void main()
{
int i,j,k,p,q,s,t,m,n;
char a[100],b[120],r[120];
char c[6][5]={{'c','i','p','h','e'},{'r','a','b','d','f'},{'g','k','l','m','n'},{'o','q','s','t','u'},{'v','w','x','y','z'}};
printf("%s",b);
javascript实现playfair和hill密码算法

javascript实现playfair和hill密码算法时⾄期末,补习信息安全概论作业。
恰巧遇古典密码学算法中的playfair算法和hill算法,⽤javascript语⾔实现起来是在有趣,边查百度边编码,顺便好好补习⼀下javascript基础。
playfairPlayfair密码(英⽂:Playfair cipher 或 Playfair square)是⼀种替换密码。
依据⼀个5*5的正⽅形组成的密码表来编写,表中排列有25个字母。
对于英语中的26个字母,去掉最常⽤的Z,构成密码表。
实现思路:1,编制密码表 密钥是⼀个单词或词组,密码表则根据⽤户所给出的密钥整理⽽出。
若有重复字母,可将后⾯重复的字母去掉。
如密钥crazy dog,可编制成C O H M TR G I N UA B J P VY E K Q WD F L S X复制代码代码如下:/** 功能:编制密码表** 参数:密钥(经过去除空格和⼤写处理)** 返回:密码表*/function createKey(keychars){//字母顺序数组var allChars = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y'];//变量keychars获取字母在字母顺序表中位置,删除该字母for(var i = 0 ;i<keychars.length;i++){var index = allChars.indexOf(keychars[i]);if (index > -1) {allChars.splice(index, 1);}}//将keychar中的字母插⼊到字母表中for(var i = keychars.length-1;i>=0;i--){allChars.unshift(keychars[i]);}//从第⼀列将keychars插⼊⾄密码表for(var i = 0 ; i<5 ; i++){for(var j = 0; j<5 ;j++){key[j][i] = allChars[i*5+j];}}}考虑将keychars插⼊到密码表时需要去除重复字符和Z,设计算法如下:复制代码代码如下:/** 功能:去除字符串中重复字母** 参数:需要进⾏处理的字符串** 返回:处理过的字符串*/function removeDuplicate(str){var result = [],tempStr = "";var arr = str.split('');//把字符串分割成数组//arr.sort();//排序for(var i = 0; i < arr.length; i++){var repeatBack = true;//设计变量是为确保字符串前部分不存在相同字符,因为以下算法只能确保连在⼀起相同的字符 for(var j = 0;j<result.length ;j++){if(arr[i] == result[j])repeatBack = false;}if(arr[i] !== tempStr && repeatBack){result.push(arr[i]);tempStr = arr[i];}else{continue;}}return result.join("");//将数组转换为字符串}2,整理明⽂ 将明⽂每两个字母组成⼀对。
c语言小飞机源代码

c语言小飞机源代码写一篇1500-2000字的关于C语言小飞机源代码的文章,以中括号内的内容为主题,一步一步回答。
[中括号内的内容:C语言小飞机源代码]前言:C语言作为一种高效且广泛应用的编程语言,在软件开发领域有着极为重要的地位。
而小飞机作为一种常见的娱乐玩具,具有吸引人的外观和操控性。
本文通过编写一个C语言小飞机源代码来展示C 语言的基础语法及其在实践中的应用。
我们将逐步分解这个源代码,并解释每个部分的功能和实现原理。
希望读者通过阅读本文,能够更深入了解C语言,并通过实际编码体验其应用之乐趣。
一、介绍:[这部分介绍小飞机源代码的背景、目的和基本功能。
]我们编写的小飞机源代码旨在实现一个简单的小飞机游戏。
玩家可以通过键盘控制小飞机的飞行,并躲避障碍物。
游戏界面使用字符画绘制,使得整个游戏更加有趣。
二、源代码分析:1. 引用头文件和定义全局变量:cinclude <stdio.h>include <conio.h>int x, y; 飞机的坐标int sx, sy; 障碍物的坐标[这部分主要是包含所需的头文件,并声明全局变量x、y、sx、sy。
]在这个示例中,我们引用了stdio.h和conio.h两个头文件。
stdio.h用于标准输入输出,而conio.h中定义了控制台输入输出的一些函数,比如getch()函数用于读取用户按下的键盘字符。
全局变量x和y分别表示飞机的横纵坐标,而sx和sy表示障碍物的横纵坐标。
通过全局变量的设置,我们可以在代码的不同部分共享这些变量的数值。
2. 定义函数-初始化游戏界面:cvoid InitGame(){x = 0;y = 0;sx = 50;sy = 10;}[这部分是定义了一个名为InitGame()的函数,用于初始化游戏界面。
]在这个函数内部,我们给飞机和障碍物的坐标赋初始值。
将飞机的x和y坐标设为0,将障碍物的sx和sy坐标设为固定值。
c语言输入密码的程序

c语言输入密码的程序C语言是一种常用的编程语言,用于开发系统级应用和嵌入式软件。
以下是一个简单的C语言程序,演示如何输入密码的过程。
这个程序将用户输入的密码与预设的密码进行比较,如果匹配则输出登录成功,否则输出登录失败。
#include <stdio.h>#include <string.h>// 定义预设密码#define DEFAULT_PASSWORD "password123"// 定义密码最大长度#define MAX_PASSWORD_LENGTH 20// 函数声明int login(char enteredPassword[]);int main(){char enteredPassword[MAX_PASSWORD_LENGTH];// 用户输入密码printf("请输入密码:");scanf("%s",enteredPassword);// 调用登录函数if(login(enteredPassword)){printf("登录成功!\n");}else{printf("登录失败,密码错误。
\n");}return0;}// 登录函数,用于比较输入密码与预设密码是否一致int login(char enteredPassword[]){// 使用strcmp函数比较两个字符串是否相等if(strcmp(enteredPassword,DEFAULT_PASSWORD)==0){ return1;// 如果密码匹配,返回1表示登录成功}else{return0;// 如果密码不匹配,返回0表示登录失败}}上述程序中,我们使用了scanf函数来接收用户输入的密码,并使用strcmp函数来比较输入的密码与预设的密码是否一致。
如果一致,则认为登录成功,否则认为登录失败。
play fair密码源代码

3月30日古典加密算法playfair算法的C++实现Playfair算法利用用户输入的字符串作为密钥构造5*5矩阵: 首先, 从左到右、从上到下填入该密钥中的字母, 并去除重复的字母(两个相同字母只取前一个); 其次, 按照字母表顺序将其余字母填入矩阵的剩余空间. 字母I 和J 被算作一个字母, 可以根据使用者的意愿在形成密文时确定用I 或J.利用该矩阵对字符进行变换加密,只对英文字母有效,但可扩充.把字符串分为两个一对的明文对并按如下变换规则进行变换:(1)一对明文字母如果是重复的,则在这对明文字母种间插入一个填充字符;(2)如果分割后的明文字母对在矩阵的同一行中都出现,则分别用矩阵中其右侧的字母代替,行的最后一个字母由行的第一个字母代替;(3)如果分割后的明文字母对在矩阵的同一列中都出现,则分别用矩阵中其下方的字母代替,列的最后一个字母由列的第一个字母代替;(4)如果分割后的明文字母对既不在矩阵的同一列中都出现也不在矩阵的同一行中都出现,密文是这两个字母所在的长方形的另两个顶点;(5)如果明文有奇数个字母,末尾加一个无效字母。
#include<iostream>#include<cstring>using namespace std;void decrypt();//解密函数void encrypt();//加密函数void main(){cout<<"****************************Playfair算法加解密程序***************************"<<endl;cout<<"*********************************欢迎使用本程序******************************"<<endl<<endl;int n=0;for(;n!=3;){cout<<"选择你所需要的操作:"<<endl;cout<<"1------为字符串加密;"<<endl;cout<<"2------为字符串解密;"<<endl;cout<<"3------结束程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//PLAYFAIR.H头文件#ifndef _PLAY_FAIR_H_#define _PLAY_FAIR_H_void cst_playfair_table (char *in_key);void prnt_playfair_table ();int playfair_encrypt (char *plain_txt, char *cipher_txt); int playfair_decrypt (char *cipher_txt, char *plain_txt);#endif//PLAYFAIR.C源文件#include "playfair.h"#include <stdio.h>#include <stdlib.h>#include <string.h>char playfair_table[5][5];void get_x_y (char c, int *x, int *y){int i, j;for (i = 0; i < 5; ++i){for (j = 0; j < 5; ++j){if (playfair_table[i][j] == c){*x = i; *y = j;return;}}}}char get_char_x_y (int x, int y){if (x < 0)x += 5;if (y < 0)y += 5;return playfair_table[x % 5][y % 5];}void cst_playfair_table (char *in_key){int i = 0, j, k;int char_count = 0, left_ch_index = 0;char ch, left_chs[26] = {0}, key[26] = {0};int key_len;strcpy (key, in_key);key_len = strlen (key);while (1){if (key[i] == ' '){for (j = i; j < key_len - 1; ++j)key[j] = key[j + 1];key_len--;}if (i == key_len)break;i++;}for (i = 0; i < 26; ++i){ch = 'a' + i;j = 0;char_count = 0;while (1){if (key[j] == ch){char_count++;if (char_count > 1){for (k = j; k < key_len -1; ++k)key[k] = key[k + 1];key_len--;}elsej++;}elsej++;if (j == key_len)break;}if (char_count == 0)left_chs[left_ch_index++] = ch;}for (i = 0; i < left_ch_index; ++i)key[key_len++] = left_chs[i];for (i = 0; i < 26; ++i){if (key[i] == 'z'){for (j = i; j < 25; ++j)key[j] = key[j + 1];}}for (i = 0; i < 5; ++i){for (j = 0; j < 5; ++j)playfair_table[i][j] = key[5 * i + j];}}void prnt_playfair_table (){int i, j;printf ("Playfair Table:\n");for (i = 0; i < 5; ++i){printf ("\t");for (j = 0; j < 5; ++j){printf ("%c ", playfair_table[i][j]);}puts("\n");}}int playfair_encrypt (char *plain_txt, char *cipher_txt) {int length = strlen (plain_txt);int i = 0, j;int ax, ay, bx, by;char pch1, pch2, cch1, cch2;int ch1_upper = 0, ch2_upper = 0;for (i = 0; i < length; ++i){if (plain_txt[i] == 'z')plain_txt[i] = ‘x’;}if (length %2){plain_txt[length] = 'x';length++;}for (i = 0; i < length; i = i + 2){pch1 = plain_txt[i];pch2 = plain_txt[i + 1];ch1_upper = ch2_upper = 0;if (pch1 >= 'A' && pch1 <= 'Z'){ch1_upper = 1;pch1 += 32;}if (pch2 >= 'A' && pch2 <= 'Z'){ch2_upper = 1;pch2 += 32;}get_x_y (pch1, &ax, &ay);get_x_y (pch2, &bx, &by);if (ay == by){cch1 = get_char_x_y (ax + 1, ay);cch2 = get_char_x_y (bx + 1, by);}else if (ax == bx){cch1 = get_char_x_y (ax, ay + 1);cch2 = get_char_x_y (bx, by + 1);}else{cch1 = get_char_x_y (ax, by);cch2 = get_char_x_y (bx, ay);}cipher_txt[i] = cch1 - 32 * ch1_upper;cipher_txt[i + 1] = cch2 - 32 *ch2_upper;}cipher_txt[length] = '\0';return length;}int playfair_decrypt (char *cipher_txt, char *plain_txt) {int length = strlen (plain_txt);int i = 0, j;int ax, ay, bx, by;char pch1, pch2, cch1, cch2;int ch1_upper = 0, ch2_upper = 0;for (i = 0; i < length; i = i + 2){cch1 = cipher_txt[i];cch2 = cipher_txt[i + 1];ch1_upper = ch2_upper = 0;if (cch1 >= 'A' && cch1 <= 'Z'){ch1_upper = 1;cch1 += 32;}if (cch2 >= 'A' && cch2 <= 'Z'){ch2_upper = 1;cch2 += 32;}get_x_y (cch1, &ax, &ay);get_x_y (cch2, &bx, &by);if (ay == by){pch1 = get_char_x_y (ax - 1, ay);pch2 = get_char_x_y (bx - 1, by);}else if (ax == bx){pch1 = get_char_x_y (ax, ay - 1);pch2 = get_char_x_y (bx, by - 1);}else{pch1 = get_char_x_y (ax, by);pch2 = get_char_x_y (bx, ay);}plain_txt[i] = pch1 - 32 * ch1_upper;plain_txt[i + 1] = pch2 - 32 *ch2_upper;}plain_txt[length] = '\0';return length;}//MAIN.C文件#include <stdio.h>#include <stdlib.h>#include <string.h>#include "playfair.h"int main (){char plain_txt[1000], cipher_txt[1000];char key[26] = {0};printf ("Please input your key (string): ");scanf ("%s", key);cst_playfair_table (key);printf ("Keyword Table:\n");prnt_playfair_table ();printf ("Please input plain text: ");scanf ("%s", plain_txt);playfair_encrypt (plain_txt, cipher_txt);printf ("Cipher is : %s\n", cipher_txt);playfair_decrypt (cipher_txt, plain_txt);printf ("After decryption, plain text is :%s\n", plain_txt);return 0;}。