2012-11-25 35 views
2

我碰到這個代碼就來了:的的V @ genere算法在C#中的解釋

Byte Vigenere Cipher, error with decryption

但試圖跟隨我做了一個新的問題,關於它的規則。

下面的算法使用,我想更好的理解到它:

Byte[] result= new Byte[plaintext.Length]; 

key = key.Trim().ToUpper(); 

int keyIndex = 0; 
int keylength = key.Length; 

for (int i = 0; i < plaintext.Length; i++) 
{ 
    keyIndex = keyIndex % keylength; 
    int shift = (int)key[keyIndex] - 65; 
    result[i] = (byte)(((int)plaintext[i] + shift) % 256); 
    keyIndex++; 
} 

我是正確的思維的關鍵需求進行修整,因爲它是以Unicode?因此從首都中減去65就會產生一個共同的字符/符號?

+0

鍵的類型是什麼? – elyashiv

+0

您可以編寫'(int)key [keyIndex] - 'A''。 – usr

+0

關鍵是需要修剪,以擺脫開始和結束的白色空間。你不必只用字母來使用vigenere,你可以使用任何符號。 – elyashiv

回答

1

大寫字母A的ASCII值是65. key中的所有字符都轉換爲大寫字母,這隻會返回key中每個字母的字母索引。

key中的每個字母都被轉換爲一個數字,原始字符串中的每個字母都是「向上移動字母」的位置數。

如果你的關鍵是BAD,這會變成數字1,0和3,然後應用到的「Hello World」,如下所示:

Hello world 
10310310310 <-- added to each character 
Ieomo#xoumd 

您可以通過添加下面你這個代碼演示了這一點:

StringBuilder demonstration = new StringBuilder(); 
foreach (byte b in result) 
{ 
    demonstration.Append((char)b); 
} 
Console.WriteLine(demonstration.ToString()); 
+0

感謝您的幫助:) – Flak714

+0

進一步瞭解這一點,我對它爲什麼被調製爲256而不是127,因爲C#似乎沒有使用擴展的ASCII? – Flak714

+0

ASCII數據仍然佔用8位,即使只有7位被使用 - 所以256是安全的 - 但是你是對的,它沒有考慮到這種「溢出」的情況。順便說一下,C#使用Unicode來處理'string'和'char's;結果變量是一個8位的字節數組(無編碼)。 –