簡易Caesar cipher程式撰寫

一種最簡單且多為人知的加密技術。它是一種替換加密的技術,明文中的所有字母都在字母表上向後或向前按照一個數字進行位移後被替換成密文。

例如,當位移量為4的時候,所有的字母A將被替換成E,B被替換成F,以此類推。凱撒密碼通常被作為其他加密方法中的步驟,例如維吉尼亞密碼。但礙於英文字母長度有限,凱薩密碼非常容易被破解,在實際應用上也無法保證通信安全。

在程式上的編寫操作,凱撒密碼的加密、解密方法是通過同餘的數學方法進行計算。首先將英文字母用數字代替,A=0,B=1,…,Z=25。此時偏移量為n的加密方法即為:

                          f(a)=(a+n) mod 26

解密就是:

                          f(a)=(a-n) mod 26

 

以下為程式碼:

/*Caesar cipher*/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main(){
    char *data;                                      //輸入    
    char *target=malloc(100 * sizeof(char));         //輸出 
    int key=0;                                       //金鑰 
    FILE *fPtr;
    unsigned long leng, count, i;
    int ch;
    
    //讀檔(須先建立source.txt) 
    fPtr = fopen("source.txt", "r");
    fseek(fPtr, 0, SEEK_END);
    leng = ftell(fPtr);
    fseek(fPtr, 0, SEEK_SET);
    data = (char *) malloc((leng + 1) * sizeof(char));
    fread(data, 1, leng, fPtr);  
    fclose(fPtr);
    data[leng] = '\0';
      
    printf("\n讀入檔案: %s\n\n", data);
    printf("請選擇加密或解密 1.解密(位移向前) 2.加密(位移向後) : ");
    scanf("%d",&ch);
    printf("請輸入位移量(範圍為0~25) : ");
    scanf("%d",&key);
    
    //轉大寫
    count = 0;
    for (i=0; i<leng; i++)
    if (isalpha(data[i])) data[count++] = toupper(data[i]);
    data[count] = '\0';
    
    switch(ch){
        case 1:    //向前         
            i = 0; 
            while (data[i] != '\0') {
            if (isalpha(data[i])){
            target[i]=data[i] - 65;
            target[i]=(target[i]+26-key)%26;
            target[i]=target[i]+97;
            } 
            else target[i] = data[i]; 
            i++; 
            }
            target[i] = '\0';
            printf("\n明文 : %s\n\n", target); 
            break;
        case 2:    //向後               
            i = 0; 
            while (data[i] != '\0') {
            if (isalpha(data[i])){
            target[i]=data[i] - 65;
            target[i]=(target[i]+26+key)%26;
            target[i]=target[i]+97;
            } 
            else target[i] = data[i]; 
            i++; 
            }
            target[i] = '\0';
            printf("\n密文 : %s\n\n", target); 
            break;
        default:
            printf("\n錯誤\n");
            break;    
    }
    
    //輸出檔案 
    fPtr = fopen("result.txt", "w");
    fwrite(target, 1, count, fPtr);
    fclose(fPtr);
    
    system("pause");
    return 0;
}

 

輸出結果:

加密:

 

解密:

arrow
arrow

    ATing 發表在 痞客邦 留言(0) 人氣()