日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Playfair加密算法(C 实现)

發(fā)布時間:2024/4/18 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Playfair加密算法(C 实现) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 一、主要函數(shù)解析
  • 二、注意事項
  • 三、演示圖
  • 4、代碼

一、主要函數(shù)解析

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)
根據(jù)密鑰矩陣加密或解密
加密:s為明文,s0為密文字符串存儲位置,reverse=0
解密:s為密文,s0為明文字符串存儲位置,reverse=1

二、注意事項

1、字符串只能含有字母
2、已禁用字母j/J
3、字符均以大寫形式處理(已自動轉(zhuǎn)換,輸入時大小寫均可)

三、演示圖

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;}//輔助數(shù)組(1有0無-1禁用)int alphabet[26];for (int i = 0; i < 26; i++) {alphabet[i] = 1;}alphabet['J' - 65] = -1;//刪去字母表中s相關(guān)字母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++;}} }//大小寫轉(zhuǎn)換函數(shù) 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; }

總結(jié)

以上是生活随笔為你收集整理的Playfair加密算法(C 实现)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。