www.r-krell.de
Webangebot für Schule und Unterricht, Software, Fotovoltaik und mehr

Willkommen/Übersicht  >  Informatik  >  Informatik mit Java, Teil k)   >  RSA-Applet starten


RSA-Applet

Über dieser Webseite (oder dahinter, ggf. auf Java-Tasse in der Task-Leiste klicken!) erscheint
ein Extra-Fenster mit dem RSA-Applet zur Veranschaulichung der asymmetrischen Verschlüsslung
bzw. des 'public-key'-Verfahrens nach Rivest, Shamir und Adleman

Primzahlen p und q eingeben, n und phi berechnen lassen, e wählen und prüfen lassen,
d berechnen lassen, Zahl eingeben und
ver- oder entschlüsseln lassen

Bitte Beschränkungen des Zahlbereichs beachten
wie im Text auf der Seite k) dargelegt

Achtung: Java-Applets müssen zugelassen sein. Erscheint in Ihrem Internet-Explorer
oben eine gelbe Leiste, bitte drauf klicken und geblockte Inhalte zulassen...!

Applet geht nicht oder wird blockiert? - Gründe, Abhilfe und alle Downloads (in neuem Tab) - nur RSA_Kryptografie (r-krell.de).jar (12 kB) herunter laden

Nachfolgend der Quelltext des Applets, soweit nicht bereits auf der "Informatik-mit-Java"-Seite k) dargestellt:


zum Inhaltsverzeichnis (oben) / zum Seitenende

Startdatei für den Start des RSA-Programms als Applet oder als Application

// Start der RSA-Oberfläche
// www.r-krell.de/if-java-k.htm ** Krell, 4.2.2011/6.2.2011

public class RSA_0_OberflaechenStart extends javax.swing.JApplet
{
  
public static void main (String[] s)   // Start als Application
  {
    RSA_0_Oberflaeche rsa = 
new RSA_0_Oberflaeche("-- als Application");
  }
  
  
public void init()    // Start als Applet
  {
    RSA_0_Oberflaeche rsa = 
new RSA_0_Oberflaeche("-- als Applet");
  }
}


zum Inhaltsverzeichnis (oben) / zum Seitenende


Programmtext der Oberfläche

** Achtung, Falle: Ich selbst habe das Programm als normale Anwendung (Application) auf meinem Rechner programmiert und getestet. Erst nach dem ersten Veröffentlichungsversuch als Applet musste ich feststellen, dass die z.T. verwendeten Eingabefelder vom Typ JNumberField offenbar in (J)Applets nicht funktionieren. Deshalb musste das Programm so verändert werden, dass alle Felder vom Typ JNumberField als JTextField definiert und erzeugt wurden und dann der neue Quelltext zum Applet kompiliert und zusammengepackt wurde. Hier steht noch der alte, unveränderte Programmtext, um auch den Gebrauch von JNumberField-Objekten zu demonstrieren. Beim DHM-Applet (siehe Sonderseite zum DHM-Applet) ist hingegen der neue Programmtext ohne JNumberField angegeben, um auch das Nachbilden von x = feld .getInt() durch x = Integer.parseInt(feld.getText()); vorzuführen! **

// RSA-Oberfläche
// www.r-krell.de/if-java-k.htm ** Krell, 4.2.2011/6.2.2011

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class RSA_0_Oberflaeche extends JFrame {

  RSA_1_Primzahlsieb pSieb = 
new RSA_1_Primzahlsieb();
  RSA_2_ggT einfacherGgT   = 
new RSA_2_ggT();
  RSA_3_dSuche dBerechner  = 
new RSA_3_dSuche();
  RSA_4_potMod potMod      = 
new RSA_4_potMod();

  
// Anfang Attribute
  private JLabel jLabel1 = new JLabel();
  
private JLabel jLabel2 = new JLabel();
  
private JButton jBtPrimzahlenZeigen = new JButton();
  
private JLabel jLabel3 = new JLabel();
  
private JNumberField jNf_p = new JNumberField();
  
private JLabel jLabel4 = new JLabel();
  
private JNumberField jNf_q = new JNumberField();
  
private JLabel jLabel5 = new JLabel();
  
private JButton jBt_n_phi_berechnen = new JButton();
  
private JLabel jLabel6 = new JLabel();
  
private JNumberField jNf_n = new JNumberField();
  
private JLabel jLabel7 = new JLabel();
  
private JNumberField jNf_phi = new JNumberField();
  
private JLabel jLabel8 = new JLabel();
  
private JLabel jLabel9 = new JLabel();
  
private JNumberField jNf_e = new JNumberField();
  
private JButton jBt_ggT = new JButton();
  
private JButton jBt_d = new JButton();
  
private JLabel jLabel10 = new JLabel();
  
private JTextField jTf_ggT = new JTextField();
  
private JLabel jLabel11 = new JLabel();
  
private JNumberField jNf_d = new JNumberField();
  
private JLabel jLabel12 = new JLabel();
  
private JLabel jLabel13 = new JLabel();
  
private JLabel jLabel14 = new JLabel();
  
private JTextField jTf_k = new JTextField();
  
private JButton jBt_Verschluesseln = new JButton();
  
private JLabel jLabel15 = new JLabel();
  
private JTextField jTf_g = new JTextField();
  
private JButton jBt_Entschluesseln = new JButton();
  
private JScrollPane jScrollPane1 = new JScrollPane();
    
private JTextArea jTA_Ausgabe = new JTextArea("");
  
private JLabel jLabel16 = new JLabel();
  
// Ende Attribute

  public RSA_0_Oberflaeche (String title) {
    
super ("RSA-Kryptografie (www.r-krell.de) "+title);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    
int frameWidth = 729;
    
int frameHeight = 622;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    
int x = (d.width - getSize().width) / 2;
    
int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    Container cp = getContentPane();
    cp.setLayout(
null);
    
// Anfang Komponenten
    jLabel1.setBounds(241614124);
    jLabel1.setText(
"RSA-Verfahren");
    jLabel1.setFont(
new Font("MS Sans Serif", Font.BOLD, 17));
    cp.add(jLabel1);
    jLabel2.setBounds(
244820416);
    jLabel2.setText(
"1) Wahl zweier 'großer' Primzahlen");
    jLabel2.setFont(
new Font("MS Sans Serif", Font.PLAIN, 13));
    cp.add(jLabel2);
    jBtPrimzahlenZeigen.setBounds(
2804014525);
    jBtPrimzahlenZeigen.setText(
"Primzahlen zeigen");
    jBtPrimzahlenZeigen.setMargin(
new Insets(2222));
    jBtPrimzahlenZeigen.addActionListener(
new ActionListener() {
      
public void actionPerformed(ActionEvent evt) {
        jBtPrimzahlenZeigen_ActionPerformed(evt);
      }
    });
    cp.add(jBtPrimzahlenZeigen);
    jLabel3.setBounds(
456481516);
    jLabel3.setText(
"p=");
    jLabel3.setFont(
new Font("MS Sans Serif", Font.PLAIN, 13));
    cp.add(jLabel3);
    jNf_p.setBounds(
480407324);
    jNf_p.setText(
"13");
    cp.add(jNf_p);
    jLabel4.setBounds(
592481516);
    jLabel4.setText(
"q=");
    jLabel4.setFont(
new Font("MS Sans Serif", Font.PLAIN, 13));
    cp.add(jLabel4);
    jNf_q.setBounds(
616407324);
    jNf_q.setText(
"19");
    cp.add(jNf_q);
    jLabel5.setBounds(
249624416);
    jLabel5.setText(
"2) n=p*q und phi=(p-1)*(q-1) berechnen");
    jLabel5.setFont(
new Font("MS Sans Serif", Font.PLAIN, 13));
    cp.add(jLabel5);
    jBt_n_phi_berechnen.setBounds(
2808814525);
    jBt_n_phi_berechnen.setText(
"n und phi berechnen");
    jBt_n_phi_berechnen.setMargin(
new Insets(2222));
    jBt_n_phi_berechnen.addActionListener(
new ActionListener() {
      
public void actionPerformed(ActionEvent evt) {
        jBt_n_phi_berechnen_ActionPerformed(evt);
      }
    });
    cp.add(jBt_n_phi_berechnen);
    jLabel6.setBounds(
456961716);
    jLabel6.setText(
"n=");
    jLabel6.setFont(
new Font("MS Sans Serif", Font.BOLD, 13));
    cp.add(jLabel6);
    jNf_n.setBounds(
480887324);
    jNf_n.setText(
"");
    jNf_n.setEditable(
false);
    cp.add(jNf_n);
    jLabel7.setBounds(
584962516);
    jLabel7.setText(
"phi=");
    jLabel7.setFont(
new Font("MS Sans Serif", Font.PLAIN, 13));
    cp.add(jLabel7);
    jNf_phi.setBounds(
616887324);
    jNf_phi.setText(
"");
    jNf_phi.setEditable(
false);
    cp.add(jNf_phi);
    jLabel8.setBounds(
2414439016);
    jLabel8.setText(
"3) e für öffentlichen Schlüssel wählen (e < phi mit ggT(e,phi) = 1)");
    jLabel8.setFont(
new Font("MS Sans Serif", Font.PLAIN, 13));
    cp.add(jLabel8);
    jLabel9.setBounds(
401761816);
    jLabel9.setText(
"e=");
    jLabel9.setFont(
new Font("MS Sans Serif", Font.BOLD, 13));
    cp.add(jLabel9);
    jNf_e.setBounds(
721688124);
    jNf_e.setText(
"5");
    cp.add(jNf_e);
    jBt_ggT.setBounds(
28016814525);
    jBt_ggT.setText(
"nur ggT prüfen");
    jBt_ggT.setMargin(
new Insets(2222));
    jBt_ggT.addActionListener(
new ActionListener() {
      
public void actionPerformed(ActionEvent evt) {
        jBt_ggT_ActionPerformed(evt);
      }
    });
    cp.add(jBt_ggT);
    jBt_d.setBounds(
45616823325);
    jBt_d.setText(
"d für privaten Schlüssel berechnen");
    jBt_d.setMargin(
new Insets(2222));
    jBt_d.addActionListener(
new ActionListener() {
      
public void actionPerformed(ActionEvent evt) {
        jBt_d_ActionPerformed(evt);
      }
    });
    cp.add(jBt_d);
    jLabel10.setBounds(
2802086916);
    jLabel10.setText(
"ggT(phi,e)=");
    jLabel10.setFont(
new Font("MS Sans Serif", Font.PLAIN, 13));
    cp.add(jLabel10);
    jTf_ggT.setBounds(
3602006524);
    jTf_ggT.setText(
"");
    jTf_ggT.setEditable(
false);
    cp.add(jTf_ggT);
    jLabel11.setBounds(
4562081516);
    jLabel11.setText(
"d=");
    jLabel11.setFont(
new Font("MS Sans Serif", Font.PLAIN, 13));
    cp.add(jLabel11);
    jNf_d.setBounds(
4802007324);
    jNf_d.setText(
"");
    jNf_d.setEditable(
false);
    cp.add(jNf_d);
    jLabel12.setBounds(
2424045216);
    jLabel12.setText(
"4) Nur n und e veröffentlichen (aber p, q, phi und d sicher geheim halten!)");
    jLabel12.setFont(
new Font("MS Sans Serif", Font.PLAIN, 13));
    cp.add(jLabel12);
    jLabel13.setBounds(
2427236616);
    jLabel13.setText(
"5) Verschlüsseln (g = k^e %n) oder Entschlüsseln (k = g^d %n)");
    jLabel13.setFont(
new Font("MS Sans Serif", Font.PLAIN, 13));
    cp.add(jLabel13);
    jLabel14.setBounds(
403042216);
    jLabel14.setText(
"k=");
    jLabel14.setFont(
new Font("MS Sans Serif", Font.PLAIN, 13));
    cp.add(jLabel14);
    jTf_k.setBounds(
722968124);
    jTf_k.setText(
"65");
    cp.add(jTf_k);
    jBt_Verschluesseln.setBounds(
28029614525);
    jBt_Verschluesseln.setText(
"Verschlüsseln");
    jBt_Verschluesseln.setMargin(
new Insets(2222));
    jBt_Verschluesseln.addActionListener(
new ActionListener() {
      
public void actionPerformed(ActionEvent evt) {
        jBt_Verschluesseln_ActionPerformed(evt);
      }
    });
    cp.add(jBt_Verschluesseln);
    jLabel15.setBounds(
403442316);
    jLabel15.setText(
"g=");
    jLabel15.setFont(
new Font("MS Sans Serif", Font.PLAIN, 13));
    cp.add(jLabel15);
    jTf_g.setBounds(
723368124);
    jTf_g.setText(
"");
    cp.add(jTf_g);
    jBt_Entschluesseln.setBounds(
28033614525);
    jBt_Entschluesseln.setText(
"Entschlüsseln");
    jBt_Entschluesseln.setMargin(
new Insets(2222));
    jBt_Entschluesseln.addActionListener(
new ActionListener() {
      
public void actionPerformed(ActionEvent evt) {
        jBt_Entschluesseln_ActionPerformed(evt);
      }
    });
    cp.add(jBt_Entschluesseln);
    jScrollPane1.setBounds(
24392665177);
    cp.add(jScrollPane1);
    jTA_Ausgabe.setBounds(-
74, -2737177);
    jTA_Ausgabe.setText(
"");
    jTA_Ausgabe.setLineWrap(
true);
    jScrollPane1.setViewportView(jTA_Ausgabe);
    jLabel16.setBounds(
52034419016);
    jLabel16.setText(
"    R. Krell  (www.r-krell.de)");
    jLabel16.setFont(
new Font("MS Sans Serif", Font.PLAIN, 13));
    cp.add(jLabel16);
    
// Ende Komponenten
    setResizable(false);
    setVisible(
true);
  }

  
// Anfang Methoden
  public void jBtPrimzahlenZeigen_ActionPerformed(ActionEvent evt) {
    jTA_Ausgabe.append(pSieb.gibText(
160)+"\n");
  }

  
public void jBt_n_phi_berechnen_ActionPerformed(ActionEvent evt) {
    jNf_n.setInt(-
1);
    jNf_phi.setInt(-
1);
    
int p = jNf_p.getInt();
    
int q = jNf_q.getInt();
    jNf_n.setInt(p*q);
    jNf_phi.setInt((p-
1)*(q-1));
    jNf_d.setText(
"");
    
if (p*q >= Math.sqrt(Integer.MAX_VALUE))
    {
      jTA_Ausgabe.append(
"** Achtung: n >= "+(int)(Math.sqrt(Integer.MAX_VALUE))
       + 
". Interne Zwischenergebnisse beim Ver- und Entschlüsseln können mit max.\n"
       + "n*n zu unbemerktem Ganzzahl-Überlauf und damit zu falschen Ergebnissen für g bzw. k führen! **\n");
    }
  }

  
public void jBt_ggT_ActionPerformed(ActionEvent evt) {
    jTf_ggT.setText(
" ?");
    
int e = jNf_e.getInt();
    
int phi = jNf_phi.getInt();
    jTf_ggT.setText(
""+einfacherGgT.ggT_rek(phi, e));
  }

  
public void jBt_d_ActionPerformed(ActionEvent evt) {
    jNf_d.setInt(-
1);
    
int p = jNf_p.getInt();
    
int q = jNf_q.getInt();
    
int e = jNf_e.getInt();
    jNf_d.setInt(dBerechner.sucheD(p,q,e));
//    System.out.println("d (ErwEuklA) = "+dBerechner.sucheD(p,q,e)+", d (Prob) = "+dBerechner.sucheD_v1(p,q,e));
  }

  
public void jBt_Verschluesseln_ActionPerformed(ActionEvent evt) {
    jTf_g.setText(
" ?");
    String kWort =  jTf_k.getText();
    
int n =  1;
    
int e = -1;
    
try
    {
      n = jNf_n.getInt();
      e = jNf_e.getInt();
    }
    
catch (NumberFormatException nfe)
    { }
    
if (e <= 1)
    {
      jTA_Ausgabe.append(
"** Ohne p, q, n (<-bitte erst berechnen lassen!) und e kein Verschlüsseln möglich! **\n");
    }
    
else
    {
      
int k = 0;
      
try
      {
        k = Integer.parseInt(kWort);
      }
      
catch (Exception ex)
      {
        k = (
int)(kWort.charAt(0));
        jTA_Ausgabe.append(
"Aus der Eingabe k="+kWort+" wurde der ASCII-Wert "+k+" des vordersten Zeichens bestimmt!\n");
      }
      
int g = potMod.potMod(k,e,n);
      jTf_g.setText(
""+g);
    }
  }

  
public void jBt_Entschluesseln_ActionPerformed(ActionEvent evt) {
    jTf_k.setText(
" ?");
    String gWort =  jTf_g.getText();
    
int n =  1;
    
int d = -1;
    
try
    {
      n = jNf_n.getInt();
      d = jNf_d.getInt();
    }
    
catch (NumberFormatException e)
    { }
    
if (d<1)
    {
      jTA_Ausgabe.append(
"** Ohne p, q, n und d (<-bitte erst berechnen lassen!) kein Entschlüsseln möglich! **\n");
    }
    
else
    {
      
int g = 0;
      
try
      {
        g = Integer.parseInt(gWort);
      }
      
catch (Exception ex)
      {
        g = (
int)((gWort).charAt(0));
        jTA_Ausgabe.append(
"Aus der Eingabe g="+gWort+" wurde der ASCII-Wert "+g+" des vordersten Zeichens bestimmt!\n");
      }
      
int k = potMod.potMod(g,d,n);
      jTf_k.setText(
""+k);

    }
  }
}


zum Inhaltsverzeichnis (oben) / zum Seitenende

Hinweis: Die Klassen  RSA_1_Primzahlsieb,  RSA_2_ggT  und  RSA_3_dSuche  sind unter gleichen Namen auf der Seite k) im Quelltext angegeben. Die Klasse  RSA_4_potMod  ist (bis auf den Namen) identisch mit der auf der Seite k) vorgestellten Klasse RestVonPotenz_Rechner




zurück zur Seite „Informatik mit Java, Teil k)"




zum Anfang dieser Seite
Willkommen/Übersicht   -   Was ist neu?   -   Software   -   Mathematik   -   Physik   -   Informatik   -   Schule: Lessing-Gymnasium und -Berufskolleg   -   Fotovoltaik   -   & mehr   -   Kontakt: e-Mail,  News-Abo, Gästebuch, Impressum   -  Grußkarten, site map, Download und Suche

Diese Seite ist Teil des Webangebots http://www.r-krell.de. Sie können diese Seite per e-Mail weiter empfehlen (tell a friend).