2012-04-19 95 views
-1

因此,我正在製作一個文件加密器,以便我可以加密我製作的VB.NET應用程序,以便人們無法反編譯它。我曾在C#使這個和我是transfering到VB.NET,一切都在C#中工作得很好,但一旦我在VB.NET重新編寫的代碼我進去我的RC4加密方法的這個錯誤:VB.NET處理大整數

'Arithmetic operation resulted in an overflow.' 

錯誤是發生在這裏:

Dim t As Int64 = (s(i) + s(j)) Mod 256 

這上面相同的代碼在C#:

int t = (s[i] + s[j]) % 256; 

反正是有作出這樣計算它示數?爲什麼它在C#而不是VB.NET中工作?

+0

當你說「.NET」時,你的意思是「VB.NET」嗎? – Jason 2012-04-19 02:22:16

+0

@Jason是的,對不起。 – 2012-04-19 02:23:38

+0

也許你的C#版本有同樣的問題,你只是沒有'checked'編譯或有'unchecked'代碼塊。你可以發佈C#嗎? – vcsjones 2012-04-19 02:29:01

回答

1

在.NET 4.0中有一個新的類型,稱爲BigInteger的:http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx

雖然我覺得你真的想解決的辦法是這樣即使混淆你的代碼,如果有人反編譯,他們將無法讀取它:Visual Studio中>工具菜單> Dotfuscator的

如果您想徹底保護您的代碼,你將不得不付出的東西像Remotesoft's Salamander

+1

我試圖使用BigInteger,但沒有奏效。 – 2012-04-19 02:47:04

+0

它是否因相同的錯誤而失敗?另一件事是你如何加密(數據)您的EXE - 不會阻止應用程序運行?我的意思是如果我在記事本中打開MSPaint並隨機/加密然後保存exe文件 - 它不會運行。 – 2012-04-19 02:50:58

+0

錯誤是'BigInteger類型的值不能轉換爲整數' – 2012-04-19 02:54:46

3

檢查在VB.NET項目中的高級編譯選項(項目屬性 - >編譯 - >高級編譯選項...)。與您的C#項目進行比較。 VB版本可能正在檢查整數溢出,而C#版本不是。

當我運行在VB測試,這段代碼生成異常:

Dim x As Int16 = Int16.MaxValue 
Dim y As Int16 = Int16.MaxValue 

Dim t As Int64 = (x + y) Mod 256 

但是這個代碼不:

Dim t As Int64 = (32767 + 32767) Mod 256 

如果我關閉溢出檢查,這兩套代碼完成沒有錯誤。

檢查公式中每個變量的值,以查看是否可能會因添加部分而發生溢出。加法運算結果的數據類型基於操作中涉及的變量/值的數據類型。對於派生數據類型,這些值可能會產生太大的結果。