现代密码学概论|密码学基础--仿射密码实验C语言(文末附上C语言源代码)
生活随笔
收集整理的這篇文章主要介紹了
现代密码学概论|密码学基础--仿射密码实验C语言(文末附上C语言源代码)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
實驗內(nèi)容:
編程實現(xiàn)仿射密碼,要求有加密步驟和解密步驟。若輸入?yún)?shù)a,b不合法,則報錯。
實驗操作步驟:
仿射加密
輸入a和b,先判斷a和26的最大公因數(shù)是否是1,運用輾轉(zhuǎn)相除法
?如果a和26的最大公因數(shù)不是1,則密鑰輸入錯誤,需要重新輸入。
?對明文的每個字符進行:密文字符=(a*明文+b)mod26的計算。查表可知,A對應(yīng)65,Z對應(yīng)90,a對應(yīng)97,z對應(yīng)122。
?同理,仿射解密,對密文進行編碼,計算k1在模m意義下的逆元kni,代碼如下
?在對密文的每個字符進行如下計算:明文=(kni*(密文-k2))mod26,同樣對照ASCII碼表進行大寫和小寫字母的假設(shè)。
?主函數(shù)部分是用來做交互選擇
?實驗結(jié)果:
操作前
選擇1,第一次輸入密鑰不滿足gcd(k1,26)=1
選擇2,密鑰為7和21
源代碼:
#include <stdio.h> #include <string.h> #include<conio.h> int gcd(int a,int b) // 輾轉(zhuǎn)相除法 {int t=0;do{t=a%b;a=b;b=t;}while(t!=0);return a; } void Affine(){ //仿射加密 int k1,k2,length,i,t;char c[20];printf("************仿射密碼**************\n");printf("請輸入最初的明文:"); scanf("%s",c);length=strlen(c);printf("\n請輸入密鑰(兩數(shù)字):"); scanf("%d%d",&k1,&k2);getchar();while(gcd(k1,26)!=1){printf("密鑰輸入錯誤,請重新輸入");scanf("%d%d",&k1,&k2);getchar();}for(i=0;i<length;i++){if(c[i]>=97&&c[i]<=122)c[i]=((c[i]-97)*k1+k2)%26+65;elsec[i]=((c[i]-65)*k1+k2)%26+65;}printf("密文為:\n%s\n",c);printf("按任何鍵返回..."); getch();}int kni(int a,int b)//求a的逆元kni; {int i=0;while(a*(++i)%b!=1);return i; }void exAffine(){ // 仿射解密 int k1,k2,length,i,t;char m[20];printf("************仿射密碼**************\n");printf("請輸入最初的密文:"); scanf("%s",m);length=strlen(m);printf("\n請輸入密鑰(兩數(shù)字):"); scanf("%d%d",&k1,&k2);getchar();while(gcd(k1,26)!=1){printf("密鑰輸入錯誤,請重新輸入");scanf("%d%d",&k1,&k2);getchar();}for(i=0;i<length;i++){if(m[i]>=65&&m[i]<=90){t=kni(k1,26)*((m[i]-65)-k2);if(t<0)m[i]=t%26+26+97;elsem[i]=t%26+97;} }printf("明文為:\n%s\n",m);printf("按任何鍵返回..."); getch();}int main() {int i;printf("************請按1~3選擇:**************\n");printf("1.仿射加密\n2.仿射解密\n3.退出\n"); scanf("%d",&i);if(i==1)Affine();else if(i==2)exAffine();return 0; }?
?
?
總結(jié)
以上是生活随笔為你收集整理的现代密码学概论|密码学基础--仿射密码实验C语言(文末附上C语言源代码)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity3D学习笔记之九为场景添加细节
- 下一篇: 扫雷源代码(C语言)