【问题标题】:Best way to perform UInt32 additions in VB.NET that are supposed to overflow在 VB.NET 中执行应该溢出的 UInt32 添加的最佳方法
【发布时间】:2021-07-14 19:42:36
【问题描述】:

在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

感谢您分享您的见解!

【问题讨论】:

    标签: vb.net encryption


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢 Caius 很高兴知道这是 VB.NET 的最佳选择!最初希望有一个类似 C# 的选项,选中/取消选中,但在任何地方都找不到。
    • 所以,要明确一点:将 ARX 的所有 Uint32 计算放在它自己的 VB.Net 项目中应该允许无例外地溢出,并仅在该项目中启用 [] Remove Integer overflow checks 设置。是吗?
    • 是的,我就是这么想的。你甚至可以制作一个基本数学函数的项目,比如Public Shared Function Add(i1 as integer, i2 as integer) Return i1 + i2,把它放在一个名为Overflowable的项目中,关闭OF检查并使用而不是@ 987654327@。如果你想使用 C#,你可以使用 unchecked 并将 C# 编译成一个 DLL,你可以从 VB 中引用。您还可以在同一个解决方案中使用 C# 项目和 VB,调试器将愉快地在它们之间来回切换。我只是以为您也想在 VB 中进行所有计算,而 AFIAA VB 只能关闭每个程序集的溢出检查
    • 是的,我想保留加密/解密代码 VB.NET 代码,但很高兴知道我可以将 VB.NET 和 C# 项目结合在同一个解决方案中,我认为这是不可能的。
    • @DotNETFan 此外,如果您不必记住将 ^ 更改为 Xor,那么在 C# 中编写算法会更简单^.
    猜你喜欢
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多