2012-12-03 69 views
1

以下代碼會生成一個文本文件,其中包含從不同的可讀文本文件派生的編碼消息。使用給定算法解密消息

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

    main() 
    { 
    FILE *f, *f_enc; 
    char c, c_enc; 
    int ind, a[26], r_val; 

    srandom(time(NULL)); 
    for (ind=0; ind<26; ind++) a[ind]=-1; 
    for (ind=0; ind<26; ind++){ 
     do 
     r_val=random()%26; 
     while (a[r_val]!=-1); 
     a[r_val]=ind; 
    } 

    f=fopen("plain.txt","r"); 
    f_enc=fopen("cipher.txt","w"); 
    while (!feof(f)) { 
     c=fgetc(f); 
     if ((c>='A' && c<='Z')||(c>='a' && c<='z')) { 
     if (c>='A' && c<='Z') c = c + 'a' - 'A'; 
     c=a[c-'a']+'a'; 
     } 
     fputc(c,f_enc); 
    } 
    fclose(f); 
    fclose(f_enc); 
    } 

我不清楚的是代碼實現編碼消息的整體算法。

  • 它是否從字符中減去ASCII值('a - 'A)以產生編碼字符?

一個例子輸出如下:

xohq xpu ouuf yubliu spieqxkhq, hzj hcc xpilnap xpu plnqu 
tln slncj puhi ku yuhxeza xpu slkmnxui oexp xpu klnqu. 
xpu jeqf ohq pnza nm ez xpu jeqf jieru oexp shiu, 
hzj, zuujcuqq xl qht, e zuhict mnccuj lnx kt phei. 

e ahru nm bli xphx zeapx, alx iuhjt bli yuj, 
hzj olzjuiuj, "qplncj e gnqx ynt shijq ezqxuhj?" 
khkh hzj jhjjt phj gnqx pex xpu pht, 
ql e xlcj xpuk allj zeapx, hzj ouzx lz kt oht. 

我要去嘗試反向工程這看看我是否能得到阿霍德這是怎麼回事的。 歡迎任何猜測!

+1

看來如果沒有加密過程中使用的原始'a'數組的副本,將難以解密密文。 –

回答

4

這是一個簡單的替換,例如在密碼拼圖中使用。可以用letter frequency analysis來解決。

存在automated solvers。該示例的原文是:

TWAS在聖誕節前一週,並全部通過房子,你可以 聽見我跳動的電腦鼠標。磁盤被掛在了 的磁盤驅動器上,不用說,我幾乎掏出了我的 頭髮。我放棄了那天晚上,準備睡覺,並想知道, '我應該只買卡嗎?'媽媽和爸爸剛剛擊中了乾草,所以我告訴他們晚安,然後繼續前進。