私は RSA 暗号化システムの復号化関数を書こうとしていますが、すべてが非常に小さい数値に対しては正常に機能しているように見えましたが、出力が正しくない場合があります (原因は浮動小数点エラーまたは何らかの種類のエラーである可能性があると思います)。スタックオーバーフロー)。
問題を引き起こしているプロセスは (11^23) mod 187 に単純化できますが、誰かが見たい場合に備えて完全なコードを含めます。サイモン・シン博士による「コードブック」の付録Jで使用されている例であるため、答えは88になるはずです(Wolfram Alphaも使用して確認しました)。ただし、149 という結果が得られます。ただし、数値が小さいほど、Wolfram Alpha と一致します。
私の考えでは、次の知識を使用して累乗剰余を単純化する必要があります。
a^b = a^c * a^d [c + d = b]
ただし、これがこの問題であるかどうかはまだ 100% 確信が持てません。これは初めてのスタック オーバーフローですか? (それが何を意味するのかはまだ100%わかりません)。誰かが私に挑戦する前に、いいえ、これは宿題ではありません。この質問が些細なことのように思えたら申し訳ありません。gmp.h を使用するのは難しすぎると誰もが思うなら、私は gmp.h を使用することにオープンです。私のコードは以下のとおりです(前半は秘密鍵を計算するためのもので、私が抱えている問題とは無関係だと思いますが、私が間違っている場合に備えてそれを含めました)、皆さんが助けてくれることを本当に願っています、ありがとうあなたは非常に前もって。
#include <iostream>
#include <math.h>
using namespace std;
unsigned int modinv(unsigned int u, unsigned int v)
{
unsigned int inv, u1, u3, v1, v3, t1, t3, q;
int iter;
u1 = 1;
u3 = u;
v1 = 0;
v3 = v;
iter = 1;
while (v3 != 0)
{
q = u3 / v3;
t3 = u3 % v3;
t1 = u1 + q * v1;
u1 = v1; v1 = t1; u3 = v3; v3 = t3;
iter = -iter;
}
if (u3 != 1)
return 0;
if (iter < 0)
inv = v - u1;
else
inv = u1;
return inv;
}
int main()
{ long unsigned int p = 17;
long unsigned int q = 11;
long unsigned int phi = (p-1)*(q-1);
long unsigned int e = 7;
long unsigned int c = 11;
long unsigned int n = p*q;
long unsigned int d = modinv (e,phi);
{
cout << fmod (pow (c, d), n);
}
return 0;
}