对称加密是一种加密方式,其中使用相同的密钥进行加密和解密。也就是说,发送方和接收方使用相同的密钥来加密和解密数据。这种加密方式非常快速且安全,但密钥的管理和分发可能会变得复杂和困难。对称加密算法包括AES(高级加密标准)、DES(数据加密标准)、3DES(三重数据加密标准)等。简单来说,对称加密就是加密与解密使用相同的密钥。
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是最常用的字符编码方式之一,它使用7位或8位二进制数表示字符。ASCII编码主要用于计算机和网络通信中传输文本和数据。它支持的字符集包括大小写字母、数字、标点符号、控制字符等。ASCII编码的优点是简单、易于实现、通用性强,但它的字符集比较小,无法表示复杂的字符和图形。ASCII没法对中文进行处理。
c语言的 char 数据类型其原理就是使用编码来显示字符,因此我们可以使用这个特点来实现加密功能。
- char _char = 'a';
- printf("%d\n", _char);
-
- // 输出: 97
- #include
- #include
- #include
- #include
-
-
- 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群联系我,欢迎你的到来。