c语言实现简单数据【对称加密】

数据加密-对称加密

    对称加密是一种加密方式,其中使用相同的密钥进行加密和解密。也就是说,发送方和接收方使用相同的密钥来加密和解密数据。这种加密方式非常快速且安全,但密钥的管理和分发可能会变得复杂和困难。对称加密算法包括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群联系我,欢迎你的到来。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pymili

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值