2012-04-19 92 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 

如果我关闭溢出检查,这两套代码完成没有错误。

检查公式中每个变量的值,以查看是否可能会因添加部分而发生溢出。加法运算结果的数据类型基于操作中涉及的变量/值的数据类型。对于派生数据类型,这些值可能会产生太大的结果。