.NET中的长/大数和模数

Eri*_*ber 1 .net c# modulo

我正在编写一个快速的自定义编码方法,我用一个数字标记一个密钥来验证它是一个有效的密钥.

基本上我正在从编码中获取任何数字并将其乘以密钥.

然后,我将这些数字乘以部署给购买密钥的用户/客户.我想简单地使用(Code%Key == 0)来验证密钥是否有效,但是对于大值,mod函数似乎没有按预期运行.

数字= 468721387; 键= 12345678; 代码=数字*密钥;

使用上面的数字:Code%Key == 11418772

对于较小的数字,它将正确返回0.是否有一种可靠的方法来检查.NET中的长时间的可分性?

谢谢!

编辑:好的,告诉我,如果我很特别,错过了什么......

        long a = DateTime.Now.Ticks;
        long b = 12345;
        long c = a * b;
        long d = c % b;
        d == 10001 (Bad)
Run Code Online (Sandbox Code Playgroud)

        long a = DateTime.Now.Ticks;
        long b = 12;
        long c = a * b;
        long d = c % b;
        d == 0 (Good)
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Ðаn*_*Ðаn 6

正如其他人所说,你的问题是整数溢出.通过选中"高级构建设置"对话框中的"检查算术溢出/下溢",可以使这一点更加明显.执行此操作时,执行*DateTime.Now.Ticks*12345*时将出现OverflowException.

一个简单的解决方案就是在代码中将"long"更改为"decimal"(或"double").

在.NET 4.0中,有一个新的BigInteger类.

最后,你说你"......写一个快速的自定义编码方法......",所以一个简单的自制程序解决方案可能满足你的需求.但是,如果这是生产代码,您可能会考虑涉及加密的更强大的解决方案或来自专门从事软件许可的第三方的某些解决方案.

  • @eskerber:这将是不容易出错,更安全,并且可能是一样快速和容易使用合适的散列(例如,SHA1)比它是用你的自制"哈希"算法. (3认同)

Eri*_*ert 5

说整数溢出可能是罪魁祸首的答案几乎肯定是正确的; 您可以通过在乘法周围放置一个"已检查"块并查看它是否抛出异常来验证.

但是这里有一个更大的问题,每个人似乎都在忽视.

最好的办法是向后退一步,重新考虑整个计划的智慧.您似乎正在尝试设计基于加密的安全系统,但您显然不是加密算法的专家.这是一个巨大的红色警告标志.如果您需要基于加密的安全系统,请不要试图自己动手.有许多现成的加密系统由专家构建,经过严格测试并且随时可用.使用其中之一.

如果你真的很想弯下滚动你自己的加密,那么以64位的方式获得数学运算是你最不担心的事情.64位整数对于这个加密应用来说太小了.你需要使用更大的整数大小; 否则,找到与代码匹配的密钥是微不足道的.

同样,我不能强烈强调构建正确的基于加密的安全代码是多么困难,这些代码实际上保护真实用户免受真正的威胁.