2017-12-18 163 views
0

我正在創建一個小軟件來使用非對稱密鑰來加密和解密數據。如何在C#中創建非對稱密鑰,因爲指數大小有限?

的問題是,我在C#中,即使我使用的編碼:

BigInteger.Pow(BigIntenger myNumber, int myExponent); 

指數是一個「Int」和我的價值是很大的一個int。

只是爲了快速解釋並確保我沒有犯任何錯誤,您必須使用大數字,以便在沒有私鑰的情況下解密更加困難。

所以我

  • N = P * Q
  • P和Q都是素數。
  • M =(P-1)+(Q-1)
  • C是具有M
  • 一個素數
  • 然後用找到U:C×U + M×V = 1

公鑰(N,C)。

私鑰(U,N)。

例如,您要加密:「Bonjour!」以UTF8。

您將有:

B⇔66/o⇔111/n⇔110/j⇔106/o⇔111/u⇔117/r⇔114/(協商)⇔32/⇔33

然後提高每個編號,以C的功率和模N

例:valueOfB =(66^C)%N。

現在您的郵件已加密。

如果要解密,你必須乘以指數u各自的價值和模N

例:(valueOfB^U)%N

所以我能做到這一點只有當我使用小號碼,因爲我會有一個適合於「int」的小U值,但它不是安全的,我怎麼能用BigInteger這樣的大U來實現這一點,而不是int?

+0

你可能想看看這裏:https://crypto.stackexchange.com/questions/43272/why-is-writing-your-own-encryption-不鼓勵,另一個:https://security.stackexchange.com/questions/18197/why-shouldnt-we-roll-our-own –

+0

@PeterB:在某些時候,有人必須寫在代碼庫後面的代碼,這意味着其他人不需要再做一次。所以我不認爲答案只是說不要做這個事情 - 有很多理由想要做這種事情 - 爲了好玩,爲了編寫加密代碼的經驗,......我寫了我自己的JPG和MP3加密/解密代碼 - 我絕對不會在生產代碼中使用它,但這很有趣。 – PaulF

+0

在你寫的程序的描述中_「然後每個數字都必須乘以指數C和模N」,但是你顯示的代碼將數字提高到C的冪 - 哪一個是正確的?如果您正在相乘,那麼BigInteger允許兩個BigInteger相乘。 – PaulF

回答

1

BigInteger.Pow BigInteger將是一個大量複雜的數字。

二進制乘法具有(粗略地說)由m比特數乘以一個n比特數產生大致(n+m)比特答案的性質。

10 * 4096 = 0b1010 * 0b1_0000_0000_0000 (4 bits, 13 bits) 
40960 = 0b1010_0000_0000_0000 (16 bits) 

16 * 4096 = 0b1_0000 * 0b1_0000_0000_0000 (5 bits, 13 bits) 
65536 = 0b1_0000_0000_0000_0000 (17 bits) 

15 * 4095 = 0b1111 * 0b1111_1111_1111 (4 bits, 12 bits) 
61425 = 0b1110_1111_1111_0001 (16 bits) 

由於冪重複乘法和乘法反覆此外,我們可以看到,養了1024位號碼爲512位數的力量將在1024 * 512位的領域產生一個答案(524288比特,65536字節)。

但是,你會用一個模數運算來追蹤它,使它回落到1024位數的範圍內。這很浪費。

謝天謝地,有效的算法可以提高效率modular exponentiation。感謝你,.NET繼續爲你寫。

什麼你要找的是

valueOfB = BigInteger.ModPow(66, U, N); 
+0

有人給了我這個功能在上面的評論,但謝謝你的解釋:)!我可以將這個問題標記爲解決。 –

相關問題