2015-10-23 9 views
5

私はRSA暗号化アルゴリズムをC言語で書いています。どこにでも置くことを計画していないので、主に暗号化の理解を広げることができます。Cで膨大な数を処理する方法

RSAが生成する膨大な数値はどうやって処理するのですか? 103のような比較的小さな秘密鍵で復号化を行って、私はまだこのようなものを扱うの問題が発生した場合でも:

67^103のmod 143 =(×10^188 1.21816096336830017301951805581)のmod 143

そのサイズの番号を保存する最も良い方法は何ですか?標準ライブラリを使ってそれを行う方法はありますか? 。

+2

あなたはすべての大きな数を自分で算術実装することもできますが、それだけでGMPのような既存のマルチ精度のライブラリを使用する方が簡単です。 @ArtjomB。 –

+0

私はおそらくベース2に番号を格納するために配列を使用して実装することができると思っていた^ 64。それが実用的かどうかは分かりませんでした。 – mstagg

+0

それはうまくいくでしょう。しかし、オーバーフローで慎重に。乗算を実装し、次に除算(モジュロ用)を実装する必要があります。しかし、真剣に、ちょうどGMPを使用してください。 –

答えて

4

誤ったアプローチ。 67^103 mod 143は、最初に67^103を計算する必要はありません。

ループでmoduloを指数の1ビットずつ計算します。

uint32_t powmod(uint32_t base, uint32_t expo, uint32_t mod) { 

    // % mod need only for the cases expo==0, mod<=1 
    uint32_t y = 1u % mod; 

    while (expo) { 
    if (expo & 1u) { 
     y = ((uint64_t) base * y) % mod; 
    } 
    expo >>= 1u; 
    base = ((uint64_t) base * base) % mod; 
    } 

    return y; 
} 

int main(void) { 
    printf("%lu",(unsigned long) powmod(67, 103, 143)); 
} 

出力

89 
+0

「RSAが生成する膨大な数を処理する」という_trick_は、通常の方法で数式を実行しないことです。上のようなショートカットを使用します。 – chux

+1

ああああ、はい、パワーの各ビットを扱うことによって、前にこのパワーエクササイズを済ませても:十分に注意深くQを読まないでください。 –

+0

@ウェザーベインはい - [RSA](https://en.wikipedia。org/wiki/RSA_(cryptosystem))は、鍵を持っていれば、数学的なブラックボックスの問題を解くために計算トリックを使うことです。そうでなければブルートフォースで計算するのは実行不可能です。 – chux

関連する問題