使用Crypto ++进行模块化算术加法和减法

时间:2016-04-03 23:40:29

标签: c++ crypto++ modular-arithmetic

我对此很新,但我尝试使用Crypto ++ Library以模块化格式添加两个整数。

我的程序很简单,

AutoSeededRandomPool prng;
Integer r0, m;

m = Integer( prng, 64);
r0 = Integer( prng, 64);

cout << "m: " << std::hex << m << endl;
cout << "r0:" << std::hex << r0 << endl;

Integer n1(r0 + m);

但这根本行不通。它很好,但是当我试图运行它时崩溃了。

任何人都可以使用Crypto ++提供加/减的示例代码

1 个答案:

答案 0 :(得分:1)

  

使用Crypto ++的模块化算术(加法/减法)

我们已根据此问题关闭了一些缺少的文档空白,因此我不会解决示例代码。改进后的文档位于Integer Class ReferenceInteger on the Crypto++ wiki

但是,使用ModularArithmetic class可能会出现错误或(至少)意外结果。该类将自身描述为“模数同余类的环”。在数学上,一个环是一个具有闭包和两个明确定义的操作的组。

断开连接,其中两个操作是ModularArithmetic<Integer>中包含的操作。根据一些示例代码,它看起来像MultiplyExponentiate,这主要是预期的(尽管它可能是AddMultiply)。

我认为Ring的数学定义不会给ModularArithmetic许可产生意想不到的结果。但是,ModularArithmetic有点独特,可能会积累中间结果,然后必须使用MultiplyExponentiate进行缩减。 (它确实累积结果以加速操作)。

对我来说,一个悬而未决的问题是,我们做了什么......我正试图在此问题上征求一些反馈意见。

这是测试程序:

int main(int argc, char* argv[])
{
  Integer m("4294967295"), n("0x1000000000000000000000000000000"), j;
  j = 1999;

  ModularArithmetic ma(j);

  cout << "n+m mod j: " << ma.Add(n, m) << endl;
  cout << "  cross-check: " << (n+m) % j << endl;
  cout << "n-m mod j: " << ma.Subtract(n, m) << endl;
  cout << "  cross-check: " << (n-m) % j << endl;
  cout << "n*m mod j: " << ma.Multiply(n, m) << endl;
  cout << "  cross-check: " << (n*m) % j << endl;
  cout << "n/m mod j: " << ma.Divide(n, m) << endl;
  cout << "  cross-check: " << (n/m) % j << endl;
  cout << "n%m mod j: " << ma.Reduce(n, m) << endl;
  cout << "  cross-check: " << (n%m) % j << endl;
  cout << "n^m mod j: " << ma.Exponentiate(n, m) << endl;
  cout << "  cross-check: " << a_exp_b_mod_c(n,m,j) << endl;

  return 0;
}

结果如下:

$ ./test.exe 
n+m mod j: 1329227995784915872903807064575309872.
  cross-check: 1755.
n-m mod j: 1329227995784915872903807055985377281.
  cross-check: 50.
n*m mod j: 266.
  cross-check: 266.
n/m mod j: 599.
  cross-check: 1997.
n%m mod j: 1329227995784915872903807055985377281.
  cross-check: 1608.
n^m mod j: 1326.
  cross-check: 1326.

编辑1

  

断开连接,其中两个操作是ModularArithmetic<Integer> ...

中包含的操作

所以我有机会浏览源代码和add more missing documentation。特别感兴趣的是AbstractRing< T > Class Template ReferenceModularArithmetic继承自{{3}}。它证实了乘法和取幂是操作(并且它产生了帮助,如Square)。

我不清楚的是ModularArithmetic提供AddSubtract和朋友,但却达到了意想不到的结果的原因。很可能是它有效地累积了结果并等待MultiplyExponentiate减少,但我在源代码中看不到任何注释。

编辑2

ModularArithmetic似乎会为AddSubtract和朋友产生不正确的结果的原因是该类对于特定问题是快速的,并且它不会使用完全减少欧几里德扩展算法。相反,它最多执行 一次减法。这意味着要由模数n减少的累计值p必须在[0, 2p)范围内。