2015-06-11 85 views
1

我試圖學習簡單的密碼學和作爲初學者,我試圖實現以下。功能XOR兩個128位。我如何生成128位值?

一個函數,將兩個128位params(鍵和明文)作爲輸入並返回它們的XOR。我知道異或並不安全,但我剛從一個簡單的例子開始。

這是我曾嘗試:

class Program 

    static void Main(string[] args) 
    { 
     string key = "B25829846AED8"; //128 bits?? 
     string plaintext = "A9BB51625ECBE"; //128 bits?? 

     //Convert key to byte array 
     byte[] keyBytes = new byte[key.Length * sizeof(char)]; 
     System.Buffer.BlockCopy(key.ToCharArray(), 0, keyBytes, 0, keyBytes.Length); 

     //Convert plaintext to byte array 
     byte[] plaintextBytes = new byte[plaintext.Length * sizeof(char)]; 
     System.Buffer.BlockCopy(plaintext.ToCharArray(), 0, plaintextBytes, 0, plaintextBytes.Length); 

     //Encrypt (XOR) 
     string result = new Encrypter().encrypt(keyBytes, plaintextBytes); 
    } 
} 

Encrypter.cs:

class Encrypter 
{ 

    public string encrypt(byte[] key, byte[] plaintext) 
    { 
     BitArray keyBits = new BitArray(key); 
     BitArray plaintextBits = new BitArray(plaintext); 

     if(keyBits.Length == plaintextBits.Length) 
     { 
      BitArray result = keyBits.Xor(plaintextBits); 
      return result.ToString(); 
     } 

     return null; 
    } 
} 

我的問題:

我用什麼作爲關鍵掙扎,純文本。我怎樣才能確保每個值都是正確的128位?

E.g. B25829846AED8顯然是一個128位的WEP密鑰。如果我將此分配給我的key變量,並且當我輸入encrypt方法時,keyBits.Length屬性的值爲208.這是我沒有得到的。另外參數key的長度爲26,我也很困惑。

+0

XOR其實是非常安全的。事實上,如果做得好的話,這是唯一的「不可破解的」加密數據。它被稱爲一次性墊,或OTP。但是,如果您只使用一次,只有一條消息,並且保持安全墊的安全,則它是安全的。 –

回答

1

爲什麼鍵長26?

C#-string是unicode,所以你可以寫出所有的字符,例如。中文,日文等。這需要兩個字節。 13 * 2 = 26。

是你的wep-key 128位 你有一個使用104位密鑰的128位wep-protocoll的密鑰。 (有趣的時間)Wiki on Wep

但據我所知,你不是試圖實現wep,你試圖編碼的東西。以兩個隨機整數將它們轉換爲字節並將它們放在一起。 BAM-128位:)

using System.Linq 

byte[] key = BitConverter.GetBytes(25).Concat(BitConverter.GetBytes(284)) ; 

除此之外你縫有它在控制之下,好運:)

1

您想使用128位密鑰或換句話說16個字節。字符串由字符組成,C#中的char數據類型使用2個字節(16位)。所以你可以從長度爲8的字符串中創建一個16字節的密鑰,這是有問題的,因爲由於不可打印的字符等原因很難使用完整的128位範圍。將鍵值表示爲從頭開始長度爲16的字節數組會更容易,例如:byte[] key = {1, 8, 255, 12, 2, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 5};

您說B25829846AED8是一個128位密鑰。被解釋爲一個字符串,這是不正確的:13個字符= 26個字節= 208位,所以這是你的結果的解釋。將每個字符解釋爲十六進制數字,該鍵將是13 * 4 = 52bit。將每個字符解釋爲ANSI字符(大小8位)將是13 * 8 = 104位。

因此,要從字符串或數字中爲鍵生成字節數組,您必須定義如何解釋字符串或數字。如上所述,最簡單的方法是直接輸入16個字節。