• 締切済み

暗号には素数

情報セキュリティ対策として、 暗号には大きな素数が使われていると聞きました。 大きな数ではダメなのでしょうか? 素数にこだわる理由を、簡単に教えていただければと思います。 図々しい質問ですが、 簡単な例や素人に教えるつもりで(可能であれば) お願いします。 以下、引用--------- 二つの素数を掛けて上の数を求めるのは、 根気さえあれば、今、あなたが机上で計算することもできるというのに、 逆に、上の数を下のニつの素数に分解するのは 1600 台のコンピュータを並列処理してやっと求められたというのですから…。 -------- 暗号(復号化)という手順が分からないせいで、色々疑問があるのですが。 素数をかけあわせた数を暗号に使う?かけあわせた数は素数ではなくなると思いますが。 その数を素数に分解するのに大変だから意味があるのでしょうか?分解した2つの数を何に使うのでしょうか? 分解するのは、いつも2つの素数?

みんなの回答

回答No.3

No1さんの回答がシンプルで分かりやすいのではないでしょうか。 ちなみに素数以外でも計算は成り立ちますが、 素因数分解すると、元の数を絞り込みできますので 解読しやすい暗号として無意味なものになります

回答No.2

> 大きな数ではダメなのでしょうか? 大きいか否かが問題なのではなく、ある数学的な性質を満たすか否かが問題です。自然数の計算だけで暗号を作る場合、素数を使わないとその数学的な性質を満たせないので素数を使っていると思います。 素数を使っていない場合、同じアルゴリズムで計算しても特定のデータを暗号化したら、復号できなくなるでしょう。 逆に言えば、その数学的性質を満たせば自然数の四則演算をベースにした暗号を作る必要はありません。近年では、自然数の演算の代わりに楕円曲線上の点の移動を演算だと見立てた楕円曲線暗号というものが登場し、これは当然素数を使っていません。 なお、"大きな"素数を必要とする理由は、あなたも書いている通りです。小さかったら、簡単に調べられてしまいますので、暗号としての強度を保つことができません。 > 素数をかけあわせた数を暗号に使う?かけあわせた数は素数ではなくなると思いますが。 素数を掛けあわせた数を暗号に使うというのはRSA暗号のことを指していると思いますが、なぜそれをやるかといえば、そうやって暗号化をする仕組みになっているからです。 具体的にどうやって暗号化、復号するか興味があればこれを御覧ください。 http://ja.wikipedia.org/wiki/RSA%E6%9A%97%E5%8F%B7 単に掛け算をして割り算のあまりをとっているだけなので、計算自体は小学校3年までの算数の知識があればできます。 実際に計算して、体験できるサイトも有るようです。 http://herb.h.kobe-u.ac.jp/RSA.html なぜその仕組みになっているかは、そうすることで数学的な性質を満たし、一意に復号できるからとしか言えないでしょうね。これ以上の突っ込んだ理解をするには整数論を勉強する必要があると思います。 > その数を素数に分解するのに大変だから意味があるのでしょうか?分解した2つの数を何に使うのでしょうか? この暗号の強度は素数の積から素数を求めるのが難しいことに依存しています。RSA暗号の公開鍵は素数の積を含みますから、積から簡単に元の数を求められると、簡単に秘密鍵を計算されてしまいます。 pとqをそれぞれ素数とした時、pqをpとqに分解できれば、(p-1)(q-1)を簡単に得られますから、公開鍵に含まれるeの逆数dを簡単に得られ、復号の鍵が得られてしまいます。 > 分解するのは、いつも2つの素数? 分解するというのが何をしたいのかわかりませんが、RSA暗号の公開鍵は2つの素数の積とeからなりますね。 RSA暗号の仕組みがそうなっていますから、RSA暗号を使うとしたらそうなります。

  • Kon1701
  • ベストアンサー率24% (1445/5856)
回答No.1

暗号にはいろんな方式があります。そのひとつがRSAで、ご質問のとおり非常に大きな素数を使っています。 この暗号は、まさに”その数を素数に分解するのに大変だから意味がある”となります。素数2つからその積を求めるのは簡単ですが、積から元の素数2つを求める素因数分解が非常に時間がかかることを利用しています。 暗号化や復号のアルゴリズムですが、私には簡単に説明することは無理ですので、RSAで検索してみてください。 なお、最近は間違って使われることも多くなりましたが、本来は暗号化と復号です。復号化とは言いません。

関連するQ&A

  • RSA暗号

    どのトピックかがいまいちわからないのでこのトピックに質問を載せさせて頂きます。 いま、大学の課題でRSA暗号をパソコンで実装する という課題に取り組んでいます。 2桁以上の素数を選んで、その素数から暗号化鍵と復号化鍵を選んでアスキーコードを暗号化するという初歩的なものなので、実用性は全くありませんが… プログラムはできたのですが 暗号化鍵と復号化鍵を生成して 暗号化を行って複合化を行うと 元の平文に戻らない鍵のペアがあるらしいのです。 そういうときってあるのでしょうか?

  • 公開鍵暗号方式の復号に関して質問します。

    暗号方式は、発信者Aさんが正当な受信者Bさんに暗号化した電文を送付し、途中で不正に傍受したCさんには電文の復号ができず、正当な受信者Bさんには復号ができるという考えかたです。 正当なる受信者Bさんには復号が可能で、不正なる傍受者Cさんには復号が不可能であるためには、BさんとCさんの間に情報格差を維持しないと駄目だと思うのですが、公開鍵方式の場合に正当なる受信者Bさんと不正な傍受者Cさんの間にどのような情報格差が存在するのでしょうか。 === RSA暗号の例題を考えます === A:暗号の発信者 B:正当なる暗号の受信者 C:不正なる暗号傍受者 Aさんは 素数P=3 素数Q=11 を選んで、 33を法とする世界(Mod33)を利用します。 Aさんは原文を3乗し、Mod33を取った暗号文をBさんに送付しますが、ここで、公開鍵情報として、「33を法とする」および「3乗した」という二つの情報を開示して暗号を送付します。 暗号を不正に傍受したCさんは、33の素因数分解ができないために、P=3、Q=11という二つの素数を特定できず、3xD={nx(p-1}X(Q-1)+1}において、N=1の場合でもP,Qが分からないので、復号することがきません。 ところが正当なる受信者Bさんは、3xD=1x(3-1)x(11-1)+1=21より、D=7を求め、受診した暗号を7乗することで受信電文の復号が可能となります。  ==== 以上例題おわり ==== 不正なる傍受者Cさんは素因数分解が困難であることから二つの素数P、Qの特定ができずに復号ができないことは良く理解できます。 しかし、正当なる受信者Bさんは、なぜP,Qを特定し、D=7を求めることが出来るのでしょうか。 質問1:なぜBさんだけが復号可能なのでしょうか? 質問2:Bさんは素因数分解をせずとも、P=3、Q=11という二つの素数を知ることができるのでしょうか? 質問3:素数P、Qの値を特定できなくてもD=7を知ることができるのでしょうか? 公開鍵暗号方式の根本原理が分かっていないと思われるので、公開鍵暗号方式、あるいはRSA暗号方式の考え方をご存じの方ご教示いただけると助かります。

  • 素因数分解について

     ものすごく大きな素数二つを掛け合わせた数を素因数分解することは難しい、というようなことを本で読みました。 これって暗号を作ることにも利用されているみたいですが、どうしてこの数を素因数分解することが難しいのでしょうか?

  • 学校でRSA暗号について勉強して分からないところがありましたので質問し

    学校でRSA暗号について勉強して分からないところがありましたので質問します。 暗号文の作成者をAさん、復号者をBさんとします。 Aさんは暗号文と公開鍵{e,n}を一般に公開しますよね? 暗号文を復号化するには秘密鍵が必要ですが、Bさんはeとnしか分からない(一般の人と得られる情報が同じ)のにどうやって秘密鍵を作成するのですか?nのもとになっている2つの素数がわからないことには秘密鍵が作成できないとおもうのですが… RSA暗号はnの素因数分解が計算量的に困難だから安全なんですよね?Bさんはどうやって2つの素数を特定するのでしょうか? 教えてください。

  • RSA暗号化の方法(具体的に)

    C++で、あるファイルを暗号化するプログラムを作成しようと思っています。 暗号はRSAで、と思っていますが、どのようにすればいいのか分かりません。 暗号自体のアルゴリズムは理解しているのですが、 「具体的に」どうすればいいのか教えて欲しいのです。 「文字」とか、そういう単位がなくて、単なるディスクファイル、またはメモリ上の bit列があったときに、それをどうやって暗号化するか、また復号するか。 鍵が分かったとして、bit列のどこからどこまでを1つの単位として計算するのか。 その暗号化単位は、公開鍵だけで判断できるのか。 素数で割った余りなので、1つの数字としてみたときに素数より小さい数でないと だめなことは分かります。 もしかしたら、このようなデータの暗号化は、他のアルゴリズムを 使用した方がいいのかもしれませんが、暗号について あまり詳しくないので、どうしたらいいのか分かりません。 ネットで調べた内容では、アルゴリズムは理解できても、 対象としているデータで、実際どうやるのか分かりませんでした。 よろしくお願いします。

  • AES暗号方式について

    AES暗号化方式では,秘密鍵(共通鍵)を用いてランダムに生成したセッション鍵で暗号化し,さらにそのセッション鍵を暗号化する. 復号化する場合は,逆の手順で平文に戻す と認識しています. これを踏まえて以下の質問に回答いただけると幸いです. 1.上の認識は間違っていないでしょうか? 2.暗号文を復号するには,暗号化時に生成したセッション鍵の値と秘密鍵が必要であると言えますか? 3.秘密鍵が漏れなければセッション鍵が漏れても問題ありませんか? 以上,3点についてご教授いただけると幸いです. よろしくお願いします.

  • プログラムの暗号化とクラッキング

    プログラムを暗号化する際、どのような種類の暗号化がありますか? 例えば置換暗号、という感じです たくさん種類があるなか、どんなものが難しいと言われるのでしょうか あと、暗号化されたプログラムを暴いて攻略すればハッキング(クラッキング)になりますか? ハッキング(クラッキング)の手順というか流れも教えてくれると助かります というか、コンピュータセキュリティは暗号化と同じですか? 自身は本当にプログラミングが苦手でして  ハッキングする気も出来る技能もないのですが学んで少し気になりました よろしくお願いします

  • VB.netでの暗号化復合化の鍵管理について

    Windows 7 Pro (64bit) VB.net 2010 Pro にてアプリ開発、暗号化複合化処理を実装しているところです。 作成するものは下記で、どちらもVB.netです。  1.暗号化ツール(自作  2.アプリ(自作 暗号化複合化処理は下記サイトを参考に行いました。 http://dobon.net/vb/dotnet/string/encryptfile.html システムの流れ ◆暗号化ツールについて  1.のツールで行います。  あるファイルを対象に暗号化し、そして、その暗号化されたファイルを出力し  2.のアプリに埋め込もうと考えています。  同時に、復号に使用する鍵(以下、「復号鍵」)もファイル出力します。 ◆復号化について  2.のアプリで行います。つまり暗号化と復号化の処理は1.2.で切り離されています。  ファイル内容を復号化(復号化された内容は文字列)し、  システム内部でそのファイル内容を使用したい。 ◆問題  復号化するからには、暗号化された復号鍵がどこかに添えてあげる必要があります。  【復号鍵の管理】に関して、どこに持つのがセキュリティ上最も安全か考えております。    折角暗号化したのにもかかわらず、復号鍵が目の見える場所にあっては、  アプリを解析などされた際などに、意味のないものになってしまいます。   何か良い策などあれば、参考にお聞かせ願えればと考えております。    ◆没案  下記の例では、コンピュータに長けている人であれば解析できそうな気がしたので  今回、私の作るシステムではアウトと考えています。  ・レジストリに格納    ・・・ レジストリエディタを使える人からすれば意味がない?    ・Windows上のローカル奥深くに隠しファイルとして保存    ・・・ そもそもディスクドライブにファイル保存すること自体がアウト?    ・USBなどの外部メディアに保存。システムを起動するときに指してもらう。   ・・・ 外部メディアの管理が必要になる。紛失時の問題にもなる。アウト。  ・サーバ上に、キーを持つ。   ・・・ この方法だと、そのサーバ情報もアプリに持つことになるので結局、そのサーバ情報も暗号化することに→イタチごっこに?アウト。 いろいろ考えて見てはいるのですが、いまいちピンときません。 そもそも解析されたら、などと考えるまでもなくこうすれば 鍵管理は問題ないという過去の事例などありましたら、ご教授願います。 よろしくお願いいたします。

  • RSA暗号についての素朴な疑問

    RSA暗号について勉強中のものですが、これまでのところ (1)送信側はは公開鍵(e,n)で平文aを b = a^e mod n で暗号文bを作成する。 (2)受信側は秘密鍵dを知っており、上記暗号文bからb^d mod n で元の平文aが求まる。 (3)暗号としてのキモは、(e,n)からでは復号できない。dを求めることも困難(nの素因数分解が困難) というのが私の理解したところです。数式等もある程度理解しました。 ただ、ここで素朴な疑問があります。dをしらなくてもbのべき乗を繰り返していけば復号できるのでは?ということです。自分が送信側で平文aを暗号化してbを作る。bから bxb→b' b'xb→b'' b''xb→b'''  と計算していけば平文aにたどり着くのでは? (その結果dもわかったことになる) 平文が現れたかのチェック時間は余分にかかると思いますが、dを知っていてbのd乗を計算するのと上記のように2乗、3乗...と繰り返すのと大きな違いがあるのでしょうか? 長文ですいません。

  • 一般的なセキュリティ(暗号化)

    こんにちは、Perlを始めて2週間の者です。 只今、認証ページを勉強&作成中です。 IDとPASSに関しては暗号化して認証することを考えていますが、 crypt関数で暗号化すると、8文字以降は切り捨てられるとのことなので、 入力文字列を8文字で区切り、それぞれを暗号化した後に結合して 1つの暗号化された文字列を生成しました。 8文字以上の(文字数が多い)方が安全性が増すという意味合いからです。 また、入力値を暗号化する前に、reverseで逆順にしたりしましたが、 こういった処理には(文字数を増やしたり、逆順にする)意味がありますか? (さほど、セキュリティ強度は変わらないのでしょうか?) また、完全な暗号化は存在しないと承知の上ですが、MD5等も 強度が低いと聞きました。 通常、認証時のデータはどのようなセキュリティを施すべきですか? (○○○をすれば十分というものは?)