2012-03-05 20 views
3

我想在程序中混淆字符串。目前,我只有一個簡單的字符串反轉工作。我希望能夠對數據執行異或擾碼以使其更加安全,但我嘗試的方法無法正常工作。XOR如何在C中加擾字符串,並使用相同的函數再次加密?

使用相同的函數和輸入類型來解碼字符串。這對字符串反轉沒有任何問題,因爲它只是反轉回來,但這可以通過XOR輕鬆完成,而不會太複雜?我寧願如果進程只保留一個字符串,就像逆轉一樣。這是我的逆轉功能。

void reverse_string(unsigned char *buf, int length) 
{ 
int i; 
unsigned char temp; 

    for (i = 0; i < length/2; i++) 
    { 
     temp = buf[i]; 
     buf[i] = buf[length - i - 1]; 
     buf[length - i - 1] = temp; 
    } 
} 

這裏是在XOR功能

void charxor(char * text, int len) { 
const unsigned char enc[8]={173,135,131,121,110,119,187,143}; 
char ch; 
int i; 
int ind=0; 
for (i=0;i<len;i++) { 
    ch=*text++; 
    if (ch) 
     *text = ch^enc[ind++]; 
    ind %=8; 
} 


} 

嘗試誰能幫助?將不勝感激!

+1

您正在寫一個字節的XORed字符,這就是導致奇怪行爲的原因。此外,該空檢查會導致加密和解密不對稱。 – 2012-03-05 19:13:21

+0

你如何通過解釋你當前的嘗試失敗來幫助我們。我的意思是,我可以自己解決問題,但是你真的應該在你的問題中包含這些細節。 – 2012-03-05 19:13:55

回答

10

你似乎過分複雜一點。試試這個:

void charxor (unsigned char *text, int len) { 
    const unsigned char enc[8] = {173,135,131,121,110,119,187,143}; 
    int i; 
    for (i = 0; i < len; i++) { 
     text[i] ^= enc[i % 8]; 
    } 
} 

注意,XOR操作可以引入空字符到字符串,那麼你真的需要跟蹤它的長度,而不是僅僅依靠尾隨空字符的存在。

還要記住的是,雖然這可能確實是相對來說「更加安全」不僅僅是扭轉字符串,任何合理聰明的人能夠訪問輸出足夠多的樣本大概可以弄清楚如何將其解碼在大約十五分鐘左右。

+2

對這個函數的改進是用僞隨機數發生器替換數組enc。爲了簡單起見,你總是可以給隨機數生成一個固定的數字(例如'srand(123)'),並使用'rand()&0xFF'而不是'enc [i%8]'。這會使它有點「更強」...... – guga 2012-03-05 19:38:30

相關問題