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


    数据加密-对称加密

        对称加密是一种加密方式,其中使用相同的密钥进行加密和解密。也就是说,发送方和接收方使用相同的密钥来加密和解密数据。这种加密方式非常快速且安全,但密钥的管理和分发可能会变得复杂和困难。对称加密算法包括AES(高级加密标准)、DES(数据加密标准)、3DES(三重数据加密标准)等。简单来说,对称加密就是加密与解密使用相同的密钥。

    ASCII编码

        ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是最常用的字符编码方式之一,它使用7位或8位二进制数表示字符。ASCII编码主要用于计算机和网络通信中传输文本和数据。它支持的字符集包括大小写字母、数字、标点符号、控制字符等。ASCII编码的优点是简单、易于实现、通用性强,但它的字符集比较小,无法表示复杂的字符和图形。ASCII没法对中文进行处理。

    c语言与ASCII

        c语言的 char 数据类型其原理就是使用编码来显示字符,因此我们可以使用这个特点来实现加密功能。

    事例

    1. char _char = 'a';
    2. printf("%d\n", _char);
    3. // 输出: 97

    完整代码

    1. #include
    2. #include
    3. #include
    4. #include
    5. int* StrToASCII(const char* _str, long len)
    6. {
    7. /*
    8. 将 _str 中的字符转换成ascii码值并返回指针
    9. */
    10. // 使用动态内存分配创建数组
    11. int* result = (int*)malloc(len * sizeof(int));
    12. for (size_t i = 0; i < len; i++) {
    13. result[i] = (int)*(_str+i);
    14. }
    15. return result;
    16. }
    17. char* readFile(char* filePath, long* fileSize)
    18. {
    19. /*
    20. 读取文件内容并返回指针
    21. */
    22. FILE* fp = fopen(filePath, "r");
    23. // 计算文件内容长度
    24. fseek(fp, 0, SEEK_END);
    25. long fileLength = ftell(fp);
    26. fseek(fp, 0, SEEK_SET);
    27. char* result = (char *)malloc((fileLength+1) * sizeof(char));
    28. if (result == NULL) {
    29. fclose(fp);
    30. return NULL;
    31. }
    32. // 读取所有内容
    33. size_t bytesRead = fread(
    34. result,
    35. sizeof(char),
    36. fileLength,
    37. fp
    38. );
    39. fclose(fp);
    40. if (bytesRead != fileLength) {
    41. free(result);
    42. return NULL;
    43. }
    44. result[fileLength] = '\0';
    45. if (fileSize != NULL) {
    46. // 給指针赋值文件内容长度
    47. *fileSize = fileLength;
    48. }
    49. return result;
    50. }
    51. int enc(char *source, long len, char key, char* filename)
    52. {
    53. /*
    54. 加密source中的字符内容,并生成加密文件。
    55. */
    56. int* sta = StrToASCII(source, len);
    57. // 写入加密后内容。
    58. FILE* fp = fopen(filename, "w+");
    59. if (fp != NULL) {
    60. for (int i = 0; i < len; i++) {
    61. fprintf(fp, "%d%c", sta[i], key);
    62. }
    63. } else {
    64. printf("打开文件失败!");
    65. return false;
    66. }
    67. fclose(fp);
    68. // 释放动态内存分配的内存
    69. free(sta);
    70. // printf("key:%d\n", result[len-1]);
    71. return true;
    72. }
    73. char* dec(const char* date, long fileLength, char key) {
    74. /*
    75. 解密date中的数据并返回指针
    76. */
    77. if (date == NULL) {
    78. return NULL;
    79. }
    80. // printf("%s\n", date);
    81. char* result = (char *)malloc((fileLength+1) * sizeof(char));
    82. if (result == NULL) {
    83. printf("内存申请失败!");
    84. return NULL;
    85. }
    86. int char_cache[3];
    87. int date_count = 0;
    88. int count = 0;
    89. // 对每一个字符进行处理。
    90. for (int i = 0; i < fileLength; i++) {
    91. if (date[i] == key) {
    92. int asccii = 0; // 用于存放数字asccii码值
    93. for (int j = 0; j < date_count; j++) {
    94. // 对单独的字符数字进行合并为源大小
    95. asccii = (asccii*10)+char_cache[j];
    96. }
    97. printf("asccii: %d\n", asccii);
    98. date_count = 0;
    99. result[count] = (char)asccii;
    100. count++;
    101. continue;
    102. } else {
    103. // 将单个字符转换并存放
    104. char_cache[date_count] = date[i] - '0';
    105. date_count++;
    106. }
    107. }
    108. result[fileLength+1] = '\0';
    109. return result;
    110. }
    111. int main()
    112. {
    113. char _char[] = "I'm PYmili";
    114. char key = ';'; // 密钥
    115. int strLen = 0; // 字符总长度
    116. while (_char[strLen] != '\0') {
    117. printf("_str[%d] = %c\n", strLen, _char[strLen]);
    118. strLen++;
    119. }
    120. char* outputread;
    121. long fileLength;
    122. if (enc(_char, strLen, key, "output.txt") == true) {
    123. printf("加密成功\n");
    124. outputread = readFile("output.txt", &fileLength);
    125. printf("enc: %s\n", outputread);
    126. } else {
    127. printf("加密失败\n");
    128. }
    129. // printf("%s\n", outputread);
    130. char* decStr = dec(outputread, fileLength, key);
    131. if (decStr == NULL) {
    132. printf("解密失败");
    133. }
    134. printf("dec: %s", decStr);
    135. free(decStr);
    136. free(outputread);
    137. return 0;
    138. }

    其中的enc将字符串中的每个字符转换成ASCII码值,再通过char key形参的值分隔买个ASCII码并新建filename文件保存。

    dec就就是解密过程,也是通过char key值把字符逐个转换成char类型并返回指针。

    联系我

    你可以通过: 706128290群联系我,欢迎你的到来。

  • 相关阅读:
    金仓数据库KingbaseES客户端应用参考手册--13. sys_isready
    Mysql卸载
    修改hosts 不生效? 三种方法解决
    OFDM原理及MATLAB仿真
    (原创)基于springboot,vue宠物商城定制版v3.0
    【TypeScript笔记】04 - 在React中使用TypeScript
    harbor-db restarting问题
    亚马逊创建eks
    基于深度学习的双目重建
    Python + Django4 搭建个人博客(一) :搭建博客需要哪些技术,网站包括哪些内容
  • 原文地址:https://blog.csdn.net/qq_53280175/article/details/134536842