Playfair加密算法(C 实现)
生活随笔
收集整理的這篇文章主要介紹了
Playfair加密算法(C 实现)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一、主要函數解析
- 二、注意事項
- 三、演示圖
- 4、代碼
一、主要函數解析
1、Creat_Key(char* s,int L, char Matrix[5][5])
生成密鑰Matrix矩陣
2、Encrypt(char Matrix[5][5],int L, char* s, char *s0, bool reverse)
根據密鑰矩陣加密或解密
加密:s為明文,s0為密文字符串存儲位置,reverse=0
解密:s為密文,s0為明文字符串存儲位置,reverse=1
二、注意事項
1、字符串只能含有字母
2、已禁用字母j/J
3、字符均以大寫形式處理(已自動轉換,輸入時大小寫均可)
三、演示圖
4、代碼
#include <stdio.h> #include <stdlib.h>//MAtrix生成 void Creat_Key(char* s,int L, char Matrix[5][5]) {//s是否為空if (s == NULL) {printf("字符串s為空!");return;}//輔助數組(1有0無-1禁用)int alphabet[26];for (int i = 0; i < 26; i++) {alphabet[i] = 1;}alphabet['J' - 65] = -1;//刪去字母表中s相關字母for (int i = 0; i < L; i++) {alphabet[s[i] - 65] = 0;}//填充Matrixint flag = 0;//指向Matrix下一空位for (int i = 0; i < L; i++) {if (alphabet[s[i] - 65] == 0) {Matrix[flag / 5][flag % 5] = s[i];alphabet[s[i] - 65] = -1;flag++;}}for (int i = 0; i < 26; i++) {if (alphabet[i] == 1) {Matrix[flag / 5][flag % 5] = i + 65;flag++;}} }//大小寫轉換函數 void F(char* s,int L) {for(int i=0;i<L;i++){if(s[i]>='a') s[i]-='a'-'A';} }//搜索字母位置 void Find(char Matrix[5][5], char c,char c0,int *p) {for (int i = 0; i < 5; i++) {for (int j = 0; j < 5; j++) {if (Matrix[i][j] == c) {p[0] = i;p[1] = j;}if (Matrix[i][j] == c0) {p[2] = i;p[3] = j;}}} }//reverse=0加密,reverse=1解密 //加密:同行向右 同列向下 否則順時 //解密:與加密相反 void Encrypt(char Matrix[5][5],int L, char* s, char *s0, bool reverse) {//s是否為空if (s == NULL) {printf("字符串s為空!");return;}char* ret=s0;int Temp[2][2];for (int i = 0; i < L; i += 2) {int p0[4];Find(Matrix, s[i],s[i+1],p0);Temp[0][0] = p0[0];Temp[0][1] = p0[1];Temp[1][0] = p0[2];Temp[1][1] = p0[3];if (Temp[0][0] == Temp[1][0]) {//同行ret[i] = Matrix[Temp[0][0]][((Temp[0][1] + 1 - reverse * 2)+5) % 5];ret[i + 1] = Matrix[Temp[1][0]][((Temp[1][1] + 1 - reverse * 2)+5) % 5];}else {if (Temp[0][1] == Temp[1][1]) {//同列ret[i] = Matrix[((Temp[0][0] + 1 - reverse * 2)+5) % 5][Temp[0][1]];ret[i + 1] = Matrix[((Temp[1][0] + 1 - reverse * 2)+5) % 5][Temp[1][1]];}else {//否否if ((Temp[0][0] - Temp[1][0]) * (Temp[0][1] - Temp[1][1]) * (2 * (!reverse + 1) - 3) > 0) {ret[i] = Matrix[Temp[0][0]][Temp[1][1]];ret[i + 1] = Matrix[Temp[1][0]][Temp[0][1]];}else {ret[i] = Matrix[Temp[1][0]][Temp[0][1]];ret[i + 1] = Matrix[Temp[0][0]][Temp[1][1]];}}}} }void Printf(char* p,int Begin, int End){for(int i=Begin;i<=End;i++){printf("%c",p[i]);} }int main(){//密鑰生成字符串int L;printf("請輸入密鑰生成字符串長度:");scanf("%d",&L);printf("\n");char *K_S = (char *)malloc(sizeof(char)*(L+1));printf("請輸入密鑰生成字符串:");scanf("%s",K_S);printf("\n");F(K_S,L);//密碼表編制char Matrix[5][5];printf("密碼表編制:\n");printf("密碼表如下:\n");Creat_Key(K_S, L, Matrix);for (int i = 0; i < 5; i++) {for (int j = 0; j < 5; j++) {printf("%c ", Matrix[i][j]);}printf("\n");}printf("\n");//明文int L0;printf("請輸入明文長度:");scanf("%d",&L0);printf("\n");char *C_S = (char *)malloc(sizeof(char)*(L0+1));printf("請輸入明文:");scanf("%s",C_S);printf("\n");F(C_S, L0);//加密char *s2=(char *)malloc(L0);Encrypt(Matrix, L0, C_S,s2, 0);printf("\n加密:\n明文:");Printf(C_S,0,L0-1);printf(" -> 密文:");Printf(s2,0,L0-1);printf("\n");//解密char *s3=(char *)malloc(L0);Encrypt( Matrix, L0, s2,s3, 1);printf("\n解密:\n密文:");Printf(s2,0,L0-1);printf(" -> 明文:");Printf(s3,0,L0-1);printf("\n");system("pause");return 0; }總結
以上是生活随笔為你收集整理的Playfair加密算法(C 实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Leetcode题库 798.得分最高的
- 下一篇: Hill加密算法(matlab 实现)