2013-12-22 52 views
0

我試圖做我自己的RSA加密。我知道在C#中有構建方法,但我想製作自己的程序,因爲我想了解它是如何完成的。當我從字節數組轉換到字節數組的時候,我覺得我搞不清楚了。如果有人能把我推向正確的方向,那將是非常棒的:)。你編碼如何使用自己的RSA加密來加密字節數組?

private void btnEncrypt_Click(object sender, EventArgs e) 
{ 
    EncryptieModulo = 55; 
    PublicKey = 27; 
    var PlainText = Encoding.UTF8.GetBytes(txtPlaintext.Text); 
    for (int i = 0; i < PlainText.Length; i++) 
    { 
     PlainText[i] = (byte)(BigInteger.Pow(PlainText[i], PublicKey) % EncryptieModulo); 
    } 

    textBox1.Text = Convert.ToBase64String(PlainText); 
} 

private void btnDecrypt_Click(object sender, EventArgs e) 
{ 
    EncryptieModulo = 55; 
    PrivateKey = 3; 
    var CrypText = Convert.FromBase64String(txtCCryptedText.Text); 
    for (int i = 0; i < CrypText.Length; i++) 
    { 
     CrypText[i] = (byte)(BigInteger.Pow(CrypText[i], PrivateKey) % EncryptieModulo); 
    } 

    textBox1.Text = Encoding.UTF8.GetString(CrypText); 
} 
+0

請使用示例輸入和輸出來解釋此代碼的作用,並解釋它應該做什麼以及您試圖調查這些差異的內容。 – CodeCaster

+0

當我加密字符串「Pablo」時,它返回「FDAgJQE =」。現在,當我嘗試解密它時,它會返回字符串「* + 5」。 – user2348955

+0

@CodeCaster:正如我從代碼中看到的,他試圖實現非常基本的RSA以瞭解它的工作原理。或多或少在這裏描述http://en.wikipedia.org/wiki/RSA_%28cryptosystem%29#A_working_example完整的實施基礎在這http://www.emc.com/emc-plus/rsa-labs/ pkcs/files/h11300-wp-pkcs-1v2-2-rsa-cryptography-standard.pdf並不是那麼簡單,但他只是試圖用最基本的形式來研究RSA的內部運作。 –

回答

1

值必須小於模,這是你的情況55.爲了你的榜樣工作,你需要替換Encoding.UTF8.GetBytes/Encoding.UTF8.GetString與翻譯拉丁字母文字到您的自定義功能0-54之間的字節和後面。

例如,你可以做這樣的:

private static byte[] GetBytes(string s) 
{ 
    byte[] result = new byte[s.Length]; 
    for (int i = 0; i < s.Length; i++) 
    { 
     if (s[i] >= 'a' && s[i] <= 'z') 
     { 
      result[i] = (byte)(s[i] - 'a'); 
      continue; 
     } 
     if (s[i] >= 'A' && s[i] <= 'Z') 
     { 
      result[i] = (byte)(s[i] - 'A' + 26); 
      continue; 
     } 
     throw new ArgumentOutOfRangeException(); 
    } 
    return result; 
} 

private static string GetString(byte[] b) 
{ 
    StringBuilder sb = new StringBuilder(b.Length); 
    for (int i = 0; i < b.Length; i++) 
    { 
     if (b[i] >= 0 && b[i] < 26) 
     { 
      sb.Append((char)('a' + b[i])); 
      continue; 
     } 
     if (b[i] >= 26 && b[i] < 52) 
     { 
      sb.Append((char)('A' + b[i] - 26)); 
      continue; 
     } 
     throw new ArgumentOutOfRangeException(); 
    } 
    return sb.ToString(); 
} 

現在代替你Encoding.UTF8.GetBytes/Encoding.UTF8.GetString與我們的新的,你應該是好去。不過,你剛剛做的不是真正的RSA加密。您只需使用非常短的密鑰分別對每個字節進行加密。這個實現的安全性是zilch。請參閱the spec瞭解所有錯綜複雜的「真實」實現。 (填充爲一個想到)。另外,如果你想更好地理解算法,我建議你查找一些真實事物的開源實現。

+0

謝謝,這真的很有幫助。除了很短的鑰匙外,還有其他什麼原因,這是不安全的? – user2348955

+0

是的。您最好在http://crypto.stackexchange.com/上提問,但一般來說,如果您使用任何給定的密鑰逐字節地加密,則每個字節只會得到256個不同的輸出,並且輸出之間會有一對一的映射和字節。也就是說,每個0x01將始終加密爲0x5fa3dd。我希望你能看到這有多糟糕。 –