简易的对数据进行加密——C和指针
首先选定一个单词作为密钥,例如TRAILBLAZERS,通过下面的语句去除掉其中重复的字母。
这里默认了输入的全是大写字母。
1 int j = 0; 2 for (j = 0; j < i; j++) 3 { 4 int k = j+1; 5 for (; k < i; k++) 6 { 7 if (key[j] == key[k]) //这里我将重复的元素,用空白字符代替 8 key[k] = ' '; 9 } 10 } 11 12 int index = 0; 13 for (int i = 0; key[i] != '\0'; i++) //再通过循环将空白字符从数组中排除 14 { 15 if (isspace(key[i])) 16 continue; 17 else 18 { 19 key[index] = key[i]; 20 index++; } 21 } 22 key[index] = '\0'
通过上述方法得到:TRAILBZES
其次,我们用同样的方法将26字母表中与上述字母对应的字母删去。
利用strcat()函数,将两者拼接,得到密匙:TRAILBZESCDFGHJKMNOPQUVWXY
所输入的信息,将依据此密匙进行加密,例如字母A,将被加密为T。
表1:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
表2:T R A I L B Z E S C D F G H J K M N O P Q U V W X Y
例如输入:ATTACK AT DAWN
通过确认字母A在表1的下标,进而搜寻表2中相应下标的元素:T
得出加密信息:TPPTAD TP ITVH
void encrypt(char* data, char const* key) { int len = strlen(data); int ch; for (int j = 0; j < len; j++) { int index = 0; if (isalpha(data[j])) { ch = toupper(data[j]); while (alpha_rel[index] != ch) index++; if (isupper(data[j])) //这里是为了还原字母大小,例如输入attACK,那么给出的信息就是tppTAD data[j] = key[index]; else data[j] = tolower(key[index]); } else data[j] = data[j]; } }
完整代码如下:
# include <stdio.h> # include <ctype.h> # include <stdlib.h> char alpha_rel[]= "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char alpha[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int prepare_key(char* key); void encrypt(char* data, char const* key); char* s_gets(char* str, int n); int main() { char* key = (char*)malloc(27 * sizeof(char)); //密匙单词 if (key == NULL) { puts("Fail to allocate the memory"); exit(1); } char encryption[50]; //需要加密的信息 puts("Enter the key"); s_gets(key,27); prepare_key(key); puts(key); //密匙 puts("Enter your info need to encryption"); if (s_gets(encryption, 50)) encrypt(encryption,key); puts(encryption); free(key); return 0; } # include <string.h> int prepare_key(char* key) //密钥函数 { if (*key == '\0') return -1; int i = 0; while (key[i] != '\0') { if (isalpha(*key)) { key[i] = toupper(key[i]); i++; } else return -1; } int j = 0; for (j = 0; j < i; j++) { int k = j+1; for (; k < i; k++) { if (key[j] == key[k]) key[k] = ' '; } } int index = 0; for (int i = 0; key[i] != '\0'; i++) { if (isspace(key[i])) continue; else { key[index] = key[i]; index++; } } key[index] = '\0'; int len = strlen(key); for (j = 0; j < len; j++) { int k = 0; for (; k < 27; k++) { if (key[j] == alpha[k]) { alpha[k] = ' '; break; } } } int new_index = 0; for (int pre_index = 0; alpha[pre_index] != '\0'; pre_index++) { if (isspace(alpha[pre_index])) continue; else { alpha[new_index] = alpha[pre_index]; new_index++; } } alpha[new_index] = '\0'; strcat(key, alpha); return 1; } void encrypt(char* data, char const* key) //加密函数 { int len = strlen(data); int ch; for (int j = 0; j < len; j++) { int index = 0; if (isalpha(data[j])) { ch = toupper(data[j]); while (alpha_rel[index] != ch) index++; if (isupper(data[j])) data[j] = key[index]; else data[j] = tolower(key[index]); } else data[j] = data[j]; } } char* s_gets(char* str, int n) //输入函数 { char* ret_val; int i = 0; ret_val = fgets(str, n, stdin); if (ret_val) { while (str[i] != '\n' && str[i] != '\0') i++; if (str[i] == '\n') str[i] = '\0'; else while (getchar() != '\n') ; } return ret_val; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理