加密是什么?什么是加密通话?用人话说就是一句有含义的话,经过一定的特殊规则把里面的每个字按照这个规则进行改变,但是这个规则只有你和你想让知道这条信息的人知道
今天我们来用ASCII码编写一个简单加密与解密的程序,用C语言实现秘密通话(当然因为C老登与ASCII码的语言兼容问题,今天咱们写的这个东西只适合英文)也就是凯撒密码
目标
写一个程序,可以把英文句子按照移步加密方式(每个字母往后移几步)加密并且破解,步长由用户指定,仅可以加密A~Z和a~z英文字母以及数字,如果加上步长后超出范围从第一个字母重新开始
思路
这个问题有点复杂,正好画一下算法描述图梳理一下
相关规则
是个大概
运用函数思想,这里需要两个函数
1、检查输入的句子是不是只有英文和阿拉伯数字
2、加密的函数
现在先写一个框架
#include <stdio.h>
#include <string.h>
#define MAX 256int Foreach(char p[]);
void Encryption(char p[],int n);int main()
{char p[MAX] = "";int n = 0;printf("Please Enter Sentences(English and Arabic numerals Only):\n");fgets(p,MAX,stdin);p[strlen(p)-1] = '\0'; //节省内存if(Foreach(p) == -1){printf("The input is not composed of English sentences and Arabic numerals");return 1; //异常终止}printf("Please Enter step size: ");scanf("%d",&n);Encryption(p,n);printf("%s",p);return 0;
}int Foreach(char p[])
{}void Encryption(char p[],int n)
{}
ASCII码知识点
c语言里面的字符其实都是默认转化为ASCII码的,都是数字,所以可以加减乘除,数学操作都可以进行(第一次学的时候感觉怪怪的,从来没加减乘除过字母)
我们先写第一个,顺便修改一下main函数避免奇奇怪怪的输入(推荐标点法,return也是一种标点法)
ctype与isalnum
isalnum它用于检查给定的字符是否是字母(无论是大写还是小写)或数字(0-9)
isalnum
函数的返回值如下:
- 如果字符是字母或数字,函数返回非零值(通常是
1
)。 - 如果字符不是字母或数字,函数返回零。
具体编写
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAX 256int Foreach(char p[]);
//void Encryption(char p[],int n);int main()
{char p[MAX] = "";int n = 0;printf("Please Enter Sentences(English and Arabic numerals Only):\n");fgets(p,MAX,stdin);p[strcspn(p, "\n")] = '\0'; //节省内存if(Foreach(p) == -1){printf("The input is not composed of English sentences and Arabic numerals");return 1; //异常终止}else if (Foreach(p) == 0){printf("No input entered. Please enter a valid sentence.\n");return 1; // 异常终止}printf("Please Enter step size: ");if (scanf("%d", &n) != 1) {// 输入不是一个整数printf("Input is not an integer. Exiting program.\n");return 1; // 异常终止}//Encryption(p,n);printf("%s",p);return 0;
}int Foreach(char p[])
{int hasContent = 0; // 标记是否有非空格内容if (p == NULL){return -1;}for (int i = 0; p[i] != '\0'; i++){if (!isalnum(p[i]) && p[i] != ' ' && p[i] != '.' &&p[i] != ','){return -1;}if (isalnum(p[i])) // 如果字符是字母或数字,则标记有内容{hasContent = 1;}}if (hasContent == 0) // 如果没有非空格内容,返回0{return 0;}return 1; // 输入有效}/*
void Encryption(char p[],int n)
{}*/
接下来就是加密函数
void Encryption(char p[],int n)
{int i = 0;while(p[i] != '\0'){if(p[i]>='a' && p[i]<='z'){p[i] = p[i] + n;if(p[i]>'z'){p[i] = p[i]-'z'+'a'-1;}}if(p[i]>='A' && p[i]<='Z'){p[i] = p[i] + n;if(p[i]>'Z'){p[i] = p[i]-'Z'+'A'-1;}}if(p[i]>='0' && p[i]<='9'){p[i] = p[i] + n;if(p[i]>'9'){p[i] = p[i]-'9'+'0'-1;}}i++;}
}
写完就是这个
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAX 256int Foreach(char p[]);
void Encryption(char p[],int n);int main()
{char p[MAX] = "";int n = 0;printf("Please Enter Sentences(English and Arabic numerals Only):\n");fgets(p,MAX,stdin);p[strcspn(p, "\n")] = '\0'; //节省内存if(Foreach(p) == -1){printf("The input is not composed of English sentences and Arabic numerals");return 1; //异常终止}else if (Foreach(p) == 0){printf("No input entered. Please enter a valid sentence.\n");return 1; // 异常终止}printf("Please Enter step size: ");if (scanf("%d", &n) != 1) {// 输入不是一个整数printf("Input is not an integer. Exiting program.\n");return 1; // 异常终止}Encryption(p,n);printf("%s",p);return 0;
}int Foreach(char p[])
{int hasContent = 0; // 标记是否有非空格内容if (p == NULL){return -1;}for (int i = 0; p[i] != '\0'; i++){if (!isalnum(p[i]) && p[i] != ' ' && p[i] != '.' &&p[i] != ','){return -1;}if (isalnum(p[i])) // 如果字符是字母或数字,则标记有内容{hasContent = 1;}}if (hasContent == 0) // 如果没有非空格内容,返回0{return 0;}return 1; // 输入有效}void Encryption(char p[],int n)
{int i = 0;while(p[i] != '\0'){if(p[i]>='a' && p[i]<='z'){p[i] = p[i] + n;if(p[i]>'z'){p[i] = p[i]-'z'+'a'-1;}}if(p[i]>='A' && p[i]<='Z'){p[i] = p[i] + n;if(p[i]>'Z'){p[i] = p[i]-'Z'+'A'-1;}}if(p[i]>='0' && p[i]<='9'){p[i] = p[i] + n;if(p[i]>'9'){p[i] = p[i]-'9'+'0'-1;}}i++;}
}
解码函数
void Decryption(char p[], int n)
{int i = 0;while (p[i] != '\0') {if (p[i] >= 'a' && p[i] <= 'z') {p[i] = p[i] - n;if (p[i] < 'a') {p[i] = p[i] + 'z' - 'a' + 1;}} if (p[i] >= 'A' && p[i] <= 'Z') {p[i] = p[i] - n;if (p[i] < 'A') {p[i] = p[i] + 'Z' - 'A' + 1;}}if (p[i] >= '0' && p[i] <= '9') {p[i] = p[i] - n;if (p[i] < '0') {p[i] = p[i] + '9' - '0' + 1;}}i++;}
}
就是把逻辑反过来而已
运行效果
总结
我们学习了:
1、ASCII码运算(字符本质是数字)
2、isalnum函数
3、标记法(return法)避免错误输入
4、凯撒密码
5、编程流程图
说到密码,我想起了图灵机,最初就是用来解码的
以上均是本人理解,如有不对欢迎各位大佬评论区指出~