-1

我正在使用 MATLAB 实现三鱼分组密码。起初,我在 uint8 数字上实现了算法来验证我的代码。一切正常,解密成功。但是当我将数字替换为 uint64 时,纯文本没有正确检索。
我一遍又一遍地追踪查房结果寻找原因,但至今找不到。加密和解密的前四位是有区别的,即沿x轮加密为9824265115183455531,但解密为9824265115183455488。

我认为这种差异背后的原因在于函数 AddMod64 和 SubMod64 找到算术模 2 的 64 次幂。但到目前为止我真的无法修复它。

我知道

    double(2^64) = 18446744073709552000

uint64(2^64) = 18446744073709551615 % z = ( x + y ) % 2^64
function z = AddMod64(x , y)
    m = uint64(2^64);
    z = double(mod(mod(double(x),m)+mod(double(y),m),m));
end
% z = (x - y ) % 2^64
function z = SubMod64(x , y)
    m = uint64(2^64);
    z = double(mod(mod(double(x),m) - mod(double(y),m),m)); 
end
4

1 回答 1

2

double(2^64)已经是错误的结果,该double类型最多只能容纳2^52-1为整数而无需四舍五入。

此外,当您这样做时uint64(2^64),使用 计算幂double,给出错误的结果,然后您将其转换为uint64。而且因为一辆面包车的最大值uint64是 2^64-1,所以整个操作都是错误的。

改用maxint

m = maxint('uint64');

在 MATLAB 中进行模加是相当棘手的,因为 MATLAB 使用整数进行饱和算术。在进行计算之前,您需要测试溢出。

if x > m - y
   x = y - (m - x + 1);
else
   x = x + y
end
于 2019-07-28T13:45:45.180 回答