私は見つけるために、ソースコードを見て、それが妖精高性能アルゴリズムだと思いました...

昨日の記事では、RSAアルゴリズムについて話しました。RSAアルゴリズムの基本的な原理は、2つのコアの素数pおよびqがあり、それらは、数nを乗算することにより得られます。pとqはpとqので、ちょうど十分な大きさ、n個の分解から逆転するのが非常に困難であるので、RSAアルゴリズムは、現在のコンピュータのスキルに割れることはできません。

さて、あなたが一時停止する前に、Baiduのか、グーグルをオンにし、チュートリアルRSAアルゴリズムを検索します。カジュアルルック10。
二つの大きな素数pとqを見つけるには十分:あなたは例外なくこれらのチュートリアルは、言っていることがわかります。しかし、彼らはどのように見つけるためにあなたを教えてくれません。

数学の現在のシステムでは、素数ではなくアウト生成よりも、見つけることです。素数を生成することができ、一般的な用語の完璧な式がありません。私たちは、素数でない数の簡単なチェックを行うことができますが、我々はまだ直接の素数を生成することはできません。
キーを生成するときの質問は、RSAアルゴリズムであるので、最終的に必要な数の2品質が来る方法ですか?

私たちは、2048ビットのRSAキー、2つの素数pとqを生成するアルゴリズムを使用する場合、我々は見つける必要がある、と彼らはそれぞれ1024bitです。1024bitフィギュアどのくらい?その最小値、最大値。あなたが億個の数字をカウントすることができ、毎秒最大数をカウントする最小の数字が開始から数えた場合は、カウントする必要があります

年の5700447535712569468953910422339626882350256782541560669502475937269554661513856010042759935388366819543382606540​​82297557264046704764131857219835840434659197037569423594829671728507799344387665269701556798848952843855120124119935570376436804099528276139492994306780499238797710357939232321数が完了します。

デジタルの内部のような大規模な範囲、あなたは2つの素数を見つけます。あなたはこのTMは見つける方法を、言いますか?

だから、Pythonの神々はすぐに2つの素数を見つけるためにアルゴリズムを使用するものである。このRSAライブラリー、?だから私は、そのソースコードを読みに行ってきました。結果は私に冷たい汗を怖がって。

私が最初にRSA / key.pyファイルでこの機能を発見したので、rsa.newkeys()関数を使用してキーを生成し、:
ここに画像を挿入説明
758から762 OKを見て、ここではいくつかのパラメータによって決定されたコアCPUをプールサイズ、私の4つのコアCPUた場合、それはまた、素数を見つけるために、4つのプロセスを開くことができます。それは767を実行するためのコードの最初の行だから1のデフォルト値を使用していますので、昨日の記事の内部には、我々はgen_keys機能により、pとqを生成するために、プールサイズのパラメータを指定しなかったので、しかし、我々は、このコードをスキップすることができます。

私たちは、gen_keys機能を見て:
ここに画像を挿入説明
それは、機能find_p_q pとqで生成され、ライン714で見て、ここですることができ、我々は2048ビットキー・ワードであれば、p、qは1024bitです。

私たちは、find_p_q機能を見て:
ここに画像を挿入説明
この機能は、非常に長いですが、再度お試しするための要件を満たしていない場合は、主に生成されたpとqの検証では、要件を満たしている(同じではないが、その差がなるように十分な大きさです)。そうコードの実際のコアは、第613行及び615行です。Genprime_func関数は、渡されたパラメータによってここに呼び出されます。そして、これは我々がライン764 newkeys機能に乗るrsa.prime.getprime genprime_func機能です。

今、私たちは、ソースコードのgetprime機能を読んで、/rsa/prime.pyファイルを入力している:
ここに画像を挿入説明
このコードは実際には非常に簡単です。ライン162内の最初のオルガスムそして3以上の素数を生成するビット数を決定します。

while True:
        integer = rsa.randnum.read_random_odd_int(nbits)

        # Test for primeness
        if is_prime(integer):
            return integer

开一个死循环,调用read_random_odd_int不停获取nbit的奇数,然后,使用is_prime判断它是不是质数,如果是,返回这个数。如果不是质数,继续随机生成一个 nbit 的奇数,再判断它是不是质数。
ここに画像を挿入説明
ここに画像を挿入説明
ここに画像を挿入説明
这 TM 在逗我?在死循环里面随机生成奇数,然后判断是不是质数,不是就重试直到随机到一个质数为止?

在2{1024}到2{1025}-1这么大的范围里面随机选奇数?这要选多少年才碰得上两个质数啊?

为了解决这个疑惑,我们来看一下素数定理。

对于正实数x,定义π(x)为素数计数函数,亦即不大于x的素数个数。数学家找到了一些函数来估计π(x)的增长:ここに画像を挿入説明
在x足够大时,可以使用这个公司估算出不大于x的质数的个数。

那么我们来看看,在2{1024}到2{1025}-1的范围中,质数的密度是多少:

ここに画像を挿入説明
质数的密度竟然高达0.14%!那么随机选一个数字,不是质数的概率是99.86%。我们来计算一下,如果随机选10000个数字,即使在不考虑奇偶性的情况下:

ここに画像を挿入説明
也就是说,在随机10000个数字里面,不出现质数的概率是一千万分之一。出现质数的概率超过99.9999%

而用 Python 循环10000次,并不需要多长时间。所以,rsa 库里面的这个算法,竟然没什么问题!!
ここに画像を挿入説明
最后,大家有兴趣可以看看prime.py中的is_prime函数,用于快速判断一个数是不是质数。还有randnum.py中的read_random_odd_int用于随机生成一个计数,代码都很简单,相信你能学到不少东西。

以上内容都是我自己的一些感想,分享出来欢迎大家指正,顺便求一波关注
ここに画像を挿入説明

公開された19元の記事 ウォン称賛7 ビュー6437

おすすめ

転載: blog.csdn.net/ZYQZXF/article/details/104542708