简单密码学–凯撒加密算法C++版本。
文章目录
- 凯撒加密算法介绍
- 原理分析
- 程序设计
- 程序
凯撒加密算法介绍
在密码学中,恺撒密码(英语:Caesar cipher),或称恺撒加密、恺撒变换、变换加密,是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。这个加密方法是以罗马共和时期恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。
恺撒密码通常被作为其他更复杂的加密方法中的一个步骤,例如维吉尼亚密码。恺撒密码还在现代的ROT13系统中被应用。但是和所有的利用字母表进行替换的加密技术一样,恺撒密码非常容易被破解,而且在实际应用中也无法保证通信安全。
详细介绍:百度百科.
原理分析
凯撒密码其实就是将由字母组合起来的密码进行,同时移位形成看起来很乱的密文。恺撒密码的替换方法是通过排列明文和密文字母表,密文字母表示通过将明文字母表向左或向右移动一个固定数目的位置。
例如:
明文密码为:ABCDEFG
偏移量为:4
那么推算出密文为:EFGHJKL
使用时,加密者查找明文字母表中需要加密的消息中的每一个字母所在位置,并且写下密文字母表中对应的字母。需要解密的人则根据事先已知的密钥反过来操作,得到原来的明文。
例如:
明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG。
密文:WKH TXLFN EURZQ IRA MXPSV RYHU WKH ODCB GRJ。
程序设计
利用ASCII码进行操作,可以简化程序。下图为ASCII码对照表。
ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 |
---|---|---|---|---|---|---|---|
0 | NUT | 32 | (space) | 64 | @ | 96 | 、 |
1 | SOH | 33 | ! | 65 | A | 97 | a |
2 | STX | 34 | " | 66 | B | 98 | b |
3 | ETX | 35 | # | 67 | C | 99 | c |
4 | EOT | 36 | $ | 68 | D | 100 | d |
5 | ENQ | 37 | % | 69 | E | 101 | e |
6 | ACK | 38 | & | 70 | F | 102 | f |
7 | BEL | 39 | , | 71 | G | 103 | g |
8 | BS | 40 | ( | 72 | H | 104 | h |
9 | HT | 41 | ) | 73 | I | 105 | i |
10 | LF | 42 | * | 74 | J | 106 | j |
11 | VT | 43 | + | 75 | K | 107 | k |
12 | FF | 44 | , | 76 | L | 108 | l |
13 | CR | 45 | - | 77 | M | 109 | m |
14 | SO | 46 | . | 78 | N | 110 | n |
15 | SI | 47 | / | 79 | O | 111 | o |
16 | DLE | 48 | 0 | 80 | P | 112 | p |
17 | DCI | 49 | 1 | 81 | Q | 113 | q |
18 | DC2 | 50 | 2 | 82 | R | 114 | r |
19 | DC3 | 51 | 3 | 83 | S | 115 | s |
20 | DC4 | 52 | 4 | 84 | T | 116 | t |
21 | NAK | 53 | 5 | 85 | U | 117 | u |
22 | SYN | 54 | 6 | 86 | V | 118 | v |
23 | TB | 55 | 7 | 87 | W | 119 | w |
24 | CAN | 56 | 8 | 88 | X | 120 | x |
25 | EM | 57 | 9 | 89 | Y | 121 | y |
26 | SUB | 58 | : | 90 | Z | 122 | z |
27 | ESC | 59 | ; | 91 | [ | 123 | { |
28 | FS | 60 | < | 92 | / | 124 | | |
29 | GS | 61 | = | 93 | ] | 125 | } |
30 | RS | 62 | > | 94 | ^ | 126 | ` |
31 | US | 63 | ? | 95 | _ | 127 | DEL |
在写程序的时候一到最大的问题为,无法计算用户输入的数据长度,应为C++中并没有计算数组长度函数。网上说通过这种方法计算sizeif(str)/sizeif(str[0])
,但是不知到为什么,通过这种方法算出来的为0;
所以迫不得已只好另辟蹊径,最后通过数据转换解决了问题。
例如:
char data[] = "abcd";
cin>>data;
//要获取用户输入的数据长度,因为C++像python有特定的求长度的函数。但是C++有计算字符串长度的函数。
/********************************************/
#include<string>
string str = "";
str = data;
cout<<str.length()<<endl;
//这样就解决这个问题提了。
其他的基本上就没有什么,问题了,还有一点就是在偏移过程中,在开头和结尾的时候需要多思考一下。
程序
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<string.h>
using namespace std;
#define ERROR 0
void encryption(char *str,char *str2,int len);
void decode(char *str,char *str2,int len);
void transformation(char *str); //将大写数据转化为小写数据处理。
/*测试数据:
ai-riih-e-psx-sj-tvegxmgi
*/
int main(){
char data1_original[50]=" ";//存放用户输入数据
char data2_cache[50]=" "; //创建结果返回数据
string flag = "yes"; //标志位
unsigned int len; //需要移动字符的长度
cout<<"提示:如果输入数据中有空格,请用英文状态下的“-”代替,以免出现错误!"<<endl;
cout<<"提示:加密的数据如果是大写的化最终转化为小写数据进行处理!"<<endl;
while(1){
cout<<"输入解密/加密的数据:";
scanf("%s",data1_original); //输入要加密的数据
cout<<"输入要移动的位数:";
cin>>len; //输入要移动的长度
if(len<0&&len>26){ //判断 移动长度是否合法
cout<<"移动数值不合法!"<<endl ;
exit(ERROR); //数值不合法退出
}
transformation(data1_original);//将大写字母转换为小写字母
encryption(data1_original,data2_cache,len); //执行加密函数
cout<<left <<setw(10)<<"加密前:"<<data1_original<<left <<setw(10)<<"加密后:"<<data2_cache<<endl;
decode(data1_original,data2_cache,len); //执行解密函数
cout<<left <<setw(10)<<"加密前:"<<data1_original<<left <<setw(10)<<"解密后:"<<data2_cache<<endl;
memset(data2_cache,'\0',sizeof(data2_cache)); //利用memset函数将data2_cache中数据清除
cout<<"是否继续请输入(‘yes’or ‘no’):";
cin>>flag;
if(flag!="yes") //判断是否要继续进行加密/解密操作
exit(0);
}
system("pause");
}
//转换
void transformation(char *str){
int o;
string number;
number = str; //将数组转换为字符串,这个的作用主要是,计算输入数据的长度
o = number.length();//计算数据长度
for(int i;i<o;i++){
if(str[i]<='Z'&&str[i]>='A'){
str[i] = str[i]+32;
}
}
}
//加密算法
void encryption( char *str,char *str2,int len){
int o=0;
string number; //创建一个字符串类型数据 ,用于数组转换字符串
if(str==NULL&&str2==NULL)
exit(ERROR);
number = str; //将数组转换为字符串,这个的作用主要是,计算输入数据的长度
o = number.length();//计算数据长度
cout<<left <<setw(5)<<"数据长度为:"<<o<<endl;
for(int i=0;i<o;i++){
if(str[i]<'a'||str[i]>'z'){
if(str[i]=='-')
str2[i]=' ';
else
str2[i] = str[i];
}
else if(str[i]>('z'-len))
str2[i]='a'+(len-('z'-str[i]+1));
else
str2[i]=str[i]+len;
}
}
//解密
void decode(char *str,char *str2,int len){
int o=0;
string number;
if(str==NULL&&str2==NULL)
exit(ERROR);
number = str;
o = number.length();
for(int i=0;i<o;i++){
if(str[i]<'a'||str[i]>'z'){
if(str[i]=='-')
str2[i]=' ';
else
str2[i] = str[i];
}
else if(str[i]-len<'a')
str2[i]='z'-(len-(str[i]-'a')-1);
else
str2[i]=str[i]-len;
}
}
**提示:如果输入数据中有空格,请用英文状态下的“-”代替,以免出现错误!
提示:加密的数据如果是大写的化最终转化为小写数据进行处理!**
运行结果:
OK,今天的内容就这么多,我是江小白,请大佬指教。程不足、请指教(程序有不足的地方,请评论指出,谢谢喽)。
END!
更多推荐
凯撒加密算法-(C++版--内置ASCII码对照表)
发布评论