首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言實現字符加密解密:基於 ASCII 碼循環位移算法

     編輯:C 語言問答

簡易字符加密解密程序設計

需求:輸入字符串,按密鑰序列 4,9,6,2,8,7,3 循環加密(ASCII 碼加密鑰),解密後與原文比對,一致則輸出解密文,否則報錯。

算法原理

  • 加密:encrypt[i] = source[i] + key[source[i] % 7]。此處取模 7 使密鑰索引與字符值關聯,增加一定隨機性。
  • 解密:decrypt[i] = encrypt[i] - key[source[i] % 7]。注意:解密時仍用原文 source[i] 計算索引,而非密文,否則無法還原。
  • 驗證:strcmp(source, decrypt) == 0 判斷解密是否成功。

完整代碼(含安全改進)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_LEN 80
int main(void) {
    char source[MAX_LEN], encrypt[MAX_LEN], decrypt[MAX_LEN];
    int key[7] = {4, 9, 6, 2, 8, 7, 3};
    size_t i, len;

    printf("請輸入字符串: ");
    if (fgets(source, MAX_LEN, stdin) == NULL) return 1;
    // 去除 fgets 讀入的換行符
    len = strlen(source);
    if (len > 0 && source[len - 1] == '\n')
        source[--len] = '\0';

    // 加密
    for (i = 0; i < len; i++)
        encrypt[i] = source[i] + key[source[i] % 7];
    encrypt[len] = '\0';

    // 解密
    for (i = 0; i < len; i++)
        decrypt[i] = encrypt[i] - key[source[i] % 7];
    decrypt[len] = '\0';

    printf("加密結果: %s\n", encrypt);

    // 驗證
    if (strcmp(source, decrypt) == 0)
        printf("解密成功: %s\n", decrypt);
    else
        printf("解密失敗!\n");

    return 0;
}

關鍵點與改進說明

項目原代碼問題改進方案
輸入函數使用 gets,極度不安全,已被 C11 移除改用 fgets,限制長度,防止緩衝區溢出
密鑰索引source[i] % 7 導致索引僅取決於字符值,相同字符加密固定可改為 i % 7 使位置相關,或引入更複雜的流密鑰生成器
字符溢出加密後 ASCII 碼可能超出 0-127 範圍,導致顯示亂碼或截斷建議對 256 取模:(source[i] + key[...]) % 256,解密時同理
可打印性加密結果可能包含控制字符,無法正常顯示/傳輸實際應用常用 Base64、Hex 編碼將密文轉為可打印字符

擴展思路

  • 將密鑰改為命令行參數或配置文件讀取,提高靈活性。
  • 實現文件級加密:以二進制模式 rb/wb 逐塊處理大文件。
  • 學習現代密碼學:AES、ChaCha20 等對稱加密,RSA、ECC 非對稱加密。

本例屬教學演示級算法,切勿用於真實數據保護。理解其原理有助於進階學習密碼學基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved