2017-04-19 3 views
0

Ich versuche, eine Benutzereingabe mit RSA-Verschlüsselung zu verschlüsseln.Java RSA-Algorithmus, der NaN während der Verschlüsselung zurückgibt

Mit meinem Debug-Monitor in Eclipse kann ich sehen, dass, wenn der Code asciiLetter mit 'e' und versucht zu mod 'n' zu betreiben, die 'e' und 'n' sind zu groß, und kommen zurück Unendlichkeit oder NaN. Irgendwelche Hinweise, wie man das ändert?

Ich änderte die Bitlänge von 1024 auf 128, aber dies hatte keine Auswirkungen.

Später muss ich entschlüsseln, aber ich versuche, diesen Teil im Voraus zu arbeiten.

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

so fragen Sie sich, warum BigInteger verschlüsselteMessage = pow (asciiLetter, e); 'nicht funktioniert? ... du hast pow nicht implementiert (...) – DarkSquirrel42

+0

Ist das etwas mit dem Code zu tun: private statisch BigInteger pow (BigInteger asciiLetter, BigInteger e) { // TODO Automatisch generierter Methoden-Stub return null; Weil ich nicht sicher bin, was das ist, wollte Eclipse es hinzufügen. Wie ich sage, bin ich neu in der Codierung und bin ein bisschen fest :( – user7888294

+0

Verwenden Sie 'BigInteger verschlüsselteMessage = ASCIILetter.pow (e);' stattdessen? – dejvuth

Antwort

0

statt mit BigInteger.pow (...) und dann in einem zweiten Schritt die Folge mod n berechnet wird, einen Blick auf BigInteger.modPow (...)

tut beiden Schritte in Eins, und muss kein Ergebnis im Speicher haben, das größer als Ihr Gedächtnis ist ...

Verwandte Themen