数据加密-对称加密
对称加密是一种加密方式,其中使用相同的密钥进行加密和解密。也就是说,发送方和接收方使用相同的密钥来加密和解密数据。这种加密方式非常快速且安全,但密钥的管理和分发可能会变得复杂和困难。对称加密算法包括AES(高级加密标准)、DES(数据加密标准)、3DES(三重数据加密标准)等。简单来说,对称加密就是加密与解密使用相同的密钥。
ASCII编码
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是最常用的字符编码方式之一,它使用7位或8位二进制数表示字符。ASCII编码主要用于计算机和网络通信中传输文本和数据。它支持的字符集包括大小写字母、数字、标点符号、控制字符等。ASCII编码的优点是简单、易于实现、通用性强,但它的字符集比较小,无法表示复杂的字符和图形。ASCII没法对中文进行处理。
c语言与ASCII
c语言的 char 数据类型其原理就是使用编码来显示字符,因此我们可以使用这个特点来实现加密功能。
事例
char _char = 'a';
printf("%d\n", _char);
// 输出: 97
完整代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
int* StrToASCII(const char* _str, long len)
{
/*
将 _str 中的字符转换成ascii码值并返回指针
*/
// 使用动态内存分配创建数组
int* result = (int*)malloc(len * sizeof(int));
for (size_t i = 0; i < len; i++) {
result[i] = (int)*(_str+i);
}
return result;
}
char* readFile(char* filePath, long* fileSize)
{
/*
读取文件内容并返回指针
*/
FILE* fp = fopen(filePath, "r");
// 计算文件内容长度
fseek(fp, 0, SEEK_END);
long fileLength = ftell(fp);
fseek(fp, 0, SEEK_SET);
char* result = (char *)malloc((fileLength+1) * sizeof(char));
if (result == NULL) {
fclose(fp);
return NULL;
}
// 读取所有内容
size_t bytesRead = fread(
result,
sizeof(char),
fileLength,
fp
);
fclose(fp);
if (bytesRead != fileLength) {
free(result);
return NULL;
}
result[fileLength] = '\0';
if (fileSize != NULL) {
// 給指针赋值文件内容长度
*fileSize = fileLength;
}
return result;
}
int enc(char *source, long len, char key, char* filename)
{
/*
加密source中的字符内容,并生成加密文件。
*/
int* sta = StrToASCII(source, len);
// 写入加密后内容。
FILE* fp = fopen(filename, "w+");
if (fp != NULL) {
for (int i = 0; i < len; i++) {
fprintf(fp, "%d%c", sta[i], key);
}
} else {
printf("打开文件失败!");
return false;
}
fclose(fp);
// 释放动态内存分配的内存
free(sta);
// printf("key:%d\n", result[len-1]);
return true;
}
char* dec(const char* date, long fileLength, char key) {
/*
解密date中的数据并返回指针
*/
if (date == NULL) {
return NULL;
}
// printf("%s\n", date);
char* result = (char *)malloc((fileLength+1) * sizeof(char));
if (result == NULL) {
printf("内存申请失败!");
return NULL;
}
int char_cache[3];
int date_count = 0;
int count = 0;
// 对每一个字符进行处理。
for (int i = 0; i < fileLength; i++) {
if (date[i] == key) {
int asccii = 0; // 用于存放数字asccii码值
for (int j = 0; j < date_count; j++) {
// 对单独的字符数字进行合并为源大小
asccii = (asccii*10)+char_cache[j];
}
printf("asccii: %d\n", asccii);
date_count = 0;
result[count] = (char)asccii;
count++;
continue;
} else {
// 将单个字符转换并存放
char_cache[date_count] = date[i] - '0';
date_count++;
}
}
result[fileLength+1] = '\0';
return result;
}
int main()
{
char _char[] = "I'm PYmili";
char key = ';'; // 密钥
int strLen = 0; // 字符总长度
while (_char[strLen] != '\0') {
printf("_str[%d] = %c\n", strLen, _char[strLen]);
strLen++;
}
char* outputread;
long fileLength;
if (enc(_char, strLen, key, "output.txt") == true) {
printf("加密成功\n");
outputread = readFile("output.txt", &fileLength);
printf("enc: %s\n", outputread);
} else {
printf("加密失败\n");
}
// printf("%s\n", outputread);
char* decStr = dec(outputread, fileLength, key);
if (decStr == NULL) {
printf("解密失败");
}
printf("dec: %s", decStr);
free(decStr);
free(outputread);
return 0;
}
其中的enc将字符串中的每个字符转换成ASCII码值,再通过char key形参的值分隔买个ASCII码并新建filename文件保存。
dec就就是解密过程,也是通过char key值把字符逐个转换成char类型并返回指针。
联系我
你可以通过: 706128290群联系我,欢迎你的到来。