2017-04-19 4 views
0

RSA暗号化を使用してユーザー入力を暗号化しようとしています。暗号化中にNaNを返すJava RSAアルゴリズム

Eclipseで私のデバッグモニタを使用すると、コードがasciiLetterに 'e'で動いてmod 'n'にしようとすると、 'e'と 'n'が大きすぎて戻ります無限大またはNaN。これを変更する方法に関するガイダンスはありますか?

私は、1024〜128ビット長を下に変更したが、これは効果がなかったです。

後、私は、復号化する必要があるが、この部分は、事前に作業を取得しようとしています。

public class RSA { 


    static int bitlength = 128; 
    private static Random r = new Random(); 
    private static BigInteger p = BigInteger.probablePrime(bitlength, r); 
    private static BigInteger q = BigInteger.probablePrime(bitlength, r); 
    private static BigInteger n = p.multiply(q); 
    private BigInteger phi = p.subtract(BigInteger.ONE).multiply(q.subtract(BigInteger.ONE)); 
    private static BigInteger e = BigInteger.probablePrime(bitlength/2, r); 
    private BigInteger d; 
    private static BigInteger encryptedMessage; { 
     while (phi.gcd(e).compareTo(BigInteger.ONE) > 0 && e.compareTo(phi) < 0) { 
     e.add(BigInteger.ONE);   
     } 
    BigInteger d = (e.modInverse(phi)); 
    } 

    public static void main(String[] args) { 

    Scanner input = new Scanner(System.in); 
     System.out.println("Please enter your message: "); 

    String clearMsg = input.nextLine().trim(); // String clearMsg = input.next(); 
     System.out.println(clearMsg); // Check message trimmed 

char userInputArray[] = clearMsg.toCharArray(); 
ArrayList<BigInteger> cipherTextArray = new ArrayList<BigInteger>(); 

for (int i = 0; i < userInputArray.length; i++) { 

    int letter = userInputArray[i]; 
    BigInteger bigLetter = new BigInteger(String.valueOf(letter)); 
    BigInteger asciiLetter = (BigInteger) bigLetter; 
    BigInteger encryptedMessage = pow(asciiLetter, e); 
    BigInteger encryptM = encryptedMessage; 
    BigInteger encryptedMessageMod = encryptM.mod(n); 
    cipherTextArray.add(encryptedMessageMod); 
} 

     System.out.println(cipherTextArray); 
} 


private static BigInteger pow(BigInteger asciiLetter, BigInteger e) { 
    // TODO Auto-generated method stub 
    return null; 
+1

あなたはなぜ 'BigIntegerのencryptedMessage = POW(asciiLetter、e)を不思議に思っている;'は動作しませんか? ... pow(...)を実装していません – DarkSquirrel42

+0

これはコードと関係しますか? private static BigInteger pow(BigInteger asciiLetter、BigInteger e){ // TODO自動生成メソッドスタブ return null; 私はこれが何をするかわからないので、Eclipseはそれを追加したい私はコーディングに新しいですし、ビットが立ち往生しています言うように:( – user7888294

+0

使用 'BigIntegerのencryptedMessage = asciiLetter.pow(E);?ただ、'代わりに – dejvuth

答えて

0

代わりにBigInteger.pow(...)を使用し、その結果のmod Nを計算する第二の工程では、(...)BigInteger.modPowを見て

は、両方のステップで行い1、そしてあなたのメモリよりも大きいメモリに結果を持っている必要はありません...