• ベストアンサー

RSA暗号

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

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

2.RSAの計算  平文を一定長さのブロックに分け、各ブロックを大きな数とみなし、この数よりも大きな数 N をとります。素数p、qをその積n(n=pq)がNよりも大きくなるように選びます... この計算で、 nがNより小さいと 計算が n を法とした計算なので、 N 以外の数が n を法として合同になります。 そうすると、復号化したとき、 N ではなく、N を n で割ったときの余りが出てきて 元に戻らない。

参考URL:
http://www002.upp.so-net.ne.jp/uyamakc4/RSAFFT/RSAFFT.htm
gachinco
質問者

お礼

ご回答ありがとうございます 考えてみれば当たり前の事ですよね… 数学は整数論は苦手なので こんな基本的な事もわからないなんて まだまだ勉強不足です

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

すげ~, #2 がまさにドンピシャ. ひょっとして超能力者? そこに書いてあることがすべてなんだけど, RSA はすべて剰余系で計算をおこなうから, 使ってる法より大きい数値は当然扱えません.

gachinco
質問者

お礼

どんぴしゃですね その部分を直して、暗号化鍵と復号化鍵のとる範囲をもう少し大きくしてみたら、問題なく暗号化と復号化が行えました。 「らしい」と書いたのは 自分が暗号数学をそこまで詳しく勉強したわけではなかったので、もしかしたら すごく簡単なミスで、断定的に「戻らない」と言ってしまうとちゃんと勉強してる方々に悪い気がしたからです… 案の定、簡単なミスだったようです… ご回答ありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

例をあげることはできますか? あくまで理論的には「暗号化鍵と復号化鍵が正しく対応していれば戻るはず」です. なので, 正しいペアができているかどうかをまず調べてみてはどうでしょうか. それにしても, 「らしい」ってどういうことなんだろう.

gachinco
質問者

補足

例えばですね。 二つの素数をpq n=pq φ(n)=(p-1)(q-1) e:暗号化鍵 d:複合化鍵 ed=1 (mod φ(n) ) とすると p:17 q:5 n:85 e:13 d:5 なのですが… この時 平文:14 暗号文:39 複合化後の文:14 と正しい場合があるけども 平文:89 暗号文:4 複合化後の文:4 なるようだったんですが、 調べてみたらなんとなく原因分かってきました(^^;) **** 計測結果 **** … 暗号文を復号化をしたもの:79 == 平文:79 平文:80 暗号文:65 暗号文を復号化をしたもの:80 == 平文:80 平文:81 暗号文:81 暗号文を復号化をしたもの:81 == 平文:81 平文:82 暗号文:22 暗号文を復号化をしたもの:82 == 平文:82 平文:83 暗号文:53 暗号文を復号化をしたもの:83 == 平文:83 平文:84 暗号文:84 暗号文を復号化をしたもの:84 == 平文:84 平文:85 暗号文:0 暗号文を復号化をしたもの:0 == 平文:85 平文:86 暗号文:1 暗号文を復号化をしたもの:1 == 平文:86 平文:87 暗号文:32 暗号文を復号化をしたもの:2 == 平文:87 平文:88 暗号文:63 暗号文を復号化をしたもの:3 == 平文:88 平文:89 暗号文:4 暗号文を復号化をしたもの:4 == 平文:89 平文:90 暗号文:20 暗号文を復号化をしたもの:5 == 平文:90 平文:91 暗号文:61 暗号文を復号化をしたもの:6 == 平文:91 平文:92 暗号文:57 暗号文を復号化をしたもの:7 == 平文:92 平文:93 暗号文:43 暗号文を復号化をしたもの:8 == 平文:93 平文:94 暗号文:59 … 平文≧n となるときは正しく戻らないようです(^^;) わざわざこの質問の為に時間割いてくれてありがとうございました!

関連するQ&A

  • RSA暗号の一般的な素数生成方法

    一般的なRSA暗号について質問です。 RSAでは鍵の生成に、大きな素数 p, q および (p-1)*(q-1)と互いに素となる素数eを使用します。 ただ、p, qの一般的に使用される桁数は1024bit(300桁超)であるため、素数の生成に非常に大きな時間がかかってしまいます。 e は3か65537を使用することで生成のための計算を省くことができますが… RSAで暗号鍵を生成する際に300桁もの素数を毎回計算して生成するのは時間がかかりすぎるため現実的ではないと思いますが、実際にはどのようにして300桁の素数を生成しているのでしょうか。 もしくは、計算済みの素数リストや固定の値を使用しているのでしょうか。 (後者はあり得ないとは思いますが…) 宜しくお願いします。

  • RSA暗号方式での平文の長さ

    現在、RSAを用いて公開鍵暗号の勉強を行っています。 そこで質問なのですが、どうして平文の長さは,鍵の長さよりも小さい必要があるのでしょうか?また、平文の長さが鍵の長さより大きくなった場合は、暗号化されないのでしょうか?よろしくおねがいします。

    • ベストアンサー
    • PHP
  • RSAのCプログラム

    何かC言語で書かれたRSAの一連の流れを示したものはありますか?Googleでプログラムを探しているのですがどうしてもみつかりません。プログラムとして、単純なものでよいです。ある平文に対して、はじめに2つの素数を見つけ(p,q)、鍵を生成し、暗号化をして、それを復号するというような一連の流れをC言語で見てみたいのでプログラムがありましたら教えてください。お願いします。

  • RSA暗号に関し、素数p.qが、それぞれ5、11であり、かつ、暗号化鍵

    RSA暗号に関し、素数p.qが、それぞれ5、11であり、かつ、暗号化鍵eが23のとき、復 号鍵dを求める考え方の手順を教えてください。さらにこれらを使って平文2を暗号化するにはどのようにすればいいでしょうか。

  • 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乗...と繰り返すのと大きな違いがあるのでしょうか? 長文ですいません。

  • iアプリでRSA暗号を実装したい

    今、iアプリでRSA暗号を実装しています。 しかし、p=512bit,q=512bit つまり、n=1024bitの鍵を用いるためにどうすればいいのでしょうか? 1024bitということは10進数で300桁を超えるため、困っています。 知っていましたら教えてください。

    • ベストアンサー
    • Java
  • RSA暗号化の方法(具体的に)

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

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

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

  • AES暗号方式について

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

  • RSAのプログラミング

     卒論でRSAをC++でプログラミングしています。  最初に選ぶ大きな素数p、qにより法鍵Nを作るとしたとき、p、qはどれくらい大きな数でなければなりませんか?  また、公開鍵は素数である必要はありますか?指数鍵もどのくらい大きな数である必要がありますか。  (p、q、公開鍵を一桁代の数字で計算すると、秘密鍵がマイナスにあるときがあったので)  また、「こんな暗号技術もC++で作ってみたら?」というのがあれば教えてください。