2014-01-25 195 views
0

任何人都可以解釋這套代碼的工作原理嗎?C++凱撒密碼加密

string LoginAccess::decryptPass(string pass) { 

int count = 0; 

while (count < pass.length()) { 

    if (isalpha(pass[count])) { 
     //For Caps lock 
     if (pass[count] > 64 && pass[count] < 91) { 
      if (pass[count] < 88) { 
       pass[count] += 3; 
      } else if (pass[count] == 88) { 
       pass[count] = 'A'; 
      } else if (pass[count] == 89) { 
       pass[count] = 'B'; 
      } else 
       pass[count] = 'C'; 
      //For small char 
     } else { 
      if (pass[count] < 120) { 
       pass[count] += 3; 
      } else if (pass[count] == 120) { 
       pass[count] = 'a'; 
      } else if (pass[count] == 121) { 
       pass[count] = 'b'; 
      } else 
       pass[count] = 'c'; 
     } 
    } 
    count++; 
    } 

return pass; 
} 

64,91等數字是什麼意思? 爲什麼只設置a,b,c?字母表的其餘部分會發生什麼?

+0

看起來像ABCabc以外的所有字符都存儲爲(ASCII碼 - 3)。其他人分別是88 89 90 120 121 122。 –

回答

3

此函數循環字符串pass,遞增計數以用作數組的索引。該代碼正在解碼塞薩爾密碼,其中每個字母在字母表中按一定數量的位置向下移動,在這種情況下,是三位。

它將當前字符(pass[count])與ASCII字符代碼進行比較。每個字母和標點符號都有一個與其相關的數字。您可以在this page上看到一個字符圖表。正如你所看到的那樣,大寫字母('A'到'Z')跨度65到90,小寫字母('a'到'z')97到122.

所以代碼檢查字母屬於大寫或小寫。在那裏默認情況下將字母向前移動三個空格,但如果它與字母表的最後三個字母一起移動,那將推入標點符號的數目。所以特殊的編纂是爲了檢查這一點。如果pass[count]是88,字符'X',則手動設置爲'A',數字65.如果它增加3,則它變爲91,字符'['。

代碼有一些缺點,因爲它只支持字母。如果標點符號位於pass字符串中,則它們將被更改爲另一個隨機標點符號,從用戶的角度來看沒有任何理由。