【问题标题】:Modular Arithmetic addition and subtraction using Crypto++使用 Crypto++ 的模块化算术加法和减法
【发布时间】:2016-07-23 09:40:57
【问题描述】:

我对此很陌生,但我正在尝试使用 Crypto++ 库以模块化格式添加两个整数。

我的程序很简单,

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++ 进行加法/减法的示例代码

【问题讨论】:

  • “谁能给出使用 Crypto++ 进行加法/减法的示例代码...” - 你看过 Crypto++ wiki 上的 Integer 吗? wiki 有很多示例和示例代码。
  • 我只是看了一下,它只给出了整数初始化的例子,而不是两个整数的加法/减法
  • 过去 24 小时我一直在研究这个问题,正如我提到的,像 r0+m 这样的添加对我不起作用。所以这就是为什么我在 modarith.h 中寻找一个在 ModularArithmetic 中使用 Add 函数的示例
  • 这就是我所做的,CryptoPP::Integer r0, m, sum; m= CryptoPP::Integer(prng, 64); r0= CryptoPP::Integer(prng, 64);总和 = r0 +m;它遵守了,但在运行时崩溃了
  • 等等,你引用的页面正在更新中......我现在正在尝试其他的东西

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


【解决方案1】:

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

我们已经根据这个问题填补了一些缺失的文档空白,因此我不会讨论示例代码。改进后的文档可在 Integer Class ReferenceInteger on the Crypto++ wiki 获得。

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

断开是,这两个操作是ModularArithmetic&lt;Integer&gt; 中包含的操作。根据一些示例代码,它看起来像它的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&lt;Integer&gt;中包含哪两个操作...

所以我有机会浏览源代码和add more missing documentation。特别感兴趣的是AbstractRing&lt; T &gt; Class Template ReferenceModularArithmetic 继承自它。它确认了乘法和求幂是运算(它会产生辅助函数,例如 Square)。

我不清楚的是,为什么ModularArithmetic 提供AddSubtract 和朋友却得到了意想不到的结果。很可能是它有效地累积结果并等待用MultiplyExponentiate 减少,但我在源代码中没有看到任何 cmets。


编辑 2

ModularArithmetic 似乎对AddSubtract 和朋友产生错误结果的原因是该类旨在快速解决特定问题,并且它没有使用欧几里得扩展算法执行完全归约。相反,它最多执行一次减法。这意味着要减去模数p 的累加值n 必须在[0, 2p) 范围内。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    相关资源
    最近更新 更多