7

たとえば暗号化の32ビットオペレーティングシステムの場合、システムは2 ^ 56モジュロ7をどのように実行しますか?

そして、それはどのようにメモリに保存されましたか?

4

8 に答える 8

16

任意精度演算について

32ビットオペレーティングシステムは、そのサイズを超えるカスタムタイプを持つことを制限しません。アプリケーションは2つの32ビットワードを取り、それを1つの64ビット数のように扱うことができます。ほとんどのプログラミング言語には、問題を単純化するための「ダブルワード」積分型さえあります。

概念をさらに拡張して、制限されたメモリの量によってのみ制限される任意精度の整数データ型を作成できます。基本的に、ワードの配列があり、この配列のワードのビットにNビットの数値を格納します。

32ビットオペレーティングシステムであるという事実自体は、実行できる数値計算を制限するものではありません。longたとえば、Javaは、実行場所に関係なく、64ビットの整数型です。任意精度の場合java.math.BigInteger、アンティを上げ、「無限のワードサイズ」の抽象化を提供します。そして、はい、この「機能」は32ビットオペレーティングシステムでも利用できます(これは、そもそも制限要因ではなかったためです)。

も参照してください


整数環の数学について

モジュラ逆数またはべき乗剰余を見つけることは、暗号化の分野で一般的な数学的/アルゴリズム的タスクです。

ここで使用できるIDの1つは、次のとおりです。

A * B (mod M) == (A (mod M)) * (B (mod M)) (mod M)

x = 2 56(mod 7)を見つけるために、最初に256を計算して保存する必要はありませんy = 2 55(mod 7)-0..6-の間の数値がある場合、x = y * 2(mod 7)を見つけることができます

しかし、 y = 2 55(mod 7)をどのように見つけますか?さて、1つの素朴な方法は、プロセスを線形に適用し、最初にz = 2 54(mod 7)などを見つけようとすることです。これは線形のべき乗ですが、たとえば2乗によるべき乗を実行することでより良い結果が得られます。

つまり、2 8と言った場合、それを2乗して、すぐに216を得ることができます次に、それを2乗して、すぐに232を取得できます。


概要

暗号化に適用できる高度な数学的アルゴリズムは数多くあり、32ビットまたは64ビットのオペレーティングシステムで実行されているプログラムに実装されているかどうかは直接関係ありません。十分なメモリが利用可能である限り、コンピュータは任意精度の演算を実行する能力を超えています。

任意精度の演算が有用な抽象化であるという理由だけで、多くの高性能ライブラリが利用可能であり、ゼロから構築する代わりに、既存のフレームワークの上にアプリケーションを構築できます。

一部の高級言語には、任意精度の算術演算が組み込まれています。たとえば、Pythonは任意精度intlong言語レベルで提供します。

于 2010-08-22T14:04:56.320 に答える
4
2**56 == 2**(28+28) == 2**28 * 2**28 == (2**28)**2
2**28 == 2**(14+14) == 2**14 * 2**14 == (2**14)**2
2**14 == 2**(7+7) == 2**7 * 2**7 == (2**7)**2
2**7 == 2**(3+3 +1) == 2**3 * 2**3 * 2 == (2**3)**2 * 2
2**3 == 2**(1+1 +1) == 2**1 * 2**1 * 2 == (2**1)**2 * 2

2**56 == (2**28)**2 == ((2**14)**2)**2 == (((2**7)**2)**2)**2
== (((2*(2**3)**2)**2)**2)**2 == (((2*(2*(2**1)**2)**2)**2)**2)**2

2**56 %7
== (((2*(2*(2**1)**2)**2)**2)**2)**2 %7
== (((2*(2*(2**1 %7)**2 %7)**2 %7)**2 %7)**2 %7)**2 %7
== (((2*(2*(2)**2 %7)**2 %7)**2 %7)**2 %7)**2 %7
== (((2*(2*4 %7)**2 %7)**2 %7)**2 %7)**2 %7
== (((2*(1)**2 %7)**2 %7)**2 %7)**2 %7
== (((2 %7)**2 %7)**2 %7)**2 %7
== ((2**2 %7)**2 %7)**2 %7
== ((4)**2 %7)**2 %7
== (16 %7)**2 %7
== (2)**2 %7
== 4 %7
== 4

so (2**56) % 7 == 4

大きな数を扱ったことは一度もないことに気付くでしょう(実際、最大のものは56でした)。

さらに:

2**224 %7 == (2**56)**4 %7 == (4*4*4*4) %7 ==
((16%7) * (16%7)) %7 == (2*2) %7 == 4 %7 == 4

したがって2**896 %7 = 4、なども(以来896 = 4 * 224、ここで224 = 4 * 56)。

于 2011-02-08T00:46:43.037 に答える
2

この種の操作には、べき乗剰余アルゴリズムが使用されます。このウィキペディアの記事は、それがどのように行われるかを説明しています:http: //en.wikipedia.org/wiki/Modular_exponentiation

于 2010-08-22T14:04:33.110 に答える
2

一般に、数値が非常に大きくなることがわかっている場合は、GMP(Gnu Multi-Precision)などのライブラリを使用して計算を処理します。手に2^32本の指がある場合、紙で行うことを実行します。

于 2010-08-22T14:29:46.727 に答える
0

32intとモジュラ逆数の良い説明をする他の答えに追加してください

32ビットCPUとは何かを説明します

32 bitほとんどの人が知っているCPUは、アドレスバスのサイズに関連しているため、たとえばx86(一般的なデスクトップCPU [AMD、Intel])プロセッサでは、これにより数2^32バイトのアドレス空間が可能になります。4GB通常、アドレス可能なハードウェアとRAMの間で分割されるため、実際にプロセッサを実装する理由は、RAMの制限64 bitに近づきすぎたためです。4GB

ちなみに、これは以前はCPUが16ビットのときに発生していました

于 2010-08-22T15:05:12.870 に答える
0

どのシステム?どのアーキテクチャですか?

一般的に、32ビットアーキテクチャでは、オーバーフローの結果が得られます。一部の言語には、これらの計算を処理できる組み込みの任意の大きさの数字タイプがあります。この例はBigDecimalJavaで、組み込みlong intはPythonです。

于 2010-08-22T14:04:11.003 に答える
0

(a * b)mod c =((a mod c)*(b mod c))modcを使用します。それはあなたが基本的にできることを意味します

  1. x=1から開始
  2. x =(x * 2)%756回実行します
于 2010-08-22T14:10:27.760 に答える
0

あなたの用語は少し混乱していると思います。

32ビットオペレーティングシステムまたは32ビットアーキテクチャは、マシンアドレスが32ビットに制限されているものです。32ビットアーキテクチャが64ビット整数および/または64ビット浮動小数点数で動作する算術命令を持つことはまったく珍しいことではありません。

longしたがって、32ビットアーキテクチャを備えた(および32ビットオペレーティングシステムを実行している)マシンは、64ビット演算を使用し、結果を64ビットまたはlong long2つの連続する32ビットワードを使用してメモリに格納する可能性が非常に高くなります。

于 2010-08-22T14:55:04.500 に答える