2

学習目的で RSA アルゴリズムを使用しようとしています。今、私は次の問題を抱えています。次のポイントで立ち往生しました。

次の関数を解決する必要があります。

c = value^e % n

c = 暗号化された結果値 = 暗号化される番号 d = 私の公開鍵 n = RSA モジュール

すべての変数のデータ型として double のみを使用します。次の行で解決した関数:

double c = Math.Pow(value, e) % n

ここでの問題は、math.pow 関数が間違った値を生成するように見えることです。少し不正確なようです。Windows 電卓でこれを試すと、正しい結果が得られます。

私の質問: RSA で動作する正しい結果を得るためにこれを解決する方法を知っている人はいますか? 他のすべての部分の計算は間違いなく正しいです。math.pow またはモジュラスのみが可能です。

4

4 に答える 4

3

任意精度の整数を使用して実際に行う必要がある何かに浮動小数点関数を使用しています。

于 2010-11-26T09:10:31.713 に答える
1

System.Numerics.dll(.NET 4.0 で)への参照を追加するSystem.Numerics.BigIntegerと、オーバーフロー操作の実行を恐れることなく整数操作を許可する新しい構造を使用できます。BigIntegerその後、どちらが正確かという点で簡単に電力を実装できます。

于 2010-11-26T09:35:15.247 に答える
0

任意精度の数値の累乗を計算するメソッドを作成することはそれほど難しくありません。Decimal データ型を使用するだけで問題ありません。

于 2010-11-26T09:16:41.247 に答える
0

すべての計算を整数で実行します。

累乗は、ループ e 回で値を乗算することになります。オーバーフローを避けるために、ループ内で % 操作を実行します。

while ループを代入して結果を n 未満に減らすことで、% 演算子を回避できる場合があります。(% 演算子は一般的に非常に低速です。速度が問題にならない場合は、そのまま使用してください。)

c = 1;
for (int i = e; i--; i > 0)
{
    c *= value;
    while ( c > n) { c -= n; }
}
于 2010-11-26T09:19:02.450 に答える