在 VB.NET 中执行应该溢出的 UInt32 添加的最佳方法

Dot*_*ado 2 vb.net encryption

在尝试用 VB.NET 编写 ChaCha20 加密算法的 ARX 部分时,我在加法部分遇到了溢出异常的问题。

算法中有很多 UInt32 数字的加法,数字在加法过程中应该会溢出,但在代码的其他部分我想捕获这些异常。

处理此问题并完全避免溢出异常的一种方法是临时转换为 UInt64,然后按以下方式进行添加:

a = (a + b) mod 2^32

我不会得到任何溢出,但这不适用于 ARX 算法所需的循环位旋转,因为我现在将位推入 64 位 UInt 中的空 32 位。

这种来回转换使算法变慢,并且对于每个 512 位数据块,我们要进行 20 轮一组计算,因此这部分代码的性能非常重要。

在 VB.NET 中是否有更优雅的方法来处理这个问题?

有关该算法的更多信息: https: //en.wikipedia.org/wiki/Salsa20

感谢您分享您的见解!

Cai*_*ard 5

您可以关闭每个已编译程序集的溢出检查:

在此输入图像描述

因此,这意味着您可以拥有一个 DLL,您可以在其中执行所有溢出数学运算,并且该 DLL 项目已选中此复选框(溢出检查已关闭)。

..但是您的主项目需要在溢出 ON 的情况下进行数学计算,并且在其自己的编译设置中没有设置此选项

这里我的 OverflowOff 项目是一个启用了“删除检查”的 DLL。一个方法提供的 int maxvalue 溢出到 int minvalue,然后使用该 DLL 的表单项目因溢出而崩溃,因为它自己的编译设置被设置为执行溢出检查:

在此输入图像描述

  • 是的,这就是我的想法..您甚至可以制作一个基本数学函数的项目,例如`Public Shared Function Add(i1 as integer, i2 as integer) Return i1 + i2`,将其放入名为 Overflowable 的项目中,然后转关闭 OF 检查并使用而不是 `+`。如果你想使用 C#,你可以使用“unchecked”并将 C# 编译成 DLL,你可以从 VB 中引用。您还可以在同一个解决方案中使用 C# 项目和 VB,调试器会愉快地在它们之间来回切换。我只是以为您也想在 VB 中进行所有计算,而 AFIAA VB 只能关闭每个程序集的溢出检查 (2认同)