2011-04-01 56 views
8

我一直在試驗一個簡單的基於XOR的文本混淆算法。據推測,當算法連續運行兩次時,我應該找回原始輸入 - 但在我的實現中,只有有時會發生。這裏是我的代碼,用一些隨機的文字說明問題:隨機文本混淆算法失敗

#include <stdio.h> 

void obfuscate(char *text) { 
     char i = 0, p = 0; 

     while (text[i] != 0) { 
       text[i] = (text[i]^(char)0x41^p) + 0xfe; 

       p = i++; 
     } 
} 


int main(int argc, char **argv) { 
    char text[] = "Letpy,Mprm` Nssl'w$:0==!"; 

    printf("%s\n", text); 

    obfuscate(text); 

    printf("%s\n", text); 

    obfuscate(text); 

    printf("%s\n", text); 

    return 0; 
} 

我怎樣才能解決這個算法,它確實是其本身的逆?任何提高混淆程度的建議?

+0

我沒有深入到算法中,而是'p = i ++;'使'p = 0'變成了兩次。這是預期的行爲嗎? – khachik 2011-04-01 20:01:42

+2

@thkala我運行了你的代碼,它對我來說非常合適。也許別人可以複製這個問題? – Kromey 2011-04-01 20:14:30

+0

@Kromey:它呢?太好了! +1 – thkala 2011-04-01 20:24:46

回答

6

我在這裏看到了兩個問題:

  1. 操作+ 0xfe不是其本身的逆。如果您刪除它並僅保留XOR,則每個字節將按預期恢復到其原始值。

  2. 更微妙的問題:加密文本可能會創建一個零字節,因爲您使用以空字符結尾的字符串,所以會截斷文本。最好的解決方案可能是單獨存儲文本長度,而不是以加密文本結束。

+1

+1 0字節可能性的好處。 – Jonathan 2011-04-01 20:05:00

+0

+1用於捕捉困擾我的兩個問題,同時確保此代碼*做了它應該做的事情:-)快樂的愚人節(有點遲,但是...)! – thkala 2011-04-02 08:53:26

1

爲什麼「添加+ 0xfe」?那是(至少一個)你的不可逆性的來源。

我看到你使用前面的文本值p的XOR來混淆它,這意味着重複的字母會導致值之間來回跳動。

+0

'p'是前一個計數器,而不是以前的文本值。 – Jonathan 2011-04-01 20:04:31

+1

+1努力......愚人節快樂:-) – thkala 2011-04-02 08:55:55

+0

啊。謝謝。我完全忘記了昨天是愚人節。好的!:) – 2011-04-02 14:12:14

3

你做的不僅僅是在這裏簡單的XOR以上(如果你留在這text[i] = text[i]^(char)0x41這是可行的;你甚至可以留在^ p如果你想,但+ 0xfe休息吧)。

爲什麼你想使用這種文本混淆?非安全混淆的常見方法是Base64(需要單獨編碼和解碼)和Rot13(第二次應用反向)。

+0

努力的+1 ...快樂的愚人節:-) – thkala 2011-04-02 08:54:34

2

首先,解碼

text[i] = (text[i]^(char)0x41^p) + 0xfe; 

你需要它的反函數,那將是

text[i] = (text[i] - 0xfe)^(char)0x41^p; 

其次,char i將只能與短字符串的工作,使用int

最後(也是最重要的!)是,在這樣的「混淆」之後,字符串可以在其原始結束之前終止零,因此您還應該檢查其原始長度或確保在中間不能得到零。

+0

+1的努力...快樂的愚人節:-) – thkala 2011-04-02 08:55:01