一、算法描述
凯撒密码的加密解密算法,逻辑很简单,就是两个公式:
比如说下面这个例子的加密解密公式,就是位移量为3时的结果
加密公式 f(a)=(a+3) mod 26解密公式 f(a)=(a+23) mod 26
是不是很简单?你可能会问,什么是模运算,如何用程序语言来表达出来?
没关系,下面会有详细的代码来说明问题。
二、具体代码
凯撒密码.c | |
#include<stdio.h> #include<iostream> #include<stdlib.h> #include <string.h> #define N 100 using namespace std; //凯撒密码 //加密公式 f(a)=(a+3) mod 26 //解密公式 f(a)=(a+23) mod 26 void psw(char *strI,int numB,int model);//加密公式函数 void unpsw(char *strI,int numB,int model);//解密公式函数 char getW(int i);//字母表 int main() { char str[N]; int model; int numB; while(1) { cout<<"请选择模式:\n"; cout<<"1.加密\n"; cout<<"2.解密\n"; cout<<"3.退出\n"; cin>>model; cout<<endl; switch(model) { case 1: cout<<"请输入要加密的字符串:"; cin>>str; cout<<"请输入该密码算法的偏移数量:"; cin>>numB; psw(str,numB,model); cout<<endl; break; case 2: cout<<"请输入要解密的字符串:"; cin>>str; cout<<"请输入原密码算法的偏移数量:"; cin>>numB; unpsw(str,numB,model); cout<<endl; break; case 3: return 0; break; default: break; } } return 0; } void psw(char *strI,int numB,int model) { if(model==1) { for(int i=0; i<strlen(strI); i++) { if(strI[i] >= 'A' && strI[i] <= 'Z') { strI[i] = ((strI[i]-'A')+numB)%26+'A'; } else if(strI[i] >= 'a' && strI[i] <= 'z') { strI[i] = ((strI[i]-'a')+numB)%26+'a'; } } cout<<"加密完成:"<<strI<<endl; } else { cout<<"该模式不支持此项功能!"<<endl; } } void unpsw(char *strI,int numB,int model) { if(model==2) { int num; num=26-numB; for(int i=0; i<strlen(strI); i++) { if(strI[i] >= 'A' && strI[i] <= 'Z') { strI[i] = ((strI[i]-'A')+num)%26+'A'; } else if(strI[i] >= 'a' && strI[i] <= 'z') { strI[i] = ((strI[i]-'a')+num)%26+'a'; } } cout<<"解密完成:"<<strI<<endl; } else { cout<<"该模式不支持此项功能!"<<endl; } } |
|
自我感觉代码的逻辑和格式,那是很好的。 |
三、实验结果
废话不多说直接上图。
只要先加密,把加密后的密文反过来用解密算法解密,如果得到的明文和原来的明文是一样的。
那就基本上可以说明算法没问题。
没毛病的算法。