2016-07-22 7 views
0

コードを投稿する前に、まず2つのものをレイアウトするのが最善だと思います。JavaでRSA暗号化のために多数のコードを格納する

目標:

は、少数のカップルに非常に基本的なRSA暗号化を実行します。 RSA暗号に精通しているあなたのために、以下のアルゴリズムで使用されている値を掲示しました。

現在RSA番号/値:

P = 29

Q = 31

N = P * Q

ファイ=((P-1)*(Q -1))

E = 11

私の問題:

私のコードを解読しようとすると問題が発生します。暗号化は設計どおりに動作します。

コード:

long[] mesg = new long[]{8, 7, 26, 28}; 
long[] encrypted_mesg = new long[mesg.length]; 

for(int i=0; i<mesg.length; i++){ 
    encrypted_mesg[i]=(long)((Math.pow(mesg[i],E))%N); 
    System.out.print(encrypted_mesg[i] + " "); 
} 
System.out.println(); 

//Decrpyt (not functioning-long to small, Big Integer not working) 
for(int j=0; j<encryp_mesg.length; j++){ 
    BigInteger decrypt = new BigInteger(Math.pow(encryp_mesg[j],D) + ""); 
    System.out.print(decrypt.toString() + " "); 
} 

最初の問題は、D(プライベート指数)、指数として適用、長い間大きなへの道だったという事実でした。私はすばらしいGoogle検索を行い、BigIntegerを試して実装しようと決めました。私は問題を解決しようとしてきた何

Exception in thread "main" java.lang.NumberFormatException: For input string: "Infinity" 

at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
at java.lang.Integer.parseInt(Integer.java:580) 

at java.math.BigInteger.<init>(BigInteger.java:461) 
at java.math.BigInteger.<init>(BigInteger.java:597) 
at RSA_Riddles.main(RSA_Riddles.java:23)** 

::私はプログラムを実行すると、このエラーがスローされます

を正直に言うと、私は答えはない知っているので、私は本当に何をしようとしていません無限に計算するが、BigIntegerはそれがそうであると考える。とにかく私は130^611のような番号を保存できるのですか?もしそうなら、どのように?

ビッグ質問:

どのように復号化を実行するために必要な値を保存することができますか?

私を助けてくれてありがとうございます。

+0

暗号化計算が29からのほとんどの値について間違った結果を生むときに、値が28までしかテストされないのはわかりません。また、復号化も同様にmod n:m = c^d mod n 。また、exponentiateとmoduloを別々に行うのはあなたのおもちゃのサイズにはあまり実用的ではありませんが、安全なサイズのためにそれを行うのはあなたの生涯(またはあなたのコンピュータ)よりもずっと長くかかるでしょう。そのため実際の実装はWikipediaで説明されているようにインターリーブしますあなたはbignumsをまったく必要としません。 –

答えて

2

プリミティブデータ型を使用して計算を行い、それらのプリミティブをBigIntegerに保存しているため、問題が発生しています。これは、BigIntegerを使用する目的を無効にします。のは、問題のある行を見てみましょう:Javaは、この行を評価

BigInteger decrypt = new BigInteger(Math.pow(encryp_mesg[j],D) + ""); 

、それは最初にこの表現

Math.pow(encryp_mesg[j],D) + "" 

を取り、それを評価します。次に、この評価の結果をBigIntegerのコンストラクタに渡します。ただし、この時点では、すでに作業しているデータ型の範囲を超えています。

BigInteger e = new BigInteger(Integer.toString(encryp_mesg[j])); 
BigInteger decrypt = e.pow(D); 

が今、あなただけのBigIntegerを使用して計算をやっている、とだけあなたは既にプリミティブデータ型に保存されたプリミティブデータ型の値に保存:代わりに、あなたはこのように、のBigIntegerで数学をやっている必要があります。

+0

ありがとうございます、すぐに実装を変更します。また、BigIntegerには制限がありますか?もしそうなら、彼らは何ですか? – jpgamer31

+0

うれしい私は助けることができました!それはあなたのために働く場合、あなたがSOのエチケットに従って答えを受け入れることができるなら、それは素晴らしいでしょう BigIntegersはあなたのマシンがリソースを持っているように大きな数字をサポートすることを意味する '任意精度'です(あなたはその限界に追いついて) – James

+0

私はそんなに騒ぎのビットです。これが私の最初の質問でした。どのように答えを受け入れるのですか? – jpgamer31

関連する問題