4 Stimmen

RSA-Algorithmusimplementierung funktioniert in Java nicht ordnungsgemäß

Meiner Theorie nach weiß ich, dass wenn n=33, e(public key)=3 und d(private key)=7 sind, ich einen Klartext verschlüsseln kann, indem ich die BigInteger-Klasse mit modPow(e, n) verwende, und entschlüsseln kann mit modPow(d,n), aber nach der Entschlüsselung ist der Klartext nicht mehr derselbe wie zu Beginn.

Hier ist mein Code:

public class KeyTest {
private BigInteger n = new BigInteger("33");
private BigInteger e = new BigInteger("3");
private BigInteger d = new BigInteger("7");

public static void main(String[] args) {
    KeyTest test = new KeyTest();

    BigInteger plaintext = new BigInteger("55");
    System.out.println("Klartext: " + plaintext);

    BigInteger ciphertext = test.encrypt(plaintext);
    System.out.println("Chiffretext: " + ciphertext);

    BigInteger decrypted = test.decrypt(ciphertext);
    System.out.println("Klartext nach der Entschlüsselung: " + decrypted);
}

public BigInteger encrypt(BigInteger plaintext) {

    return plaintext.modPow(e, n);
}

public BigInteger decrypt(BigInteger ciphertext) {

    return ciphertext.modPow(d, n);
}
}

Die Ausgabe ist:

Klartext: 55 Chiffretext: 22 Klartext nach der Entschlüsselung: 22

3voto

durron597 Punkte 31345

Ihr Klartext (55) ist größer als das Modulus (33), daher können Sie die Nachricht tatsächlich nicht verschlüsseln. Betrachten Sie das folgende etwas andere Beispiel:

  • p = 11
  • q = 17
  • n = 187
  • phi(n) = 160
  • Wählen Sie e = 3
  • Wenn d = 107, dann e * d = 321 = 1 mod phi(n)

Ändern Sie also Ihren Code wie folgt:

private BigInteger n = new BigInteger("187");
private BigInteger e = new BigInteger("3");
private BigInteger d = new BigInteger("107");

public static void main(String[] args) {
  KeyTest test = new KeyTest();

  BigInteger plaintext = new BigInteger("55");
  System.out.println("Klartext: " + plaintext);

  BigInteger ciphertext = test.encrypt(plaintext);
  System.out.println("Geheimtext: " + ciphertext);

  BigInteger decrypted = test.decrypt(ciphertext);
  System.out.println("Klartext nach Entschlüsselung: " + decrypted);
}

public BigInteger encrypt(BigInteger plaintext) {

  return plaintext.modPow(e, n);
}

public BigInteger decrypt(BigInteger ciphertext) {

  return ciphertext.modPow(d, n);
}
}

Ausgabe:

Klartext: 55
Geheimtext: 132
Klartext nach Entschlüsselung: 55

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X