-1

所以我正在制作一个文件加密器,以便我可以加密我正在制作的 VB.NET 应用程序,这样人们就无法反编译它。我在 C# 中制作了这个并将其转移到 VB.NET,在 C# 中一切正常,但是一旦我在 VB.NET 中重新编写了代码,我在我的 RC4 加密方法中得到了这个错误:

'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 中工作?

4

2 回答 2

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

如果我关闭溢出检查,则两组代码都将完成而不会出错。

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

于 2012-04-19T03:00:49.623 回答
1

在 .Net 4.0 中有一种称为 BigInteger 的新类型:http: //msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx

虽然我认为你真正想要的解决方案是混淆你的代码,所以即使有人反编译他们也无法阅读它:Visual Studio > Tools Menu > Dotfuscator

如果您想完全保护您的代码,您将不得不为Remotesoft 的 Salamander 之类的东西付费

于 2012-04-19T02:44:44.283 回答