在尝试用 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
感谢您分享您的见解!
您可以关闭每个已编译程序集的溢出检查:
因此,这意味着您可以拥有一个 DLL,您可以在其中执行所有溢出数学运算,并且该 DLL 项目已选中此复选框(溢出检查已关闭)。
..但是您的主项目需要在溢出 ON 的情况下进行数学计算,并且在其自己的编译设置中没有设置此选项
这里我的 OverflowOff 项目是一个启用了“删除检查”的 DLL。一个方法提供的 int maxvalue 溢出到 int minvalue,然后使用该 DLL 的表单项目因溢出而崩溃,因为它自己的编译设置被设置为执行溢出检查: