Subtrees hinzugefügt
5
Quellcodes/iud_key_rsachat/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
*.class
|
||||||
|
*.ctxt
|
||||||
|
*.sh
|
||||||
|
repo.adoc
|
||||||
|
*.~lock
|
||||||
111
Quellcodes/iud_key_rsachat/Base64.java
Normal file
|
|
@ -0,0 +1,111 @@
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.util.Random;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import javax.xml.bind.DatatypeConverter;
|
||||||
|
|
||||||
|
public class Base64
|
||||||
|
{
|
||||||
|
public static String encode(String text)
|
||||||
|
{
|
||||||
|
byte[] data = text.getBytes();
|
||||||
|
return encode(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String encode(byte[] data) {
|
||||||
|
char[] tbl = {
|
||||||
|
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
|
||||||
|
'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',
|
||||||
|
'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
|
||||||
|
'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/' };
|
||||||
|
|
||||||
|
StringBuilder buffer = new StringBuilder();
|
||||||
|
int pad = 0;
|
||||||
|
for (int i = 0; i < data.length; i += 3) {
|
||||||
|
|
||||||
|
int b = ((data[i] & 0xFF) << 16) & 0xFFFFFF;
|
||||||
|
if (i + 1 < data.length) {
|
||||||
|
b |= (data[i+1] & 0xFF) << 8;
|
||||||
|
} else {
|
||||||
|
pad++;
|
||||||
|
}
|
||||||
|
if (i + 2 < data.length) {
|
||||||
|
b |= (data[i+2] & 0xFF);
|
||||||
|
} else {
|
||||||
|
pad++;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int j = 0; j < 4 - pad; j++) {
|
||||||
|
int c = (b & 0xFC0000) >> 18;
|
||||||
|
buffer.append(tbl[c]);
|
||||||
|
b <<= 6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int j = 0; j < pad; j++) {
|
||||||
|
buffer.append("=");
|
||||||
|
}
|
||||||
|
|
||||||
|
return buffer.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static String decodeStr(String data)
|
||||||
|
{
|
||||||
|
return new String(decode(data));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static byte[] decode(String data)
|
||||||
|
{
|
||||||
|
int[] tbl = {
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54,
|
||||||
|
55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2,
|
||||||
|
3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||||
|
20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30,
|
||||||
|
31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
|
||||||
|
48, 49, 50, 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
|
||||||
|
byte[] bytes = data.getBytes();
|
||||||
|
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
|
||||||
|
for (int i = 0; i < bytes.length; ) {
|
||||||
|
int b = 0;
|
||||||
|
if (tbl[bytes[i]] != -1) {
|
||||||
|
b = (tbl[bytes[i]] & 0xFF) << 18;
|
||||||
|
}
|
||||||
|
// skip unknown characters
|
||||||
|
else {
|
||||||
|
i++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
int num = 0;
|
||||||
|
if (i + 1 < bytes.length && tbl[bytes[i+1]] != -1) {
|
||||||
|
b = b | ((tbl[bytes[i+1]] & 0xFF) << 12);
|
||||||
|
num++;
|
||||||
|
}
|
||||||
|
if (i + 2 < bytes.length && tbl[bytes[i+2]] != -1) {
|
||||||
|
b = b | ((tbl[bytes[i+2]] & 0xFF) << 6);
|
||||||
|
num++;
|
||||||
|
}
|
||||||
|
if (i + 3 < bytes.length && tbl[bytes[i+3]] != -1) {
|
||||||
|
b = b | (tbl[bytes[i+3]] & 0xFF);
|
||||||
|
num++;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (num > 0) {
|
||||||
|
int c = (b & 0xFF0000) >> 16;
|
||||||
|
buffer.write((char)c);
|
||||||
|
b <<= 8;
|
||||||
|
num--;
|
||||||
|
}
|
||||||
|
i += 4;
|
||||||
|
}
|
||||||
|
return buffer.toByteArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
Quellcodes/iud_key_rsachat/ChatClient.jar
Normal file
658
Quellcodes/iud_key_rsachat/ChatClient.java
Normal file
|
|
@ -0,0 +1,658 @@
|
||||||
|
import java.awt.*;
|
||||||
|
import java.awt.event.*;
|
||||||
|
import javax.swing.*;
|
||||||
|
import javax.swing.event.*;
|
||||||
|
import java.util.*;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.math.BigInteger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Beschreibung
|
||||||
|
*
|
||||||
|
* @version 1.1 vom 30.01.2020
|
||||||
|
* @author Thomas Schaller
|
||||||
|
* Version 1.1: Hash-Funkion ausgetauscht, damit Hashes unterschiedlicher. , Ö/P-Schlüssel in der gleichen Farbe
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class ChatClient extends JFrame implements MySocketListener {
|
||||||
|
//
|
||||||
|
protected int HOEHE = 60;
|
||||||
|
// Anfang Attribute
|
||||||
|
protected JPanel jPanel1 = new JPanel(null, true);
|
||||||
|
protected JLabel jLabel2 = new JLabel();
|
||||||
|
protected JTextField jTFName = new JTextField();
|
||||||
|
protected JTextField jTFAdress = new JTextField();
|
||||||
|
protected JLabel jLabel3 = new JLabel();
|
||||||
|
protected JButton jBVerbinden = new JButton();
|
||||||
|
protected JLabel jLabel1 = new JLabel();
|
||||||
|
protected JNumberField jNFPort = new JNumberField();
|
||||||
|
protected JTextField jTFNachricht = new JTextField();
|
||||||
|
|
||||||
|
protected MySocket client = null;
|
||||||
|
protected JLabel jLabel5 = new JLabel();
|
||||||
|
protected JScrollPane jScrollPane1 = new JScrollPane();
|
||||||
|
protected JScrollPane jScrollPane2 = new JScrollPane();
|
||||||
|
protected JPanel jp;
|
||||||
|
protected ArrayList<Nachricht> nachrichten;
|
||||||
|
protected ArrayList<Key> keys;
|
||||||
|
protected ArrayList<String> kontakte;
|
||||||
|
protected Key dragKey = null;
|
||||||
|
protected JLabel jLabel4 = new JLabel();
|
||||||
|
protected GridBagLayout gbl;
|
||||||
|
protected int keyColor = 0;
|
||||||
|
private JLabel jLabel6 = new JLabel();
|
||||||
|
// Ende Attribute
|
||||||
|
|
||||||
|
public ChatClient(String title) {
|
||||||
|
// Frame-Initialisierung
|
||||||
|
super(title);
|
||||||
|
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
|
||||||
|
addWindowListener(new WindowListener() {
|
||||||
|
public void windowActivated(WindowEvent e) {}
|
||||||
|
public void windowClosed(WindowEvent e) {}
|
||||||
|
public void windowClosing(WindowEvent e) {
|
||||||
|
if (client != null) {
|
||||||
|
client.sendeNachricht("exit");
|
||||||
|
client.trenneVerbindung();
|
||||||
|
} // end of if
|
||||||
|
}
|
||||||
|
public void windowDeactivated(WindowEvent e) {}
|
||||||
|
public void windowDeiconified(WindowEvent e) {}
|
||||||
|
public void windowIconified(WindowEvent e){}
|
||||||
|
public void windowOpened(WindowEvent e){}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
int frameWidth = 1081;
|
||||||
|
int frameHeight = 683;
|
||||||
|
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);
|
||||||
|
setResizable(false);
|
||||||
|
Container cp = getContentPane();
|
||||||
|
cp.setLayout(null);
|
||||||
|
// Anfang Komponenten
|
||||||
|
|
||||||
|
jPanel1.setBounds(8, 8, 1041, 41);
|
||||||
|
jPanel1.setOpaque(false);
|
||||||
|
jPanel1.setBorder(BorderFactory.createBevelBorder(1, Color.WHITE, Color.DARK_GRAY));
|
||||||
|
cp.add(jPanel1);
|
||||||
|
jLabel2.setBounds(264, 11, 62, 20);
|
||||||
|
jLabel2.setText("Server");
|
||||||
|
jPanel1.add(jLabel2);
|
||||||
|
jTFName.setBounds(80, 11, 150, 20);
|
||||||
|
jTFName.setText("anonymous");
|
||||||
|
jPanel1.add(jTFName);
|
||||||
|
jTFAdress.setBounds(312, 11, 150, 20);
|
||||||
|
jTFAdress.setText("localhost");
|
||||||
|
jPanel1.add(jTFAdress);
|
||||||
|
jLabel3.setBounds(496, 11, 62, 20);
|
||||||
|
jLabel3.setText("Port");
|
||||||
|
jPanel1.add(jLabel3);
|
||||||
|
jBVerbinden.setBounds(936, 8, 99, 25);
|
||||||
|
jBVerbinden.setText("Verbinden");
|
||||||
|
jBVerbinden.setMargin(new Insets(2, 2, 2, 2));
|
||||||
|
jBVerbinden.addActionListener(new ActionListener() {
|
||||||
|
public void actionPerformed(ActionEvent evt) {
|
||||||
|
jBVerbinden_ActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
jPanel1.add(jBVerbinden);
|
||||||
|
|
||||||
|
|
||||||
|
jLabel1.setBounds(8, 12, 62, 18);
|
||||||
|
jLabel1.setText("Name");
|
||||||
|
jPanel1.add(jLabel1);
|
||||||
|
jNFPort.setBounds(528, 11, 75, 20);
|
||||||
|
jNFPort.setText("44444");
|
||||||
|
jPanel1.add(jNFPort);
|
||||||
|
jLabel5.setBounds(8, 64, 62, 20);
|
||||||
|
jLabel5.setText("Schlüssel");
|
||||||
|
cp.add(jLabel5);
|
||||||
|
keys = new ArrayList<Key>();
|
||||||
|
|
||||||
|
JPanel jp2 = new PicPanel(keys);
|
||||||
|
jp2.setToolTipText("");
|
||||||
|
jScrollPane2 = new JScrollPane(jp2);
|
||||||
|
|
||||||
|
jScrollPane2.setBounds(96, 64, 953, 57);
|
||||||
|
jp2.addMouseListener(new MouseAdapter() {
|
||||||
|
public void mousePressed(MouseEvent evt) {
|
||||||
|
keyCached(evt);
|
||||||
|
}
|
||||||
|
public void mouseReleased(MouseEvent evt) {
|
||||||
|
keyDropped(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
cp.add(jScrollPane2);
|
||||||
|
jLabel4.setBounds(8, 144, 86, 20);
|
||||||
|
jLabel4.setText("Nachrichten");
|
||||||
|
cp.add(jLabel4);
|
||||||
|
addWindowListener(new WindowAdapter() {
|
||||||
|
public void windowClosing(WindowEvent evt) {
|
||||||
|
ChatClient_WindowClosing(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
jLabel6.setBounds(816, 624, 229, 20);
|
||||||
|
jLabel6.setText("(cc) 2020, Thomas Schaller, Version 1.1");
|
||||||
|
jLabel6.setForeground(Color.GRAY);
|
||||||
|
cp.add(jLabel6);
|
||||||
|
// Ende Komponenten
|
||||||
|
|
||||||
|
jTFNachricht.setBounds(10, 20, 358, 20);
|
||||||
|
jTFNachricht.addActionListener(new ActionListener() {
|
||||||
|
public void actionPerformed(ActionEvent evt) {
|
||||||
|
jTFNachricht_ActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
Random ran = new Random();
|
||||||
|
nachrichten = new ArrayList<Nachricht>();
|
||||||
|
|
||||||
|
|
||||||
|
kontakte = new ArrayList<String>();
|
||||||
|
kontakte.add("alle");
|
||||||
|
|
||||||
|
|
||||||
|
jp = new JPanel();
|
||||||
|
jScrollPane1 = new JScrollPane(jp);
|
||||||
|
jScrollPane1.setBounds(96, 136, 953, 481);
|
||||||
|
jScrollPane1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
|
||||||
|
jp.addMouseListener(new MouseAdapter() {
|
||||||
|
public void mousePressed(MouseEvent evt) {
|
||||||
|
keyMessageCached(evt);
|
||||||
|
}
|
||||||
|
public void mouseReleased(MouseEvent evt) {
|
||||||
|
keyMessageDropped(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
cp.add(jScrollPane1);
|
||||||
|
gbl = new GridBagLayout();
|
||||||
|
jp.setLayout(gbl);
|
||||||
|
|
||||||
|
this.updateNachrichtenListe();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
setVisible(true);
|
||||||
|
} // end of public ChatClient
|
||||||
|
|
||||||
|
// Anfang Methoden
|
||||||
|
public void jBVerbinden_ActionPerformed(ActionEvent evt) {
|
||||||
|
String a = jTFAdress.getText();
|
||||||
|
int p = jNFPort.getInt();
|
||||||
|
if (client != null && client.isAktiv()) {
|
||||||
|
jTFName.setEnabled(true);
|
||||||
|
jTFAdress.setEnabled(true);
|
||||||
|
jNFPort.setEnabled(true);
|
||||||
|
jBVerbinden.setText("Verbinden");
|
||||||
|
client.sendeNachricht("exit");
|
||||||
|
client.trenneVerbindung();
|
||||||
|
} else {
|
||||||
|
client = new MySocket(a, p, this);
|
||||||
|
if (client.isAktiv()) {
|
||||||
|
jTFName.setEnabled(false);
|
||||||
|
jTFAdress.setEnabled(false);
|
||||||
|
jNFPort.setEnabled(false);
|
||||||
|
jBVerbinden.setText("Trennen");
|
||||||
|
client.sendeNachricht(("user:"+jTFName.getText()+":alle"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // end of if-else
|
||||||
|
|
||||||
|
} // end of jBVerbinden_ActionPerformed
|
||||||
|
|
||||||
|
|
||||||
|
public byte[] appendOther(byte[] a1, byte[] a2){
|
||||||
|
byte[] a3 = new byte[a1.length + a2.length];
|
||||||
|
System.arraycopy(a1, 0, a3, 0, a1.length);
|
||||||
|
System.arraycopy(a2, 0, a3, a1.length, a2.length);
|
||||||
|
return a3;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void jBSend_ActionPerformed(ActionEvent evt) {
|
||||||
|
if (client != null && client.isAktiv()) {
|
||||||
|
JMyButton button = (JMyButton) evt.getSource();
|
||||||
|
Nachricht n = button.getNachricht();
|
||||||
|
n.setEmpfaenger((String) button.getEmpfaenger().getSelectedItem());
|
||||||
|
String b = "mess:"+n.getAbsender()+":"+n.getEmpfaenger()+":"+Base64.encode(n.getInhalt())+":"+Base64.encode(n.getHashCode());
|
||||||
|
client.sendeNachricht(b);
|
||||||
|
this.updateNachrichtenListe();
|
||||||
|
} else {
|
||||||
|
jTFName.setEnabled(true);
|
||||||
|
jTFAdress.setEnabled(true);
|
||||||
|
jNFPort.setEnabled(true);
|
||||||
|
jBVerbinden.setEnabled(true);
|
||||||
|
} // end of if
|
||||||
|
} // end of jBSend_ActionPerformed
|
||||||
|
|
||||||
|
|
||||||
|
public void generateKeyPair(int bits) {
|
||||||
|
RSA rsa = new RSA(bits);
|
||||||
|
rsa.generateKey();
|
||||||
|
int c = keyColor;
|
||||||
|
addKey(rsa.getPublicKey());
|
||||||
|
keyColor = c;
|
||||||
|
addKey(rsa.getPrivateKey());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addKey(Key k) {
|
||||||
|
boolean schonda = false;
|
||||||
|
for (Key kk : keys) {
|
||||||
|
if (kk.getN().equals(k.getN()) && kk.getE().equals(k.getE())) {
|
||||||
|
JOptionPane.showMessageDialog(this,
|
||||||
|
"Dieser Schlüssel entspricht dem schon vorhandenen Schlüssel "+kk.getName(),
|
||||||
|
"Achtung",
|
||||||
|
JOptionPane.WARNING_MESSAGE);
|
||||||
|
break;
|
||||||
|
} // end of if
|
||||||
|
} // end of for
|
||||||
|
|
||||||
|
k.setImage("key"+keyColor);
|
||||||
|
keyColor = (keyColor+1)%10;
|
||||||
|
keys.add(k);
|
||||||
|
|
||||||
|
|
||||||
|
jScrollPane2.repaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showPublicZertKey() {
|
||||||
|
Key k = RSA.getPublicKeyZert();
|
||||||
|
addKey(k);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void signKey(Key k) {
|
||||||
|
Key nk = new Key(k.getName()+"(z)",k.getE(),k.getN());
|
||||||
|
nk.sign(RSA.getPrivateKeyZert(),jTFName.getText());
|
||||||
|
nk.setImage(k.getFilename()+"s");
|
||||||
|
|
||||||
|
keys.add(keys.indexOf(k)+1,nk);
|
||||||
|
jScrollPane2.repaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteKey(Key k) {
|
||||||
|
keys.remove(k);
|
||||||
|
jScrollPane2.repaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public void neuerClient(MySocket client) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void nachrichtEmpfangen(MySocket client) {
|
||||||
|
String s = client.holeNachricht();
|
||||||
|
String[] ss = s.split(":");
|
||||||
|
|
||||||
|
if (ss[0].equals("user")) {
|
||||||
|
kontakte.add(ss[1]);
|
||||||
|
Nachricht n = new Nachricht("Server","alle","Neuer User: "+ss[1]);
|
||||||
|
n.setSended(true);
|
||||||
|
nachrichten.add(0,n);
|
||||||
|
this.updateNachrichtenListe();
|
||||||
|
|
||||||
|
}
|
||||||
|
if(ss[0].equals("mess")) {
|
||||||
|
String hash;
|
||||||
|
if (ss.length==5) {
|
||||||
|
hash = ss[4];
|
||||||
|
} else {
|
||||||
|
hash = "";
|
||||||
|
}// end of if
|
||||||
|
Nachricht n = new Nachricht(ss[1],ss[2],Base64.decode(ss[3]),Base64.decode(hash));
|
||||||
|
nachrichten.add(0,n);
|
||||||
|
this.updateNachrichtenListe();
|
||||||
|
|
||||||
|
} // end of if
|
||||||
|
}
|
||||||
|
|
||||||
|
public void verbindungBeendet(MySocket client) {
|
||||||
|
jTFName.setEnabled(true);
|
||||||
|
jTFAdress.setEnabled(true);
|
||||||
|
jNFPort.setEnabled(true);
|
||||||
|
jBVerbinden.setText("Verbinden");
|
||||||
|
client = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void jTFNachricht_ActionPerformed(ActionEvent evt) {
|
||||||
|
Nachricht n = new Nachricht(jTFName.getText(),"", jTFNachricht.getText());
|
||||||
|
jTFNachricht.setText("");
|
||||||
|
nachrichten.add(0,n);
|
||||||
|
this.updateNachrichtenListe();
|
||||||
|
jTFNachricht.requestFocus();
|
||||||
|
} // end of jTFNachricht_ActionPerformed
|
||||||
|
|
||||||
|
public void keyCached(MouseEvent evt) {
|
||||||
|
Key k = null;
|
||||||
|
if (evt.getX()>10 && evt.getX()< keys.size()*32+10) {
|
||||||
|
int k_nr = (int) ((evt.getX()-10) /32);
|
||||||
|
k = keys.get(k_nr);
|
||||||
|
}
|
||||||
|
if (evt.getButton() == evt.BUTTON1) {
|
||||||
|
if (k != null) {
|
||||||
|
Toolkit toolkit = Toolkit.getDefaultToolkit();
|
||||||
|
dragKey = k;
|
||||||
|
Cursor c = toolkit.createCustomCursor(dragKey.getImage() , new Point(0, 0), "img");
|
||||||
|
setCursor (c);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
new KeyPopup(evt,this, k);
|
||||||
|
} // end of if
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public void keyDropped(MouseEvent evt) {
|
||||||
|
GridBagConstraints c = new GridBagConstraints();
|
||||||
|
|
||||||
|
Point p = evt.getPoint();
|
||||||
|
Point pp = SwingUtilities.convertPoint(jScrollPane2, p, jScrollPane2.getParent());
|
||||||
|
Point pp2 = SwingUtilities.convertPoint(jScrollPane2, p, jScrollPane1);
|
||||||
|
|
||||||
|
if (pp2.getY()>0 && pp2.getY() < jScrollPane1.getHeight() && pp2.getX()>=0 && pp2.getX() < jScrollPane1.getWidth() && dragKey!=null) {
|
||||||
|
Point ppp = SwingUtilities.convertPoint(jScrollPane2, p, jp);
|
||||||
|
Component cc = jp.getComponentAt(ppp.x,ppp.y);
|
||||||
|
GridBagLayout gbl = (GridBagLayout) jp.getLayout();
|
||||||
|
c = gbl.getConstraints(cc);
|
||||||
|
|
||||||
|
int n_nr = c.gridy-1;
|
||||||
|
if (n_nr == -1) {
|
||||||
|
Nachricht n;
|
||||||
|
if (dragKey.isSigned()) {
|
||||||
|
n = new Nachricht(jTFName.getText(),"",dragKey.toString(jTFName.getText()).getBytes(),dragKey.getHashCode());
|
||||||
|
} else {
|
||||||
|
n = new Nachricht(jTFName.getText(),"",dragKey.toString(jTFName.getText()));
|
||||||
|
} // end of if-else
|
||||||
|
nachrichten.add(0,n);
|
||||||
|
this.updateNachrichtenListe();
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
if (n_nr >= 0 && n_nr < nachrichten.size() && c.gridx==1) {
|
||||||
|
byte[] klar = nachrichten.get(n_nr).getInhalt();
|
||||||
|
if (dragKey.calcBlocksize()<klar.length) {
|
||||||
|
JOptionPane.showMessageDialog(this,
|
||||||
|
"Die Nachricht ist zu lang für diesen Schlüssel. Es können nur "+dragKey.calcBlocksize()+" Zeichen verschlüsselt werden.",
|
||||||
|
"Fehler",
|
||||||
|
JOptionPane.WARNING_MESSAGE);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// end of if
|
||||||
|
byte[] krypt = dragKey.encrypt(klar);
|
||||||
|
Nachricht n = nachrichten.get(n_nr).copy();
|
||||||
|
n.setInhalt(krypt);
|
||||||
|
n.addKey(dragKey);
|
||||||
|
nachrichten.add(n_nr+1,n);
|
||||||
|
this.updateNachrichtenListe();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (n_nr >= 0 && n_nr < nachrichten.size() && c.gridx==2) {
|
||||||
|
byte[] klar = nachrichten.get(n_nr).getHashCode();
|
||||||
|
if (dragKey.calcBlocksize()<klar.length) {
|
||||||
|
JOptionPane.showMessageDialog(this,
|
||||||
|
"Der Schlüssel ist zu kurz für diesen Hashcode. Es können nur "+dragKey.calcBlocksize()+" Zeichen verschlüsselt werden.",
|
||||||
|
"Fehler",
|
||||||
|
JOptionPane.WARNING_MESSAGE);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// end of if
|
||||||
|
byte[] krypt = dragKey.encrypt(klar);
|
||||||
|
Nachricht n = nachrichten.get(n_nr).copy();
|
||||||
|
n.setHashCode(krypt);
|
||||||
|
n.addHashKey(dragKey);
|
||||||
|
nachrichten.add(n_nr+1,n);
|
||||||
|
this.updateNachrichtenListe();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
dragKey = null;
|
||||||
|
|
||||||
|
Cursor dc = new Cursor(Cursor.DEFAULT_CURSOR);
|
||||||
|
setCursor (dc);
|
||||||
|
} // end of jLabel5_MouseClicked
|
||||||
|
|
||||||
|
|
||||||
|
public void keyMessageCached(MouseEvent evt) {
|
||||||
|
Point p = evt.getPoint();
|
||||||
|
Point pp = SwingUtilities.convertPoint(jScrollPane1, p, jp);
|
||||||
|
|
||||||
|
GridBagLayout gbl = (GridBagLayout) jp.getLayout();
|
||||||
|
Component cp = jp.getComponentAt(evt.getX(),evt.getY());
|
||||||
|
GridBagConstraints gbc = gbl.getConstraints(cp);
|
||||||
|
System.out.println(evt.getY());
|
||||||
|
|
||||||
|
if (evt.getButton() == evt.BUTTON1 && gbc.gridx == 1) {
|
||||||
|
if (gbc.gridy-1< nachrichten.size() && gbc.gridy-1 >= 0) {
|
||||||
|
int n_nr = gbc.gridy-1;
|
||||||
|
String[] teile = nachrichten.get(n_nr).getInhaltString().split(",|=");
|
||||||
|
|
||||||
|
if (teile[0].equals("Key:Name")) {
|
||||||
|
|
||||||
|
BigInteger e = new BigInteger(teile[3]);
|
||||||
|
BigInteger n = new BigInteger(teile[5]);
|
||||||
|
|
||||||
|
dragKey = new Key(teile[1],e,n) ;
|
||||||
|
dragKey.setImage("key"+keyColor);
|
||||||
|
|
||||||
|
Toolkit toolkit = Toolkit.getDefaultToolkit();
|
||||||
|
Cursor c = toolkit.createCustomCursor(dragKey.getImage() , new Point(0, 0), "img");
|
||||||
|
setCursor (c);
|
||||||
|
} // end of if
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
} // end of if
|
||||||
|
if (evt.getButton() == evt.BUTTON3 && gbc.gridx == 1) {
|
||||||
|
int n_nr = gbc.gridy-1;
|
||||||
|
makeMessagePopup(evt,nachrichten.get(n_nr));
|
||||||
|
|
||||||
|
} // end of if
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected void makeMessagePopup(MouseEvent evt, Nachricht n) {
|
||||||
|
new MessagePopup(evt, this, n);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void keyMessageDropped(MouseEvent evt) {
|
||||||
|
|
||||||
|
|
||||||
|
Point p = evt.getPoint();
|
||||||
|
Point pp = SwingUtilities.convertPoint(jp, p, jScrollPane2);
|
||||||
|
|
||||||
|
if (pp.getY()>0 && pp.getY() < jScrollPane2.getHeight() && pp.getX()>=0 && pp.getX() < jScrollPane2.getWidth() && dragKey!=null) {
|
||||||
|
this.addKey(dragKey);
|
||||||
|
}
|
||||||
|
dragKey = null;
|
||||||
|
|
||||||
|
Cursor dc = new Cursor(Cursor.DEFAULT_CURSOR);
|
||||||
|
setCursor (dc);
|
||||||
|
} // end of jLabel5_MouseClicked
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public void updateNachrichtenListe() {
|
||||||
|
|
||||||
|
//jp.setBounds(jScrollPane1.getViewport().getBounds());
|
||||||
|
GridBagConstraints c = new GridBagConstraints();
|
||||||
|
while (jp.getComponentCount()>1) {
|
||||||
|
jp.remove(1);
|
||||||
|
} // end of while
|
||||||
|
//jp.removeAll();
|
||||||
|
|
||||||
|
if (jp.getComponentCount()==0) {
|
||||||
|
JPanel eingabe = new JPanel();
|
||||||
|
eingabe.setBorder(BorderFactory.createBevelBorder(0));
|
||||||
|
eingabe.setLayout(null);
|
||||||
|
eingabe.setBackground(new Color(250,255,200));
|
||||||
|
eingabe.setOpaque(true);
|
||||||
|
eingabe.setPreferredSize(new Dimension(150,HOEHE));
|
||||||
|
|
||||||
|
c.gridx=0; c.gridy = 0;
|
||||||
|
c.gridwidth=5;
|
||||||
|
c.fill = GridBagConstraints.BOTH;
|
||||||
|
c.weightx = 1.0;
|
||||||
|
jTFNachricht.setBounds(100,20,800,20);
|
||||||
|
JLabel nn = new JLabel();
|
||||||
|
nn.setText("Neue Nachricht");
|
||||||
|
nn.setBounds(2,20,90,20);
|
||||||
|
eingabe.add(nn);
|
||||||
|
eingabe.add(jTFNachricht);
|
||||||
|
jp.add(eingabe,c);
|
||||||
|
|
||||||
|
} // end of if
|
||||||
|
c.weightx=0;
|
||||||
|
c.gridwidth=1;
|
||||||
|
int xx = 1;
|
||||||
|
JLabel name = null;
|
||||||
|
for (Nachricht n : nachrichten) {
|
||||||
|
|
||||||
|
if (n.getKeys().size()>0 && name != null) {
|
||||||
|
GridBagConstraints c2 = gbl.getConstraints(name);
|
||||||
|
c2.gridheight++;
|
||||||
|
gbl.setConstraints(name,c2);
|
||||||
|
} else {
|
||||||
|
name = new JLabel();
|
||||||
|
name.setText("<html>Von "+n.getAbsender()+"</html>");
|
||||||
|
name.setBorder(BorderFactory.createBevelBorder(0));
|
||||||
|
name.setBackground(new Color(250,255,200));
|
||||||
|
name.setOpaque(true);
|
||||||
|
c.gridx=0; c.gridy = xx;
|
||||||
|
c.fill = GridBagConstraints.BOTH;
|
||||||
|
jp.add(name,c);
|
||||||
|
|
||||||
|
} // end of if-else
|
||||||
|
JPanel nnn = new JPanel();
|
||||||
|
nnn.setLayout(new GridBagLayout());
|
||||||
|
nnn.setBorder(BorderFactory.createBevelBorder(0));
|
||||||
|
nnn.setBackground(new Color(250,255,200));
|
||||||
|
nnn.setOpaque(true);
|
||||||
|
|
||||||
|
PicPanel pp = new PicPanel(n.getKeys());
|
||||||
|
pp.setPreferredSize(new Dimension(n.getKeys().size()*32,HOEHE));
|
||||||
|
pp.setBackground(new Color(250,255,200));
|
||||||
|
|
||||||
|
JMyLabel nachricht = new JMyLabel(n,"");
|
||||||
|
if (n.getInhaltString().trim().length()>65) {
|
||||||
|
nachricht.setText("<html>"+n.getInhaltString().trim().substring(0,62)+"...</html>");
|
||||||
|
} else {
|
||||||
|
nachricht.setText("<html>"+n.getInhaltString().trim()+"</html>");
|
||||||
|
} // end of if-else
|
||||||
|
|
||||||
|
c.gridx=0; c.gridy = 0;
|
||||||
|
c.weightx=1.0; c.weighty= 0;
|
||||||
|
|
||||||
|
nnn.add(nachricht,c);
|
||||||
|
c.gridx=1; c.gridy = 0;
|
||||||
|
c.weightx=0.0; c.weighty= 0;
|
||||||
|
|
||||||
|
nnn.add(pp,c);
|
||||||
|
c.gridx=1; c.gridy = xx;
|
||||||
|
c.weightx = 1.0;
|
||||||
|
jp.add(nnn,c);
|
||||||
|
|
||||||
|
nnn = new JPanel();
|
||||||
|
nnn.setLayout(new GridBagLayout());
|
||||||
|
nnn.setBorder(BorderFactory.createBevelBorder(0));
|
||||||
|
nnn.setBackground(new Color(250,255,200));
|
||||||
|
nnn.setOpaque(true);
|
||||||
|
|
||||||
|
pp = new PicPanel(n.getHashKeys());
|
||||||
|
pp.setPreferredSize(new Dimension(n.getHashKeys().size()*32,HOEHE));
|
||||||
|
pp.setBackground(new Color(250,255,200));
|
||||||
|
|
||||||
|
String hc = new String(n.getHashCode());
|
||||||
|
if (hc.trim().length()>15) {
|
||||||
|
hc = hc.substring(0,15)+"...";
|
||||||
|
} //end of if-else
|
||||||
|
|
||||||
|
JMyLabel hash = new JMyLabel(n, hc);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
c.gridx=0; c.gridy = 0;
|
||||||
|
c.weightx=1.0; c.weighty= 0;
|
||||||
|
|
||||||
|
nnn.add(hash,c);
|
||||||
|
c.gridx=1; c.gridy = 0;
|
||||||
|
c.weightx=0.0; c.weighty= 0;
|
||||||
|
|
||||||
|
nnn.add(pp,c);
|
||||||
|
c.gridx=2; c.gridy = xx;
|
||||||
|
c.weightx = 0.0;
|
||||||
|
jp.add(nnn,c);
|
||||||
|
|
||||||
|
JPanel abspanel = new JPanel();
|
||||||
|
abspanel.setPreferredSize(new Dimension(150,HOEHE));
|
||||||
|
abspanel.setBorder(BorderFactory.createBevelBorder(0));
|
||||||
|
abspanel.setBackground(new Color(250,255,200));
|
||||||
|
abspanel.setOpaque(true);
|
||||||
|
abspanel.setLayout(new FlowLayout());
|
||||||
|
|
||||||
|
if (n.getEmpfaenger().equals("")) {
|
||||||
|
String[] stringlist = new String[100];
|
||||||
|
JComboBox cb = new JComboBox(kontakte.toArray(stringlist));
|
||||||
|
|
||||||
|
abspanel.add(cb);
|
||||||
|
|
||||||
|
ImageIcon water = new ImageIcon("arrow.png");
|
||||||
|
JMyButton button = new JMyButton(n, cb, water);
|
||||||
|
button.addActionListener(new ActionListener() {
|
||||||
|
public void actionPerformed(ActionEvent evt) {
|
||||||
|
jBSend_ActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
abspanel.add(button);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
abspanel.add(new JLabel("an "+n.getEmpfaenger()));
|
||||||
|
}
|
||||||
|
c.gridx=4; c.gridy = xx;
|
||||||
|
c.weightx = 0.0;
|
||||||
|
jp.add(abspanel,c);
|
||||||
|
xx++;
|
||||||
|
}
|
||||||
|
JPanel dummy = new JPanel();
|
||||||
|
dummy.setBorder(BorderFactory.createBevelBorder(0));
|
||||||
|
dummy.setLayout(null);
|
||||||
|
dummy.setBackground(new Color(250,255,200));
|
||||||
|
dummy.setOpaque(true);
|
||||||
|
dummy.setPreferredSize(new Dimension(150,HOEHE));
|
||||||
|
|
||||||
|
c.gridx=0; c.gridy = xx;
|
||||||
|
c.gridwidth=5;
|
||||||
|
c.fill = GridBagConstraints.BOTH;
|
||||||
|
c.weightx = 1.0;
|
||||||
|
c.weighty = 1.0;
|
||||||
|
jp.add(dummy,c);
|
||||||
|
|
||||||
|
jp.revalidate();
|
||||||
|
jp.repaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ChatClient_WindowClosing(WindowEvent evt) {
|
||||||
|
// TODO hier Quelltext einfügen
|
||||||
|
} // end of ChatClient_WindowClosing
|
||||||
|
|
||||||
|
// Ende Methoden
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
new ChatClient("ChatClient");
|
||||||
|
} // end of main
|
||||||
|
|
||||||
|
} // end of class ChatClient
|
||||||
|
|
||||||
419
Quellcodes/iud_key_rsachat/ChatClient.jfm
Normal file
|
|
@ -0,0 +1,419 @@
|
||||||
|
object ChatClient: TFGUIForm
|
||||||
|
Left = 0
|
||||||
|
Top = 0
|
||||||
|
BorderIcons = [biSystemMenu, biMinimize]
|
||||||
|
Caption = 'ChatClient'
|
||||||
|
ClientHeight = 644
|
||||||
|
ClientWidth = 1065
|
||||||
|
Color = clBtnFace
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -10
|
||||||
|
Font.Name = 'MS Sans Serif'
|
||||||
|
Font.Style = []
|
||||||
|
FormStyle = fsMDIChild
|
||||||
|
OldCreateOrder = True
|
||||||
|
Position = poDesigned
|
||||||
|
ShowHint = True
|
||||||
|
Visible = True
|
||||||
|
OnClose = FormClose
|
||||||
|
OnCloseQuery = FormCloseQuery
|
||||||
|
OnResize = FormResize
|
||||||
|
FrameType = 5
|
||||||
|
Resizable = False
|
||||||
|
Undecorated = False
|
||||||
|
Background = clBtnFace
|
||||||
|
windowClosing = 'ChatClient_WindowClosing'
|
||||||
|
PixelsPerInch = 96
|
||||||
|
TextHeight = 13
|
||||||
|
object jPanel1: TJPanel
|
||||||
|
Tag = 12
|
||||||
|
Left = 8
|
||||||
|
Top = 8
|
||||||
|
Width = 1041
|
||||||
|
Height = 41
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -12
|
||||||
|
Font.Name = 'Dialog'
|
||||||
|
Font.Style = [fsBold]
|
||||||
|
Foreground = 3355443
|
||||||
|
Background = clBtnFace
|
||||||
|
Border.BorderType = BevelBorder
|
||||||
|
Border.LineColor = clBlack
|
||||||
|
Border.LineThickness = 0
|
||||||
|
Border.LineRounded = False
|
||||||
|
Border.EtchHighlightColor = clBlack
|
||||||
|
Border.EtchShadowColor = clBlack
|
||||||
|
Border.Etchtype = 0
|
||||||
|
Border.BevelHighlightColor = clWhite
|
||||||
|
Border.BevelShadowColor = 4210752
|
||||||
|
Border.Beveltype = 1
|
||||||
|
Border.MatteColor = clBlack
|
||||||
|
Border.MatteTop = 0
|
||||||
|
Border.MatteLeft = 0
|
||||||
|
Border.MatteBottom = 0
|
||||||
|
Border.MatteRight = 0
|
||||||
|
object jLabel2: TJLabel
|
||||||
|
Tag = 1
|
||||||
|
Left = 264
|
||||||
|
Top = 11
|
||||||
|
Width = 62
|
||||||
|
Height = 20
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -12
|
||||||
|
Font.Name = 'Dialog'
|
||||||
|
Font.Style = [fsBold]
|
||||||
|
Foreground = 3355443
|
||||||
|
Background = clBtnFace
|
||||||
|
Text = 'Server'
|
||||||
|
HorizontalAlignment = LEFT
|
||||||
|
VerticalAlignment = CENTER
|
||||||
|
HorizontalTextPosition = RIGHT
|
||||||
|
VerticalTextPosition = CENTER
|
||||||
|
IconTextGap = 4
|
||||||
|
DisplayedMnemonic = 0
|
||||||
|
DisplayedMnemonicIndex = 0
|
||||||
|
end
|
||||||
|
object jTFName: TJTextField
|
||||||
|
Tag = 2
|
||||||
|
Left = 80
|
||||||
|
Top = 11
|
||||||
|
Width = 150
|
||||||
|
Height = 20
|
||||||
|
Cursor = crIBeam
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -12
|
||||||
|
Font.Name = 'Dialog'
|
||||||
|
Font.Style = []
|
||||||
|
Foreground = 3355443
|
||||||
|
Background = clWhite
|
||||||
|
HorizontalAlignment = LEFT
|
||||||
|
Text = 'anonymous'
|
||||||
|
Editable = True
|
||||||
|
end
|
||||||
|
object jTFAdress: TJTextField
|
||||||
|
Tag = 2
|
||||||
|
Left = 312
|
||||||
|
Top = 11
|
||||||
|
Width = 150
|
||||||
|
Height = 20
|
||||||
|
Cursor = crIBeam
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -12
|
||||||
|
Font.Name = 'Dialog'
|
||||||
|
Font.Style = []
|
||||||
|
Foreground = 3355443
|
||||||
|
Background = clWhite
|
||||||
|
HorizontalAlignment = LEFT
|
||||||
|
Text = 'localhost'
|
||||||
|
Editable = True
|
||||||
|
end
|
||||||
|
object jLabel3: TJLabel
|
||||||
|
Tag = 1
|
||||||
|
Left = 496
|
||||||
|
Top = 11
|
||||||
|
Width = 62
|
||||||
|
Height = 20
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -12
|
||||||
|
Font.Name = 'Dialog'
|
||||||
|
Font.Style = [fsBold]
|
||||||
|
Foreground = 3355443
|
||||||
|
Background = clBtnFace
|
||||||
|
Text = 'Port'
|
||||||
|
HorizontalAlignment = LEFT
|
||||||
|
VerticalAlignment = CENTER
|
||||||
|
HorizontalTextPosition = RIGHT
|
||||||
|
VerticalTextPosition = CENTER
|
||||||
|
IconTextGap = 4
|
||||||
|
DisplayedMnemonic = 0
|
||||||
|
DisplayedMnemonicIndex = 0
|
||||||
|
end
|
||||||
|
object jBVerbinden: TJButton
|
||||||
|
Tag = 4
|
||||||
|
Left = 936
|
||||||
|
Top = 8
|
||||||
|
Width = 99
|
||||||
|
Height = 25
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -12
|
||||||
|
Font.Name = 'Dialog'
|
||||||
|
Font.Style = [fsBold]
|
||||||
|
Foreground = 3355443
|
||||||
|
Background = 15658734
|
||||||
|
actionPerformed = 'jBVerbinden_ActionPerformed'
|
||||||
|
Text = 'Verbinden'
|
||||||
|
Mnemonic = 0
|
||||||
|
DisplayedMnemonicIndex = 0
|
||||||
|
Selected = False
|
||||||
|
BorderPainted = True
|
||||||
|
FocusPainted = False
|
||||||
|
ContentAreaFilled = True
|
||||||
|
HorizontalAlignment = CENTER
|
||||||
|
VerticalAlignment = CENTER
|
||||||
|
HorizontalTextPosition = RIGHT
|
||||||
|
VerticalTextPosition = CENTER
|
||||||
|
IconTextGap = 4
|
||||||
|
RolloverEnabled = False
|
||||||
|
Border.BorderType = NoBorder
|
||||||
|
Border.LineColor = clBlack
|
||||||
|
Border.LineThickness = 0
|
||||||
|
Border.LineRounded = False
|
||||||
|
Border.EtchHighlightColor = clBlack
|
||||||
|
Border.EtchShadowColor = clBlack
|
||||||
|
Border.Etchtype = 0
|
||||||
|
Border.BevelHighlightColor = clBlack
|
||||||
|
Border.BevelShadowColor = clBlack
|
||||||
|
Border.Beveltype = 0
|
||||||
|
Border.MatteColor = clBlack
|
||||||
|
Border.MatteTop = 0
|
||||||
|
Border.MatteLeft = 0
|
||||||
|
Border.MatteBottom = 0
|
||||||
|
Border.MatteRight = 0
|
||||||
|
end
|
||||||
|
object jLabel1: TJLabel
|
||||||
|
Tag = 1
|
||||||
|
Left = 8
|
||||||
|
Top = 12
|
||||||
|
Width = 62
|
||||||
|
Height = 18
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -12
|
||||||
|
Font.Name = 'Dialog'
|
||||||
|
Font.Style = [fsBold]
|
||||||
|
Foreground = 3355443
|
||||||
|
Background = clBtnFace
|
||||||
|
Text = 'Name'
|
||||||
|
HorizontalAlignment = LEFT
|
||||||
|
VerticalAlignment = CENTER
|
||||||
|
HorizontalTextPosition = RIGHT
|
||||||
|
VerticalTextPosition = CENTER
|
||||||
|
IconTextGap = 4
|
||||||
|
DisplayedMnemonic = 0
|
||||||
|
DisplayedMnemonicIndex = 0
|
||||||
|
end
|
||||||
|
object jNFPort: TJNumberField
|
||||||
|
Tag = 21
|
||||||
|
Left = 528
|
||||||
|
Top = 11
|
||||||
|
Width = 75
|
||||||
|
Height = 20
|
||||||
|
Cursor = crIBeam
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -12
|
||||||
|
Font.Name = 'Dialog'
|
||||||
|
Font.Style = []
|
||||||
|
Foreground = 3355443
|
||||||
|
Background = clWhite
|
||||||
|
HorizontalAlignment = LEFT
|
||||||
|
Text = '44444'
|
||||||
|
Editable = True
|
||||||
|
end
|
||||||
|
end
|
||||||
|
object jTFNachricht: TJTextField
|
||||||
|
Tag = 2
|
||||||
|
Left = 672
|
||||||
|
Top = 320
|
||||||
|
Width = 358
|
||||||
|
Height = 20
|
||||||
|
Cursor = crIBeam
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -12
|
||||||
|
Font.Name = 'Dialog'
|
||||||
|
Font.Style = []
|
||||||
|
Foreground = 3355443
|
||||||
|
Background = clWhite
|
||||||
|
actionPerformed = 'jTFNachricht_ActionPerformed'
|
||||||
|
HorizontalAlignment = LEFT
|
||||||
|
Editable = True
|
||||||
|
end
|
||||||
|
object jBSend: TJButton
|
||||||
|
Tag = 4
|
||||||
|
Left = 720
|
||||||
|
Top = 254
|
||||||
|
Width = 99
|
||||||
|
Height = 25
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -12
|
||||||
|
Font.Name = 'Dialog'
|
||||||
|
Font.Style = [fsBold]
|
||||||
|
Foreground = 3355443
|
||||||
|
Background = 15658734
|
||||||
|
actionPerformed = 'jBSend_ActionPerformed'
|
||||||
|
Text = 'Abschicken'
|
||||||
|
Mnemonic = 0
|
||||||
|
DisplayedMnemonicIndex = 0
|
||||||
|
Selected = False
|
||||||
|
BorderPainted = True
|
||||||
|
FocusPainted = False
|
||||||
|
ContentAreaFilled = True
|
||||||
|
HorizontalAlignment = CENTER
|
||||||
|
VerticalAlignment = CENTER
|
||||||
|
HorizontalTextPosition = RIGHT
|
||||||
|
VerticalTextPosition = CENTER
|
||||||
|
IconTextGap = 4
|
||||||
|
RolloverEnabled = False
|
||||||
|
Border.BorderType = NoBorder
|
||||||
|
Border.LineColor = clBlack
|
||||||
|
Border.LineThickness = 0
|
||||||
|
Border.LineRounded = False
|
||||||
|
Border.EtchHighlightColor = clBlack
|
||||||
|
Border.EtchShadowColor = clBlack
|
||||||
|
Border.Etchtype = 0
|
||||||
|
Border.BevelHighlightColor = clBlack
|
||||||
|
Border.BevelShadowColor = clBlack
|
||||||
|
Border.Beveltype = 0
|
||||||
|
Border.MatteColor = clBlack
|
||||||
|
Border.MatteTop = 0
|
||||||
|
Border.MatteLeft = 0
|
||||||
|
Border.MatteBottom = 0
|
||||||
|
Border.MatteRight = 0
|
||||||
|
end
|
||||||
|
object jLabel5: TJLabel
|
||||||
|
Tag = 1
|
||||||
|
Left = 8
|
||||||
|
Top = 64
|
||||||
|
Width = 62
|
||||||
|
Height = 20
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -12
|
||||||
|
Font.Name = 'Dialog'
|
||||||
|
Font.Style = [fsBold]
|
||||||
|
Foreground = 3355443
|
||||||
|
Background = clBtnFace
|
||||||
|
mouseClicked = 'jLabel5_MouseClicked'
|
||||||
|
Text = 'Schl'#252'ssel'
|
||||||
|
HorizontalAlignment = LEFT
|
||||||
|
VerticalAlignment = CENTER
|
||||||
|
HorizontalTextPosition = RIGHT
|
||||||
|
VerticalTextPosition = CENTER
|
||||||
|
IconTextGap = 4
|
||||||
|
DisplayedMnemonic = 0
|
||||||
|
DisplayedMnemonicIndex = 0
|
||||||
|
end
|
||||||
|
object jScrollPane1: TJScrollPane
|
||||||
|
Tag = 11
|
||||||
|
Left = 96
|
||||||
|
Top = 136
|
||||||
|
Width = 953
|
||||||
|
Height = 481
|
||||||
|
Hint = 'jScrollPane1'
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -12
|
||||||
|
Font.Name = 'Dialog'
|
||||||
|
Font.Style = [fsBold]
|
||||||
|
Foreground = 3355443
|
||||||
|
Background = 15658734
|
||||||
|
HorizontalScrollBarPolicy = AS_NEEDED
|
||||||
|
VerticalScrollBarPolicy = ALWAYS
|
||||||
|
Autoscrolls = False
|
||||||
|
WheelScrollingEnabled = True
|
||||||
|
Border.BorderType = NoBorder
|
||||||
|
Border.LineColor = clBlack
|
||||||
|
Border.LineThickness = 0
|
||||||
|
Border.LineRounded = False
|
||||||
|
Border.EtchHighlightColor = clBlack
|
||||||
|
Border.EtchShadowColor = clBlack
|
||||||
|
Border.Etchtype = 0
|
||||||
|
Border.BevelHighlightColor = clBlack
|
||||||
|
Border.BevelShadowColor = clBlack
|
||||||
|
Border.Beveltype = 0
|
||||||
|
Border.MatteColor = clBlack
|
||||||
|
Border.MatteTop = 0
|
||||||
|
Border.MatteLeft = 0
|
||||||
|
Border.MatteBottom = 0
|
||||||
|
Border.MatteRight = 0
|
||||||
|
end
|
||||||
|
object jScrollPane2: TJScrollPane
|
||||||
|
Tag = 11
|
||||||
|
Left = 96
|
||||||
|
Top = 64
|
||||||
|
Width = 953
|
||||||
|
Height = 57
|
||||||
|
Hint = 'jScrollPane2'
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -12
|
||||||
|
Font.Name = 'Dialog'
|
||||||
|
Font.Style = [fsBold]
|
||||||
|
Foreground = 3355443
|
||||||
|
Background = 15658734
|
||||||
|
HorizontalScrollBarPolicy = AS_NEEDED
|
||||||
|
VerticalScrollBarPolicy = AS_NEEDED
|
||||||
|
Autoscrolls = False
|
||||||
|
WheelScrollingEnabled = True
|
||||||
|
Border.BorderType = NoBorder
|
||||||
|
Border.LineColor = clBlack
|
||||||
|
Border.LineThickness = 0
|
||||||
|
Border.LineRounded = False
|
||||||
|
Border.EtchHighlightColor = clBlack
|
||||||
|
Border.EtchShadowColor = clBlack
|
||||||
|
Border.Etchtype = 0
|
||||||
|
Border.BevelHighlightColor = clBlack
|
||||||
|
Border.BevelShadowColor = clBlack
|
||||||
|
Border.Beveltype = 0
|
||||||
|
Border.MatteColor = clBlack
|
||||||
|
Border.MatteTop = 0
|
||||||
|
Border.MatteLeft = 0
|
||||||
|
Border.MatteBottom = 0
|
||||||
|
Border.MatteRight = 0
|
||||||
|
end
|
||||||
|
object jLabel4: TJLabel
|
||||||
|
Tag = 1
|
||||||
|
Left = 8
|
||||||
|
Top = 144
|
||||||
|
Width = 86
|
||||||
|
Height = 20
|
||||||
|
Hint = 'jLabel4'
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -12
|
||||||
|
Font.Name = 'Dialog'
|
||||||
|
Font.Style = [fsBold]
|
||||||
|
Foreground = 3355443
|
||||||
|
Background = clBtnFace
|
||||||
|
Text = 'Nachrichten'
|
||||||
|
HorizontalAlignment = LEFT
|
||||||
|
VerticalAlignment = CENTER
|
||||||
|
HorizontalTextPosition = RIGHT
|
||||||
|
VerticalTextPosition = CENTER
|
||||||
|
IconTextGap = 4
|
||||||
|
DisplayedMnemonic = 0
|
||||||
|
DisplayedMnemonicIndex = 0
|
||||||
|
end
|
||||||
|
object jLabel6: TJLabel
|
||||||
|
Tag = 1
|
||||||
|
Left = 816
|
||||||
|
Top = 624
|
||||||
|
Width = 229
|
||||||
|
Height = 20
|
||||||
|
Hint = 'jLabel3'
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -12
|
||||||
|
Font.Name = 'Dialog'
|
||||||
|
Font.Style = [fsBold]
|
||||||
|
Foreground = clGray
|
||||||
|
Background = clBtnFace
|
||||||
|
Text = '(cc) 2017, Thomas Schaller, Version 1.0'
|
||||||
|
HorizontalAlignment = LEFT
|
||||||
|
VerticalAlignment = CENTER
|
||||||
|
HorizontalTextPosition = RIGHT
|
||||||
|
VerticalTextPosition = CENTER
|
||||||
|
IconTextGap = 4
|
||||||
|
DisplayedMnemonic = 0
|
||||||
|
DisplayedMnemonicIndex = 0
|
||||||
|
end
|
||||||
|
end
|
||||||
BIN
Quellcodes/iud_key_rsachat/ChatServerGUI.jar
Normal file
262
Quellcodes/iud_key_rsachat/ChatServerGUI.java
Normal file
|
|
@ -0,0 +1,262 @@
|
||||||
|
import java.awt.*;
|
||||||
|
import java.awt.event.*;
|
||||||
|
import javax.swing.*;
|
||||||
|
import javax.swing.event.*;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Beschreibung
|
||||||
|
*
|
||||||
|
* @version 1.0 vom 26.05.2017
|
||||||
|
* @author
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class ChatServerGUI extends JFrame implements MyServerSocketListener {
|
||||||
|
// Anfang Attribute
|
||||||
|
private ArrayList<MySocket> clients;
|
||||||
|
private ArrayList<String> names;
|
||||||
|
private static boolean ende;
|
||||||
|
private MyServer server;
|
||||||
|
private JLabel jLabel1 = new JLabel();
|
||||||
|
private JButton jBStarten = new JButton();
|
||||||
|
private JNumberField jNFPort = new JNumberField();
|
||||||
|
private JList jList1 = new JList();
|
||||||
|
private DefaultListModel jList1Model = new DefaultListModel();
|
||||||
|
private JScrollPane jList1ScrollPane = new JScrollPane(jList1);
|
||||||
|
private JLabel jLabel2 = new JLabel();
|
||||||
|
private int changeClientListAktiv = 0;
|
||||||
|
private JLabel jLabel3 = new JLabel();
|
||||||
|
// Ende Attribute
|
||||||
|
|
||||||
|
public ChatServerGUI() {
|
||||||
|
// Frame-Initialisierung
|
||||||
|
super();
|
||||||
|
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
|
||||||
|
int frameWidth = 300;
|
||||||
|
int frameHeight = 311;
|
||||||
|
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);
|
||||||
|
setTitle("Chat-Server");
|
||||||
|
setResizable(false);
|
||||||
|
Container cp = getContentPane();
|
||||||
|
cp.setLayout(null);
|
||||||
|
// Anfang Komponenten
|
||||||
|
|
||||||
|
jLabel1.setBounds(8, 16, 110, 20);
|
||||||
|
jLabel1.setText("Portnummer");
|
||||||
|
cp.add(jLabel1);
|
||||||
|
jBStarten.setBounds(96, 48, 75, 25);
|
||||||
|
jBStarten.setText("Starten");
|
||||||
|
jBStarten.setMargin(new Insets(2, 2, 2, 2));
|
||||||
|
jBStarten.addActionListener(new ActionListener() {
|
||||||
|
public void actionPerformed(ActionEvent evt) {
|
||||||
|
jBStarten_ActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
cp.add(jBStarten);
|
||||||
|
jNFPort.setBounds(128, 16, 99, 20);
|
||||||
|
jNFPort.setText("44444");
|
||||||
|
cp.add(jNFPort);
|
||||||
|
jList1.setModel(jList1Model);
|
||||||
|
jList1ScrollPane.setBounds(8, 112, 265, 137);
|
||||||
|
cp.add(jList1ScrollPane);
|
||||||
|
jLabel2.setBounds(8, 88, 110, 20);
|
||||||
|
jLabel2.setText("Chatteilnehmer");
|
||||||
|
cp.add(jLabel2);
|
||||||
|
addWindowListener(new WindowAdapter() {
|
||||||
|
public void windowClosing(WindowEvent evt) {
|
||||||
|
ChatServerGUI_WindowClosing(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
jLabel3.setBounds(24, 248, 229, 20);
|
||||||
|
jLabel3.setText("(cc) 2017, Thomas Schaller, Version 1.0");
|
||||||
|
jLabel3.setForeground(Color.GRAY);
|
||||||
|
cp.add(jLabel3);
|
||||||
|
// Ende Komponenten
|
||||||
|
|
||||||
|
setVisible(true);
|
||||||
|
|
||||||
|
clients = new ArrayList<MySocket>();
|
||||||
|
names = new ArrayList<String>();
|
||||||
|
server = null;
|
||||||
|
|
||||||
|
} // end of public ChatServerGUI
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Anfang Methoden
|
||||||
|
|
||||||
|
public void neuerClient(MySocket client) {
|
||||||
|
for (String n : names) {
|
||||||
|
if (!n.equals("ManInTheMiddle")) {
|
||||||
|
client.sendeNachricht("user:"+n);
|
||||||
|
} // end of if
|
||||||
|
} // end of for
|
||||||
|
this.clients.add(client);
|
||||||
|
// System.out.println("Habe Kontakt mit "+client.getSocket().getInetAddress()+" Port "+client.getSocket().getPort());
|
||||||
|
this.names.add("?");
|
||||||
|
// changeClientList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void changeClientList() {
|
||||||
|
changeClientListAktiv++;
|
||||||
|
if (changeClientListAktiv == 1) {
|
||||||
|
do{
|
||||||
|
changeClientListAktiv--;
|
||||||
|
DefaultListModel newListModel = new DefaultListModel();
|
||||||
|
System.out.println("lm: "+jList1Model.size());
|
||||||
|
System.out.println("Clients: "+clients.size());
|
||||||
|
for (int i = 0; i < clients.size() ; i++ ) {
|
||||||
|
MySocket s = clients.get(i);
|
||||||
|
String n = names.get(i);
|
||||||
|
newListModel.addElement(n+"("+s.getSocket().getInetAddress()+":"+s.getSocket().getPort()+")");
|
||||||
|
System.out.println(n+"("+s.getSocket().getInetAddress()+":"+s.getSocket().getPort()+")");
|
||||||
|
System.out.println("lm: "+jList1Model.size());
|
||||||
|
} // end of for
|
||||||
|
jList1.setModel(newListModel);
|
||||||
|
jList1.validate();
|
||||||
|
}
|
||||||
|
while (changeClientListAktiv > 0 );
|
||||||
|
} // end of if
|
||||||
|
}
|
||||||
|
|
||||||
|
public void nachrichtEmpfangen(MySocket client) {
|
||||||
|
String s = client.holeNachricht();
|
||||||
|
System.out.println("Habe Nachricht empfangen:"+s);
|
||||||
|
String[] ss = s.split(":");
|
||||||
|
int i = clients.indexOf(client);
|
||||||
|
|
||||||
|
if (ss[0].equals("exit")) {
|
||||||
|
s = s+names.get(i);
|
||||||
|
clients.remove(i);
|
||||||
|
names.remove(i);
|
||||||
|
client.trenneVerbindung();
|
||||||
|
for (int j=0; j<clients.size(); j++) {
|
||||||
|
MySocket c = clients.get(j);
|
||||||
|
if (c!=client) {
|
||||||
|
c.sendeNachricht(s);
|
||||||
|
} // end of if
|
||||||
|
}
|
||||||
|
changeClientList();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ss[0].equals("user")) {
|
||||||
|
names.set(i,ss[1]);
|
||||||
|
for (int j=0; j<clients.size(); j++) {
|
||||||
|
MySocket c = clients.get(j);
|
||||||
|
if (c!=client) {
|
||||||
|
c.sendeNachricht(s);
|
||||||
|
} // end of if
|
||||||
|
}
|
||||||
|
changeClientList();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (ss[0].equals("mitm")) {
|
||||||
|
names.set(i,"ManInTheMiddle");
|
||||||
|
changeClientList();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ss[0].equals("mess")) {
|
||||||
|
int nextMitM=-1;
|
||||||
|
int start=0;
|
||||||
|
if (names.get(i).equals("ManInTheMiddle")) {
|
||||||
|
start = i+1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int j=start;j<clients.size() ;j++ ) {
|
||||||
|
if (names.get(j).equals("ManInTheMiddle")) {
|
||||||
|
nextMitM = j;
|
||||||
|
break;
|
||||||
|
|
||||||
|
} // end of if
|
||||||
|
} // end of for
|
||||||
|
if (nextMitM!=-1) {
|
||||||
|
MySocket c = clients.get(nextMitM);
|
||||||
|
c.sendeNachricht(s);
|
||||||
|
} else {
|
||||||
|
for (int j=0; j<clients.size(); j++) {
|
||||||
|
MySocket c = clients.get(j);
|
||||||
|
if (!ss[1].equals(names.get(j)) && (ss[2].equals("alle") || ss[2].equals(names.get(j))) && !names.get(j).equals("ManInTheMiddle")) {
|
||||||
|
c.sendeNachricht(s);
|
||||||
|
} // end of if
|
||||||
|
}
|
||||||
|
} // end of if-else
|
||||||
|
|
||||||
|
} // end of if
|
||||||
|
} // end of if
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public void verbindungBeendet(MySocket client) {
|
||||||
|
if (clients.contains(client)) {
|
||||||
|
|
||||||
|
int i = clients.indexOf(client);
|
||||||
|
|
||||||
|
clients.remove(i);
|
||||||
|
System.out.println("Verbindung mit "+client.getSocket().getInetAddress()+" Port: "+client.getSocket().getPort()+" verloren.");
|
||||||
|
for (MySocket c: clients) {
|
||||||
|
if (c!=client) {
|
||||||
|
c.sendeNachricht(("exit:"+names.get(i)+":alle"));
|
||||||
|
} // end of if
|
||||||
|
}
|
||||||
|
names.remove(i);
|
||||||
|
changeClientList();
|
||||||
|
} // end of if
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* public static void main (String[] args) {
|
||||||
|
new ChatServer(44444);
|
||||||
|
|
||||||
|
ende = false;
|
||||||
|
while (!ende) {
|
||||||
|
try{
|
||||||
|
|
||||||
|
Thread.sleep(100);
|
||||||
|
}
|
||||||
|
catch(Exception e) {
|
||||||
|
System.out.println("Error");
|
||||||
|
}
|
||||||
|
} // end of while
|
||||||
|
}
|
||||||
|
|
||||||
|
// Anfang Methoden
|
||||||
|
*/
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
new ChatServerGUI();
|
||||||
|
} // end of main
|
||||||
|
|
||||||
|
public void jBStarten_ActionPerformed(ActionEvent evt) {
|
||||||
|
if (jBStarten.getText().equals("Starten")) {
|
||||||
|
server = new MyServer(this, this.jNFPort.getInt());
|
||||||
|
server.starten();
|
||||||
|
jBStarten.setText("Stoppen");
|
||||||
|
jNFPort.setEnabled(false);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
server.stoppen();
|
||||||
|
server = null;
|
||||||
|
jBStarten.setText("Starten");
|
||||||
|
jNFPort.setEnabled(true);
|
||||||
|
} // end of if-else
|
||||||
|
} // end of jBStarten_ActionPerformed
|
||||||
|
|
||||||
|
public void ChatServerGUI_WindowClosing(WindowEvent evt) {
|
||||||
|
if (server != null) server.stoppen();
|
||||||
|
} // end of ChatServerGUI_WindowClosing
|
||||||
|
|
||||||
|
// Ende Methoden
|
||||||
|
} // end of class ChatServerGUI
|
||||||
|
|
||||||
188
Quellcodes/iud_key_rsachat/ChatServerGUI.jfm
Normal file
|
|
@ -0,0 +1,188 @@
|
||||||
|
object ChatServerGUI: TFGUIForm
|
||||||
|
Left = 0
|
||||||
|
Top = 0
|
||||||
|
BorderIcons = [biSystemMenu]
|
||||||
|
Caption = 'Chat-Server'
|
||||||
|
ClientHeight = 272
|
||||||
|
ClientWidth = 284
|
||||||
|
Color = clBtnFace
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -10
|
||||||
|
Font.Name = 'MS Sans Serif'
|
||||||
|
Font.Style = []
|
||||||
|
FormStyle = fsMDIChild
|
||||||
|
OldCreateOrder = True
|
||||||
|
Position = poDesigned
|
||||||
|
ShowHint = True
|
||||||
|
Visible = True
|
||||||
|
OnClose = FormClose
|
||||||
|
OnCloseQuery = FormCloseQuery
|
||||||
|
OnResize = FormResize
|
||||||
|
FrameType = 5
|
||||||
|
Resizable = False
|
||||||
|
Undecorated = False
|
||||||
|
Background = clBtnFace
|
||||||
|
windowClosing = 'ChatServerGUI_WindowClosing'
|
||||||
|
PixelsPerInch = 96
|
||||||
|
TextHeight = 13
|
||||||
|
object jLabel1: TJLabel
|
||||||
|
Tag = 1
|
||||||
|
Left = 8
|
||||||
|
Top = 16
|
||||||
|
Width = 110
|
||||||
|
Height = 20
|
||||||
|
Hint = 'jLabel1'
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -12
|
||||||
|
Font.Name = 'Dialog'
|
||||||
|
Font.Style = [fsBold]
|
||||||
|
Foreground = 3355443
|
||||||
|
Background = clBtnFace
|
||||||
|
Text = 'Portnummer'
|
||||||
|
HorizontalAlignment = LEFT
|
||||||
|
VerticalAlignment = CENTER
|
||||||
|
HorizontalTextPosition = RIGHT
|
||||||
|
VerticalTextPosition = CENTER
|
||||||
|
IconTextGap = 4
|
||||||
|
DisplayedMnemonic = 0
|
||||||
|
DisplayedMnemonicIndex = 0
|
||||||
|
end
|
||||||
|
object jBStarten: TJButton
|
||||||
|
Tag = 4
|
||||||
|
Left = 96
|
||||||
|
Top = 48
|
||||||
|
Width = 75
|
||||||
|
Height = 25
|
||||||
|
Hint = 'jButton1'
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -12
|
||||||
|
Font.Name = 'Dialog'
|
||||||
|
Font.Style = [fsBold]
|
||||||
|
Foreground = 3355443
|
||||||
|
Background = 15658734
|
||||||
|
actionPerformed = 'jBStarten_ActionPerformed'
|
||||||
|
Text = 'Starten'
|
||||||
|
Mnemonic = 0
|
||||||
|
DisplayedMnemonicIndex = 0
|
||||||
|
Selected = False
|
||||||
|
BorderPainted = True
|
||||||
|
FocusPainted = False
|
||||||
|
ContentAreaFilled = True
|
||||||
|
HorizontalAlignment = CENTER
|
||||||
|
VerticalAlignment = CENTER
|
||||||
|
HorizontalTextPosition = RIGHT
|
||||||
|
VerticalTextPosition = CENTER
|
||||||
|
IconTextGap = 4
|
||||||
|
RolloverEnabled = False
|
||||||
|
Border.BorderType = NoBorder
|
||||||
|
Border.LineColor = clBlack
|
||||||
|
Border.LineThickness = 0
|
||||||
|
Border.LineRounded = False
|
||||||
|
Border.EtchHighlightColor = clBlack
|
||||||
|
Border.EtchShadowColor = clBlack
|
||||||
|
Border.Etchtype = 0
|
||||||
|
Border.BevelHighlightColor = clBlack
|
||||||
|
Border.BevelShadowColor = clBlack
|
||||||
|
Border.Beveltype = 0
|
||||||
|
Border.MatteColor = clBlack
|
||||||
|
Border.MatteTop = 0
|
||||||
|
Border.MatteLeft = 0
|
||||||
|
Border.MatteBottom = 0
|
||||||
|
Border.MatteRight = 0
|
||||||
|
end
|
||||||
|
object jNFPort: TJNumberField
|
||||||
|
Tag = 21
|
||||||
|
Left = 128
|
||||||
|
Top = 16
|
||||||
|
Width = 99
|
||||||
|
Height = 20
|
||||||
|
Cursor = crIBeam
|
||||||
|
Hint = 'jNumberField1'
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -12
|
||||||
|
Font.Name = 'Dialog'
|
||||||
|
Font.Style = []
|
||||||
|
Foreground = 3355443
|
||||||
|
Background = clWhite
|
||||||
|
HorizontalAlignment = LEFT
|
||||||
|
Text = '44444'
|
||||||
|
Editable = True
|
||||||
|
end
|
||||||
|
object jList1: TJList
|
||||||
|
Tag = 8
|
||||||
|
Left = 8
|
||||||
|
Top = 112
|
||||||
|
Width = 265
|
||||||
|
Height = 137
|
||||||
|
Hint = 'jList1'
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -12
|
||||||
|
Font.Name = 'Dialog'
|
||||||
|
Font.Style = [fsBold]
|
||||||
|
Foreground = 3355443
|
||||||
|
Background = clWhite
|
||||||
|
SelectionMode = MULTIPLE_INTERVAL
|
||||||
|
FixedCellHeight = -1
|
||||||
|
FixedCellWidth = -1
|
||||||
|
LayoutOrientation = VERTICAL
|
||||||
|
SelectionBackground = 15060920
|
||||||
|
SelectionForeground = 3355443
|
||||||
|
VisibleRowCount = 8
|
||||||
|
HorizontalScrollBarPolicy = AS_NEEDED
|
||||||
|
VerticalScrollBarPolicy = AS_NEEDED
|
||||||
|
SelectedIndex = -1
|
||||||
|
Items.Strings = (
|
||||||
|
'')
|
||||||
|
end
|
||||||
|
object jLabel2: TJLabel
|
||||||
|
Tag = 1
|
||||||
|
Left = 8
|
||||||
|
Top = 88
|
||||||
|
Width = 110
|
||||||
|
Height = 20
|
||||||
|
Hint = 'jLabel2'
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -12
|
||||||
|
Font.Name = 'Dialog'
|
||||||
|
Font.Style = [fsBold]
|
||||||
|
Foreground = 3355443
|
||||||
|
Background = clBtnFace
|
||||||
|
Text = 'Chatteilnehmer'
|
||||||
|
HorizontalAlignment = LEFT
|
||||||
|
VerticalAlignment = CENTER
|
||||||
|
HorizontalTextPosition = RIGHT
|
||||||
|
VerticalTextPosition = CENTER
|
||||||
|
IconTextGap = 4
|
||||||
|
DisplayedMnemonic = 0
|
||||||
|
DisplayedMnemonicIndex = 0
|
||||||
|
end
|
||||||
|
object jLabel3: TJLabel
|
||||||
|
Tag = 1
|
||||||
|
Left = 24
|
||||||
|
Top = 248
|
||||||
|
Width = 229
|
||||||
|
Height = 20
|
||||||
|
Hint = 'jLabel3'
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -12
|
||||||
|
Font.Name = 'Dialog'
|
||||||
|
Font.Style = [fsBold]
|
||||||
|
Foreground = clGray
|
||||||
|
Background = clBtnFace
|
||||||
|
Text = '(cc) 2017, Thomas Schaller, Version 1.0'
|
||||||
|
HorizontalAlignment = LEFT
|
||||||
|
VerticalAlignment = CENTER
|
||||||
|
HorizontalTextPosition = RIGHT
|
||||||
|
VerticalTextPosition = CENTER
|
||||||
|
IconTextGap = 4
|
||||||
|
DisplayedMnemonic = 0
|
||||||
|
DisplayedMnemonicIndex = 0
|
||||||
|
end
|
||||||
|
end
|
||||||
BIN
Quellcodes/iud_key_rsachat/JEClasses.jar
Normal file
38
Quellcodes/iud_key_rsachat/JMyButton.java
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Beschreibung
|
||||||
|
*
|
||||||
|
* @version 1.0 vom 25.01.2016
|
||||||
|
* @author
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.awt.event.*;
|
||||||
|
import javax.swing.*;
|
||||||
|
import javax.swing.event.*;
|
||||||
|
import java.util.*;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
|
||||||
|
public class JMyButton extends JButton {
|
||||||
|
|
||||||
|
// Anfang Attribute
|
||||||
|
private Nachricht nachricht;
|
||||||
|
private JComboBox empfaenger;
|
||||||
|
// Ende Attribute
|
||||||
|
|
||||||
|
public JMyButton(Nachricht nachricht, JComboBox cb, ImageIcon ii) {
|
||||||
|
super(ii);
|
||||||
|
this.nachricht = nachricht;
|
||||||
|
this.empfaenger = cb;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Anfang Methoden
|
||||||
|
public Nachricht getNachricht() {
|
||||||
|
return nachricht;
|
||||||
|
}
|
||||||
|
|
||||||
|
public JComboBox getEmpfaenger() {
|
||||||
|
|
||||||
|
return empfaenger;
|
||||||
|
}// Ende Methoden
|
||||||
|
} // end of JMyLabel
|
||||||
35
Quellcodes/iud_key_rsachat/JMyLabel.java
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Beschreibung
|
||||||
|
*
|
||||||
|
* @version 1.0 vom 25.01.2016
|
||||||
|
* @author
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.awt.event.*;
|
||||||
|
import javax.swing.*;
|
||||||
|
import javax.swing.event.*;
|
||||||
|
import java.util.*;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
|
||||||
|
public class JMyLabel extends JLabel {
|
||||||
|
|
||||||
|
// Anfang Attribute
|
||||||
|
private Nachricht nachricht;
|
||||||
|
|
||||||
|
// Ende Attribute
|
||||||
|
|
||||||
|
public JMyLabel(Nachricht nachricht, String s) {
|
||||||
|
super();
|
||||||
|
this.setText(s);
|
||||||
|
this.nachricht = nachricht;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Anfang Methoden
|
||||||
|
public Nachricht getNachricht() {
|
||||||
|
return nachricht;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // end of JMyLabel
|
||||||
193
Quellcodes/iud_key_rsachat/Key.java
Normal file
|
|
@ -0,0 +1,193 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* description
|
||||||
|
*
|
||||||
|
* @version 1.0 from 15.01.2016
|
||||||
|
* @author
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.math.BigInteger;
|
||||||
|
import java.util.Random;
|
||||||
|
import java.awt.Graphics;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URL;
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
|
import javax.swing.*;
|
||||||
|
import java.util.*;
|
||||||
|
import java.awt.FontMetrics;
|
||||||
|
|
||||||
|
public class Key {
|
||||||
|
|
||||||
|
// Anfang Attribute
|
||||||
|
private String name;
|
||||||
|
private BigInteger n;
|
||||||
|
private BigInteger e;
|
||||||
|
private int BLOCKSIZE;
|
||||||
|
private BufferedImage image;
|
||||||
|
private String filename;
|
||||||
|
private byte[] hashCode;
|
||||||
|
// Ende Attribute
|
||||||
|
|
||||||
|
public Key(String name, BigInteger e, BigInteger n) {
|
||||||
|
this.name = name;
|
||||||
|
this.n = n;
|
||||||
|
this.e = e;
|
||||||
|
this.image = image;
|
||||||
|
this.hashCode = null;
|
||||||
|
calcBlocksize();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Anfang Methoden
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigInteger getN() {
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigInteger getE() {
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setImage(String filename) {
|
||||||
|
URL pic_url = this.getClass().getClassLoader().getResource(filename+".png"); //kein Slash vor dem Unterordner!
|
||||||
|
this.filename = filename;
|
||||||
|
//Bild laden mit ImageIO
|
||||||
|
try {
|
||||||
|
image = ImageIO.read(pic_url);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFilename() {
|
||||||
|
return filename;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BufferedImage getImage() {
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
|
private BigInteger convert(String text) {
|
||||||
|
BigInteger i = BigInteger.valueOf(0);
|
||||||
|
for(int j =0; j < text.length(); j++) {
|
||||||
|
i = i.multiply(BigInteger.valueOf(256));
|
||||||
|
i = i.add(BigInteger.valueOf((int) text.charAt(j)));
|
||||||
|
} // end of while
|
||||||
|
// System.out.println(text+" in "+i.toString()+" umgewandelt.");
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigInteger convert(byte[] text) {
|
||||||
|
BigInteger i = BigInteger.valueOf(0);
|
||||||
|
for(int j =text.length-1; j >=0; j--) {
|
||||||
|
i = i.multiply(BigInteger.valueOf(256));
|
||||||
|
int unsingedByte = ((int)text[j]) & 0xFF;
|
||||||
|
// System.out.println(""+unsingedByte+" ");
|
||||||
|
i = i.add(BigInteger.valueOf(unsingedByte));
|
||||||
|
} // end of while
|
||||||
|
// System.out.println("");
|
||||||
|
// System.out.println(new String(text)+" in "+i.toString()+" umgewandelt.");
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* private String convert(BigInteger i) {
|
||||||
|
String text = "";
|
||||||
|
int j = 0;
|
||||||
|
while (text.length()<BLOCKSIZE) {
|
||||||
|
j = i.mod(BigInteger.valueOf(256)).intValue();
|
||||||
|
i = i.divide(BigInteger.valueOf(256));
|
||||||
|
text = (char) j+text;
|
||||||
|
} // end of while
|
||||||
|
//System.out.println(i.toString()+" in "+text+" umgewandelt.");
|
||||||
|
return text;
|
||||||
|
} */
|
||||||
|
|
||||||
|
public byte[] convert(BigInteger i) {
|
||||||
|
byte[] text = new byte[BLOCKSIZE];
|
||||||
|
int j = 0;
|
||||||
|
int x = 0;
|
||||||
|
while (!i.equals(BigInteger.ZERO)) {
|
||||||
|
j = i.mod(BigInteger.valueOf(256)).intValue();
|
||||||
|
i = i.divide(BigInteger.valueOf(256));
|
||||||
|
text[x] = (byte) j;
|
||||||
|
x++;
|
||||||
|
} // end of while
|
||||||
|
//System.out.println(i.toString()+" in "+text+" umgewandelt.");
|
||||||
|
byte[] a3 = new byte[x];
|
||||||
|
System.arraycopy(text, 0, a3, 0, x);
|
||||||
|
return a3;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int calcBlocksize() {
|
||||||
|
BigInteger bs = BigInteger.valueOf(1);
|
||||||
|
int size = 1;
|
||||||
|
while (bs.compareTo(n)<0) {
|
||||||
|
bs = bs.multiply(BigInteger.valueOf(256));
|
||||||
|
size++;
|
||||||
|
}
|
||||||
|
BLOCKSIZE = size-1;
|
||||||
|
//System.out.println(size-1);
|
||||||
|
return BLOCKSIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String encrypt(String text) {
|
||||||
|
String kr = "";
|
||||||
|
BigInteger i;
|
||||||
|
i = convert(text);
|
||||||
|
i = i.modPow(e, n);
|
||||||
|
//System.out.println(i);
|
||||||
|
kr = kr+ convert(i);
|
||||||
|
return kr;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigInteger encrypt(BigInteger i) {
|
||||||
|
i = i.modPow(e, n);
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] encrypt(byte[] text) {
|
||||||
|
byte[] kr;
|
||||||
|
BigInteger i;
|
||||||
|
i = convert(text);
|
||||||
|
i = i.modPow(e, n);
|
||||||
|
// System.out.println(i);
|
||||||
|
kr = convert(i);
|
||||||
|
return kr;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString(String name) {
|
||||||
|
return "Key:Name="+name+",E="+getE()+",N="+getN();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void sign(Key k, String name) {
|
||||||
|
Nachricht dummy = new Nachricht("dummy","dummy",toString(name));
|
||||||
|
dummy.generateHash();
|
||||||
|
byte[] b = dummy.getHashCode();
|
||||||
|
hashCode = k.encrypt(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSigned() {
|
||||||
|
return hashCode!=null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] getHashCode() {
|
||||||
|
return hashCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Ende Methoden
|
||||||
|
|
||||||
|
}
|
||||||
94
Quellcodes/iud_key_rsachat/KeyPopup.java
Normal file
|
|
@ -0,0 +1,94 @@
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
import java.awt.event.MouseEvent;
|
||||||
|
|
||||||
|
import javax.swing.JFrame;
|
||||||
|
import javax.swing.JMenu;
|
||||||
|
import javax.swing.JMenuItem;
|
||||||
|
import javax.swing.JPopupMenu;
|
||||||
|
import javax.swing.JOptionPane;
|
||||||
|
|
||||||
|
public class KeyPopup extends JPopupMenu implements ActionListener {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
JMenuItem bmi, ami, emi, kmi, dmi1, dmi2, dmi3, vmi;
|
||||||
|
ChatClient cc;
|
||||||
|
Key k;
|
||||||
|
|
||||||
|
public KeyPopup( MouseEvent event, ChatClient cc, Key k){
|
||||||
|
this.cc = cc;
|
||||||
|
this.k = k;
|
||||||
|
// Submenu
|
||||||
|
|
||||||
|
dmi1 = new JMenuItem("Schlüsselpaar (50bit) erzeugen");
|
||||||
|
dmi1.addActionListener(this);
|
||||||
|
add(dmi1);
|
||||||
|
dmi2 = new JMenuItem("Schlüsselpaar (512bit) erzeugen");
|
||||||
|
dmi2.addActionListener(this);
|
||||||
|
add(dmi2);
|
||||||
|
dmi3 = new JMenuItem("Schlüsselpaar (1024bit) erzeugen");
|
||||||
|
dmi3.addActionListener(this);
|
||||||
|
add(dmi3);
|
||||||
|
addSeparator();
|
||||||
|
if (k != null) {
|
||||||
|
vmi = new JMenuItem("Schlüssel-Name-Paar zertifizieren");
|
||||||
|
vmi.addActionListener(this);
|
||||||
|
add(vmi);
|
||||||
|
|
||||||
|
} // end of if
|
||||||
|
bmi = new JMenuItem("Öffentlichen Schlüssel der Zertifizierungsstelle anzeigen");
|
||||||
|
bmi.addActionListener(this);
|
||||||
|
add(bmi);
|
||||||
|
addSeparator();
|
||||||
|
if (k!=null) {
|
||||||
|
ami = new JMenuItem("Schlüssel löschen");
|
||||||
|
ami.addActionListener(this);
|
||||||
|
add(ami);
|
||||||
|
|
||||||
|
} // end of if
|
||||||
|
/*
|
||||||
|
kmi = new JMenuItem("Schlüssel selbst eingeben");
|
||||||
|
kmi.addActionListener(this);
|
||||||
|
add(kmi);
|
||||||
|
*/
|
||||||
|
show(event.getComponent(), event.getX(), event.getY());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
|
||||||
|
|
||||||
|
if (e.getSource() == dmi1) {
|
||||||
|
cc.generateKeyPair(50);
|
||||||
|
}
|
||||||
|
if (e.getSource() == dmi2) {
|
||||||
|
cc.generateKeyPair(512);
|
||||||
|
}
|
||||||
|
if (e.getSource() == dmi3) {
|
||||||
|
cc.generateKeyPair(1024);
|
||||||
|
}
|
||||||
|
if (e.getSource()== bmi) {
|
||||||
|
cc.showPublicZertKey();
|
||||||
|
|
||||||
|
} // end of if
|
||||||
|
if (e.getSource() == vmi) {
|
||||||
|
JOptionPane.showMessageDialog(this,
|
||||||
|
"Gehen Sie bitte mit Ihrem Schlüssel zur Zertifizierungsstelle.\nSind Sie angekommen?",
|
||||||
|
"Zertifizierung",
|
||||||
|
JOptionPane.INFORMATION_MESSAGE);
|
||||||
|
JOptionPane.showMessageDialog(this,
|
||||||
|
"Geben Sie dort bitte Ihren Schlüssel ab und weisen Sie sich als "+cc.jTFName.getText()+" aus.\nHaben Sie sich ausgewiesen?",
|
||||||
|
"Zertifizierung",
|
||||||
|
JOptionPane.INFORMATION_MESSAGE);
|
||||||
|
JOptionPane.showMessageDialog(this,
|
||||||
|
"Sie erhalten jetzt von der Zertifizierungsstelle Ihren mit "+cc.jTFName.getText()+" zertifizierten Schlüssel.\nMöchten Sie diesen in Ihrem Chat-Client importieren?",
|
||||||
|
"Zertifizierung",
|
||||||
|
JOptionPane.INFORMATION_MESSAGE);
|
||||||
|
cc.signKey(k);
|
||||||
|
} // end of if
|
||||||
|
|
||||||
|
if (e.getSource() == ami) {
|
||||||
|
cc.deleteKey(k);
|
||||||
|
} // end of if
|
||||||
|
}
|
||||||
|
}
|
||||||
5
Quellcodes/iud_key_rsachat/META-INF/MANIFEST.MF
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
Manifest-Version: 1.0
|
||||||
|
Class-Path: JEClasses.jar jdom-1.1.3.jar
|
||||||
|
Created-By: 1.8.0_111 (Oracle Corporation)
|
||||||
|
Main-Class: ManInTheMiddle
|
||||||
|
|
||||||
BIN
Quellcodes/iud_key_rsachat/ManInTheMiddle.jar
Normal file
355
Quellcodes/iud_key_rsachat/ManInTheMiddle.java
Normal file
|
|
@ -0,0 +1,355 @@
|
||||||
|
import java.awt.*;
|
||||||
|
import java.awt.event.*;
|
||||||
|
import javax.swing.*;
|
||||||
|
import javax.swing.event.*;
|
||||||
|
import java.util.*;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.math.BigInteger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Beschreibung
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @version 1.1 vom 30.01.2020
|
||||||
|
* @author Thomas Schaller
|
||||||
|
* Version 1.1: Hash-Funkion ausgetauscht, damit Hashes unterschiedlicher, Ö/P-Schlüssel in der gleichen Farbe
|
||||||
|
*/
|
||||||
|
import java.util.Timer;
|
||||||
|
|
||||||
|
public class ManInTheMiddle extends ChatClient implements MySocketListener {
|
||||||
|
// Anfang Attribute
|
||||||
|
|
||||||
|
// Ende Attribute
|
||||||
|
|
||||||
|
public ManInTheMiddle(String title) {
|
||||||
|
// Frame-Initialisierung
|
||||||
|
super(title);
|
||||||
|
jTFName.setText("ManInTheMiddle");
|
||||||
|
jTFName.setEnabled(false);
|
||||||
|
Timer timer = new Timer();
|
||||||
|
timer.scheduleAtFixedRate(new TimerTask() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
updateTimes();
|
||||||
|
}
|
||||||
|
}, 1000, 1000);
|
||||||
|
} // end of public ManInTheMiddle
|
||||||
|
|
||||||
|
// Anfang Methoden
|
||||||
|
public void jBVerbinden_ActionPerformed(ActionEvent evt) {
|
||||||
|
String a = jTFAdress.getText();
|
||||||
|
int p = jNFPort.getInt();
|
||||||
|
if (client != null && client.isAktiv()) {
|
||||||
|
jTFAdress.setEnabled(true);
|
||||||
|
jNFPort.setEnabled(true);
|
||||||
|
jBVerbinden.setText("Verbinden");
|
||||||
|
client.trenneVerbindung();
|
||||||
|
} else {
|
||||||
|
client = new MySocket(a, p, this);
|
||||||
|
if (client.isAktiv()) {
|
||||||
|
jTFAdress.setEnabled(false);
|
||||||
|
jNFPort.setEnabled(false);
|
||||||
|
jBVerbinden.setText("Trennen");
|
||||||
|
client.sendeNachricht("mitm:");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // end of if-else
|
||||||
|
|
||||||
|
} // end of jBVerbinden_ActionPerformed
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public void jBSend_ActionPerformed(ActionEvent evt) {
|
||||||
|
if (client != null && client.isAktiv()) {
|
||||||
|
JMyButton button = (JMyButton) evt.getSource();
|
||||||
|
if (button.getEmpfaenger()!=null) {
|
||||||
|
button.getNachricht().setEmpfaenger((String) button.getEmpfaenger().getSelectedItem());
|
||||||
|
} // end of if
|
||||||
|
sendMessage(button.getNachricht());
|
||||||
|
this.updateNachrichtenListe();
|
||||||
|
|
||||||
|
} else {
|
||||||
|
jTFAdress.setEnabled(true);
|
||||||
|
jNFPort.setEnabled(true);
|
||||||
|
jBVerbinden.setEnabled(true);
|
||||||
|
} // end of if
|
||||||
|
} // end of jBSend_ActionPerformed
|
||||||
|
|
||||||
|
private void sendMessage(Nachricht n) {
|
||||||
|
String b = "mess:"+n.getAbsender()+":"+n.getEmpfaenger()+":"+Base64.encode(n.getInhalt())+":"+Base64.encode(n.getHashCode());
|
||||||
|
n.setStopped(false);
|
||||||
|
n.setSended(true);
|
||||||
|
client.sendeNachricht(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void nachrichtEmpfangen(MySocket client) {
|
||||||
|
String s = client.holeNachricht();
|
||||||
|
String[] ss = s.split(":");
|
||||||
|
|
||||||
|
if (ss[0].equals("user")) {
|
||||||
|
kontakte.add(ss[1]);
|
||||||
|
Nachricht n = new Nachricht("Server","alle","Neuer User: "+ss[1]);
|
||||||
|
n.setSended(true);
|
||||||
|
nachrichten.add(0,n);
|
||||||
|
this.updateNachrichtenListe();
|
||||||
|
|
||||||
|
}
|
||||||
|
if(ss[0].equals("mess")) {
|
||||||
|
String hash;
|
||||||
|
if (ss.length==5) {
|
||||||
|
hash = ss[4];
|
||||||
|
} else {
|
||||||
|
hash = "";
|
||||||
|
}// end of if
|
||||||
|
Nachricht n = new Nachricht(ss[1],ss[2],Base64.decode(ss[3]),Base64.decode(hash));
|
||||||
|
nachrichten.add(0,n);
|
||||||
|
this.updateNachrichtenListe();
|
||||||
|
|
||||||
|
} // end of if String s = client.holeNachricht();
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void makeMessagePopup(MouseEvent evt, Nachricht n) {
|
||||||
|
new MessagePopup2(evt, this, n, keys);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void verbindungBeendet(MySocket client) {
|
||||||
|
jTFAdress.setEnabled(true);
|
||||||
|
jNFPort.setEnabled(true);
|
||||||
|
jBVerbinden.setText("Verbinden");
|
||||||
|
client = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void jBStopped_ActionPerformed(ActionEvent evt) {
|
||||||
|
JMyButton button = (JMyButton) evt.getSource();
|
||||||
|
Nachricht n = button.getNachricht();
|
||||||
|
n.setStopped(true);
|
||||||
|
} // end of jBSend_ActionPerformed
|
||||||
|
|
||||||
|
|
||||||
|
public void updateTimes() {
|
||||||
|
int i=0;
|
||||||
|
Component[] c = jp.getComponents();
|
||||||
|
int cnr = 0;
|
||||||
|
for (Nachricht n: nachrichten ) {
|
||||||
|
if (n.getRestzeit()>0) {
|
||||||
|
GridBagConstraints c2 = gbl.getConstraints(c[cnr]);
|
||||||
|
while (cnr < c.length-1 && (c2.gridx != 4 || c2.gridy!=i+1)) {
|
||||||
|
cnr++;
|
||||||
|
c2 = gbl.getConstraints(c[cnr]);
|
||||||
|
|
||||||
|
} // end of while
|
||||||
|
JPanel p = (JPanel) (c[cnr]);
|
||||||
|
if (p.getComponents()[1] instanceof JLabel) {
|
||||||
|
JLabel l = (JLabel) (p.getComponents()[1]);
|
||||||
|
l.setText(""+n.getRestzeit()+" sek");
|
||||||
|
|
||||||
|
} // end of if
|
||||||
|
} else {
|
||||||
|
if (!n.getSended() && !n.getStopped() && !n.getEmpfaenger().equals("")) {
|
||||||
|
sendMessage(n);
|
||||||
|
updateNachrichtenListe();
|
||||||
|
break;
|
||||||
|
}// end of if-else// end of if
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
} // end of for
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateNachrichtenListe() {
|
||||||
|
|
||||||
|
GridBagConstraints c = new GridBagConstraints();
|
||||||
|
while (jp.getComponentCount()>1) {
|
||||||
|
jp.remove(1);
|
||||||
|
} // end of while
|
||||||
|
//jp.removeAll();
|
||||||
|
|
||||||
|
if (jp.getComponentCount()==0) {
|
||||||
|
JPanel eingabe = new JPanel();
|
||||||
|
eingabe.setBorder(BorderFactory.createBevelBorder(0));
|
||||||
|
eingabe.setLayout(null);
|
||||||
|
eingabe.setBackground(new Color(250,255,200));
|
||||||
|
eingabe.setOpaque(true);
|
||||||
|
eingabe.setPreferredSize(new Dimension(150,60));
|
||||||
|
|
||||||
|
c.gridx=0; c.gridy = 0;
|
||||||
|
c.gridwidth=5;
|
||||||
|
c.fill = GridBagConstraints.BOTH;
|
||||||
|
c.weightx = 1.0;
|
||||||
|
jTFNachricht.setBounds(100,20,800,20);
|
||||||
|
JLabel nn = new JLabel();
|
||||||
|
nn.setText("Neue Nachricht");
|
||||||
|
nn.setBounds(2,20,90,20);
|
||||||
|
eingabe.add(nn);
|
||||||
|
eingabe.add(jTFNachricht);
|
||||||
|
jp.add(eingabe,c);
|
||||||
|
}
|
||||||
|
c.weightx=0;
|
||||||
|
c.gridwidth=1;
|
||||||
|
int xx = 1;
|
||||||
|
JLabel name = null;
|
||||||
|
for (Nachricht n : nachrichten) {
|
||||||
|
|
||||||
|
if (n.getKeys().size()>0 && name != null) {
|
||||||
|
GridBagConstraints c2 = gbl.getConstraints(name);
|
||||||
|
c2.gridheight++;
|
||||||
|
gbl.setConstraints(name,c2);
|
||||||
|
} else {
|
||||||
|
name = new JLabel();
|
||||||
|
name.setText("<html>Von "+n.getAbsender()+"</html>");
|
||||||
|
name.setBorder(BorderFactory.createBevelBorder(0));
|
||||||
|
name.setBackground(new Color(250,255,200));
|
||||||
|
name.setOpaque(true);
|
||||||
|
c.gridx=0; c.gridy = xx;
|
||||||
|
c.fill = GridBagConstraints.BOTH;
|
||||||
|
jp.add(name,c);
|
||||||
|
|
||||||
|
} // end of if-else
|
||||||
|
JPanel nnn = new JPanel();
|
||||||
|
nnn.setLayout(new GridBagLayout());
|
||||||
|
nnn.setBorder(BorderFactory.createBevelBorder(0));
|
||||||
|
nnn.setBackground(new Color(250,255,200));
|
||||||
|
nnn.setOpaque(true);
|
||||||
|
|
||||||
|
PicPanel pp = new PicPanel(n.getKeys());
|
||||||
|
pp.setPreferredSize(new Dimension(n.getKeys().size()*32,60));
|
||||||
|
pp.setBackground(new Color(250,255,200));
|
||||||
|
|
||||||
|
JMyLabel nachricht = new JMyLabel(n,"");
|
||||||
|
if (n.getInhaltString().trim().length()>65) {
|
||||||
|
nachricht.setText("<html>"+n.getInhaltString().trim().substring(0,62)+"...</html>");
|
||||||
|
} else {
|
||||||
|
nachricht.setText("<html>"+n.getInhaltString().trim()+"</html>");
|
||||||
|
} // end of if-else
|
||||||
|
|
||||||
|
c.gridx=0; c.gridy = 0;
|
||||||
|
c.weightx=1.0; c.weighty= 0;
|
||||||
|
|
||||||
|
nnn.add(nachricht,c);
|
||||||
|
c.gridx=1; c.gridy = 0;
|
||||||
|
c.weightx=0.0; c.weighty= 0;
|
||||||
|
|
||||||
|
nnn.add(pp,c);
|
||||||
|
c.gridx=1; c.gridy = xx;
|
||||||
|
c.weightx = 1.0;
|
||||||
|
jp.add(nnn,c);
|
||||||
|
|
||||||
|
nnn = new JPanel();
|
||||||
|
nnn.setLayout(new GridBagLayout());
|
||||||
|
nnn.setBorder(BorderFactory.createBevelBorder(0));
|
||||||
|
nnn.setBackground(new Color(250,255,200));
|
||||||
|
nnn.setOpaque(true);
|
||||||
|
|
||||||
|
pp = new PicPanel(n.getHashKeys());
|
||||||
|
pp.setPreferredSize(new Dimension(n.getHashKeys().size()*32,60));
|
||||||
|
pp.setBackground(new Color(250,255,200));
|
||||||
|
|
||||||
|
String hc = new String(n.getHashCode());
|
||||||
|
if (hc.trim().length()>15) {
|
||||||
|
hc = hc.substring(0,15)+"...";
|
||||||
|
} //end of if-else
|
||||||
|
|
||||||
|
JMyLabel hash = new JMyLabel(n, hc);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
c.gridx=0; c.gridy = 0;
|
||||||
|
c.weightx=1.0; c.weighty= 0;
|
||||||
|
|
||||||
|
nnn.add(hash,c);
|
||||||
|
c.gridx=1; c.gridy = 0;
|
||||||
|
c.weightx=0.0; c.weighty= 0;
|
||||||
|
|
||||||
|
nnn.add(pp,c);
|
||||||
|
c.gridx=2; c.gridy = xx;
|
||||||
|
c.weightx = 0.0;
|
||||||
|
jp.add(nnn,c);
|
||||||
|
|
||||||
|
JPanel abspanel = new JPanel();
|
||||||
|
abspanel.setPreferredSize(new Dimension(150,40));
|
||||||
|
abspanel.setBorder(BorderFactory.createBevelBorder(0));
|
||||||
|
abspanel.setBackground(new Color(250,255,200));
|
||||||
|
abspanel.setOpaque(true);
|
||||||
|
abspanel.setLayout(new FlowLayout());
|
||||||
|
|
||||||
|
if (n.getEmpfaenger().equals("") && n.getSended()==false ) {
|
||||||
|
String[] stringlist = new String[100];
|
||||||
|
JComboBox cb = new JComboBox(kontakte.toArray(stringlist));
|
||||||
|
|
||||||
|
abspanel.add(cb);
|
||||||
|
|
||||||
|
ImageIcon water = new ImageIcon("arrow.png");
|
||||||
|
JMyButton button = new JMyButton(n, cb, water);
|
||||||
|
button.addActionListener(new ActionListener() {
|
||||||
|
public void actionPerformed(ActionEvent evt) {
|
||||||
|
jBSend_ActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
abspanel.add(button);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
abspanel.add(new JLabel("an "+n.getEmpfaenger()));
|
||||||
|
if (n.getStopped() && n.getSended()==false) {
|
||||||
|
ImageIcon water = new ImageIcon("arrow.png");
|
||||||
|
JMyButton button = new JMyButton(n,null,water);
|
||||||
|
button.addActionListener(new ActionListener() {
|
||||||
|
public void actionPerformed(ActionEvent evt) {
|
||||||
|
jBSend_ActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
abspanel.add(button);
|
||||||
|
|
||||||
|
|
||||||
|
} else {
|
||||||
|
if (n.getRestzeit()>0) {
|
||||||
|
abspanel.add(new JLabel(" "+n.getRestzeit()+" sek"));
|
||||||
|
ImageIcon water = new ImageIcon("stop.png");
|
||||||
|
JMyButton button = new JMyButton(n,null,water);
|
||||||
|
button.addActionListener(new ActionListener() {
|
||||||
|
public void actionPerformed(ActionEvent evt) {
|
||||||
|
jBStopped_ActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
abspanel.add(button);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // end of if
|
||||||
|
}
|
||||||
|
}
|
||||||
|
c.gridx=4; c.gridy = xx;
|
||||||
|
c.weightx = 0.0;
|
||||||
|
jp.add(abspanel,c);
|
||||||
|
xx++;
|
||||||
|
}
|
||||||
|
JPanel dummy = new JPanel();
|
||||||
|
dummy.setBorder(BorderFactory.createBevelBorder(0));
|
||||||
|
dummy.setLayout(null);
|
||||||
|
dummy.setBackground(new Color(250,255,200));
|
||||||
|
dummy.setOpaque(true);
|
||||||
|
dummy.setPreferredSize(new Dimension(150,60));
|
||||||
|
|
||||||
|
c.gridx=0; c.gridy = xx;
|
||||||
|
c.gridwidth=5;
|
||||||
|
c.fill = GridBagConstraints.BOTH;
|
||||||
|
c.weightx = 1.0;
|
||||||
|
c.weighty = 1.0;
|
||||||
|
jp.add(dummy,c);
|
||||||
|
|
||||||
|
jp.revalidate();
|
||||||
|
jp.repaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ende Methoden
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
new ManInTheMiddle("ManInTheMiddle");
|
||||||
|
} // end of main
|
||||||
|
|
||||||
|
} // end of class ManInTheMiddle
|
||||||
|
|
||||||
355
Quellcodes/iud_key_rsachat/ManInTheMiddle.jfm
Normal file
|
|
@ -0,0 +1,355 @@
|
||||||
|
object chatClient: TFGUIForm
|
||||||
|
Left = 332
|
||||||
|
Top = 16
|
||||||
|
BorderIcons = [biSystemMenu, biMinimize]
|
||||||
|
Caption = 'I:\PublicKey\PublicKey\ManInTheMiddle.jfm'
|
||||||
|
ClientHeight = 626
|
||||||
|
ClientWidth = 1065
|
||||||
|
Color = clBtnFace
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -10
|
||||||
|
Font.Name = 'MS Sans Serif'
|
||||||
|
Font.Style = []
|
||||||
|
FormStyle = fsMDIChild
|
||||||
|
OldCreateOrder = True
|
||||||
|
Position = poDesigned
|
||||||
|
ShowHint = True
|
||||||
|
Visible = True
|
||||||
|
OnClose = FormClose
|
||||||
|
OnCloseQuery = FormCloseQuery
|
||||||
|
OnResize = FormResize
|
||||||
|
FrameType = 5
|
||||||
|
Resizable = False
|
||||||
|
Undecorated = False
|
||||||
|
Background = clBtnFace
|
||||||
|
PixelsPerInch = 96
|
||||||
|
TextHeight = 13
|
||||||
|
object jPanel1: TJPanel
|
||||||
|
Tag = 12
|
||||||
|
Left = 8
|
||||||
|
Top = 8
|
||||||
|
Width = 1041
|
||||||
|
Height = 41
|
||||||
|
Foreground = 3355443
|
||||||
|
Background = clBtnFace
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -12
|
||||||
|
Font.Name = 'Dialog'
|
||||||
|
Font.Style = [fsBold]
|
||||||
|
Border.BorderType = BevelBorder
|
||||||
|
Border.LineColor = clBlack
|
||||||
|
Border.LineThickness = 0
|
||||||
|
Border.LineRounded = False
|
||||||
|
Border.EtchHighlightColor = clBlack
|
||||||
|
Border.EtchShadowColor = clBlack
|
||||||
|
Border.Etchtype = 0
|
||||||
|
Border.BevelHighlightColor = clWhite
|
||||||
|
Border.BevelShadowColor = 4210752
|
||||||
|
Border.Beveltype = 1
|
||||||
|
Border.MatteColor = clBlack
|
||||||
|
Border.MatteTop = 0
|
||||||
|
Border.MatteLeft = 0
|
||||||
|
Border.MatteBottom = 0
|
||||||
|
Border.MatteRight = 0
|
||||||
|
object jLabel2: TJLabel
|
||||||
|
Tag = 1
|
||||||
|
Left = 8
|
||||||
|
Top = 11
|
||||||
|
Width = 62
|
||||||
|
Height = 20
|
||||||
|
Foreground = 3355443
|
||||||
|
Background = clBtnFace
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -12
|
||||||
|
Font.Name = 'Dialog'
|
||||||
|
Font.Style = [fsBold]
|
||||||
|
Text = 'Server'
|
||||||
|
HorizontalAlignment = LEFT
|
||||||
|
VerticalAlignment = CENTER
|
||||||
|
HorizontalTextPosition = RIGHT
|
||||||
|
VerticalTextPosition = CENTER
|
||||||
|
IconTextGap = 4
|
||||||
|
DisplayedMnemonic = 0
|
||||||
|
DisplayedMnemonicIndex = 0
|
||||||
|
end
|
||||||
|
object jTFAdress: TJTextField
|
||||||
|
Tag = 2
|
||||||
|
Left = 56
|
||||||
|
Top = 11
|
||||||
|
Width = 150
|
||||||
|
Height = 20
|
||||||
|
Cursor = crIBeam
|
||||||
|
Foreground = 3355443
|
||||||
|
Background = clWhite
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -12
|
||||||
|
Font.Name = 'Dialog'
|
||||||
|
Font.Style = []
|
||||||
|
HorizontalAlignment = LEFT
|
||||||
|
Text = 'localhost'
|
||||||
|
Editable = True
|
||||||
|
end
|
||||||
|
object jLabel3: TJLabel
|
||||||
|
Tag = 1
|
||||||
|
Left = 232
|
||||||
|
Top = 11
|
||||||
|
Width = 62
|
||||||
|
Height = 20
|
||||||
|
Foreground = 3355443
|
||||||
|
Background = clBtnFace
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -12
|
||||||
|
Font.Name = 'Dialog'
|
||||||
|
Font.Style = [fsBold]
|
||||||
|
Text = 'Port'
|
||||||
|
HorizontalAlignment = LEFT
|
||||||
|
VerticalAlignment = CENTER
|
||||||
|
HorizontalTextPosition = RIGHT
|
||||||
|
VerticalTextPosition = CENTER
|
||||||
|
IconTextGap = 4
|
||||||
|
DisplayedMnemonic = 0
|
||||||
|
DisplayedMnemonicIndex = 0
|
||||||
|
end
|
||||||
|
object jBVerbinden: TJButton
|
||||||
|
Tag = 4
|
||||||
|
Left = 936
|
||||||
|
Top = 8
|
||||||
|
Width = 99
|
||||||
|
Height = 25
|
||||||
|
Foreground = 3355443
|
||||||
|
Background = 15658734
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -12
|
||||||
|
Font.Name = 'Dialog'
|
||||||
|
Font.Style = [fsBold]
|
||||||
|
actionPerformed = 'jBVerbinden_ActionPerformed'
|
||||||
|
Text = 'Verbinden'
|
||||||
|
Mnemonic = 0
|
||||||
|
DisplayedMnemonicIndex = 0
|
||||||
|
Selected = False
|
||||||
|
BorderPainted = True
|
||||||
|
FocusPainted = False
|
||||||
|
ContentAreaFilled = True
|
||||||
|
HorizontalAlignment = CENTER
|
||||||
|
VerticalAlignment = CENTER
|
||||||
|
HorizontalTextPosition = RIGHT
|
||||||
|
VerticalTextPosition = CENTER
|
||||||
|
IconTextGap = 4
|
||||||
|
RolloverEnabled = False
|
||||||
|
Border.BorderType = NoBorder
|
||||||
|
Border.LineColor = clBlack
|
||||||
|
Border.LineThickness = 0
|
||||||
|
Border.LineRounded = False
|
||||||
|
Border.EtchHighlightColor = clBlack
|
||||||
|
Border.EtchShadowColor = clBlack
|
||||||
|
Border.Etchtype = 0
|
||||||
|
Border.BevelHighlightColor = clBlack
|
||||||
|
Border.BevelShadowColor = clBlack
|
||||||
|
Border.Beveltype = 0
|
||||||
|
Border.MatteColor = clBlack
|
||||||
|
Border.MatteTop = 0
|
||||||
|
Border.MatteLeft = 0
|
||||||
|
Border.MatteBottom = 0
|
||||||
|
Border.MatteRight = 0
|
||||||
|
end
|
||||||
|
object jNFPort: TJNumberField
|
||||||
|
Tag = 21
|
||||||
|
Left = 272
|
||||||
|
Top = 11
|
||||||
|
Width = 75
|
||||||
|
Height = 20
|
||||||
|
Cursor = crIBeam
|
||||||
|
Foreground = 3355443
|
||||||
|
Background = clWhite
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -12
|
||||||
|
Font.Name = 'Dialog'
|
||||||
|
Font.Style = []
|
||||||
|
HorizontalAlignment = LEFT
|
||||||
|
Text = '44444'
|
||||||
|
Editable = True
|
||||||
|
end
|
||||||
|
end
|
||||||
|
object jTFNachricht: TJTextField
|
||||||
|
Tag = 2
|
||||||
|
Left = 672
|
||||||
|
Top = 320
|
||||||
|
Width = 358
|
||||||
|
Height = 20
|
||||||
|
Cursor = crIBeam
|
||||||
|
Foreground = 3355443
|
||||||
|
Background = clWhite
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -12
|
||||||
|
Font.Name = 'Dialog'
|
||||||
|
Font.Style = []
|
||||||
|
actionPerformed = 'jTFNachricht_ActionPerformed'
|
||||||
|
HorizontalAlignment = LEFT
|
||||||
|
Editable = True
|
||||||
|
end
|
||||||
|
object jBSend: TJButton
|
||||||
|
Tag = 4
|
||||||
|
Left = 720
|
||||||
|
Top = 254
|
||||||
|
Width = 99
|
||||||
|
Height = 25
|
||||||
|
Foreground = 3355443
|
||||||
|
Background = 15658734
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -12
|
||||||
|
Font.Name = 'Dialog'
|
||||||
|
Font.Style = [fsBold]
|
||||||
|
actionPerformed = 'jBSend_ActionPerformed'
|
||||||
|
Text = 'Abschicken'
|
||||||
|
Mnemonic = 0
|
||||||
|
DisplayedMnemonicIndex = 0
|
||||||
|
Selected = False
|
||||||
|
BorderPainted = True
|
||||||
|
FocusPainted = False
|
||||||
|
ContentAreaFilled = True
|
||||||
|
HorizontalAlignment = CENTER
|
||||||
|
VerticalAlignment = CENTER
|
||||||
|
HorizontalTextPosition = RIGHT
|
||||||
|
VerticalTextPosition = CENTER
|
||||||
|
IconTextGap = 4
|
||||||
|
RolloverEnabled = False
|
||||||
|
Border.BorderType = NoBorder
|
||||||
|
Border.LineColor = clBlack
|
||||||
|
Border.LineThickness = 0
|
||||||
|
Border.LineRounded = False
|
||||||
|
Border.EtchHighlightColor = clBlack
|
||||||
|
Border.EtchShadowColor = clBlack
|
||||||
|
Border.Etchtype = 0
|
||||||
|
Border.BevelHighlightColor = clBlack
|
||||||
|
Border.BevelShadowColor = clBlack
|
||||||
|
Border.Beveltype = 0
|
||||||
|
Border.MatteColor = clBlack
|
||||||
|
Border.MatteTop = 0
|
||||||
|
Border.MatteLeft = 0
|
||||||
|
Border.MatteBottom = 0
|
||||||
|
Border.MatteRight = 0
|
||||||
|
end
|
||||||
|
object jLabel5: TJLabel
|
||||||
|
Tag = 1
|
||||||
|
Left = 8
|
||||||
|
Top = 64
|
||||||
|
Width = 62
|
||||||
|
Height = 20
|
||||||
|
Foreground = 3355443
|
||||||
|
Background = clBtnFace
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -12
|
||||||
|
Font.Name = 'Dialog'
|
||||||
|
Font.Style = [fsBold]
|
||||||
|
mouseClicked = 'jLabel5_MouseClicked'
|
||||||
|
Text = 'Schl'#252'ssel'
|
||||||
|
HorizontalAlignment = LEFT
|
||||||
|
VerticalAlignment = CENTER
|
||||||
|
HorizontalTextPosition = RIGHT
|
||||||
|
VerticalTextPosition = CENTER
|
||||||
|
IconTextGap = 4
|
||||||
|
DisplayedMnemonic = 0
|
||||||
|
DisplayedMnemonicIndex = 0
|
||||||
|
end
|
||||||
|
object jScrollPane1: TJScrollPane
|
||||||
|
Tag = 11
|
||||||
|
Left = 96
|
||||||
|
Top = 136
|
||||||
|
Width = 953
|
||||||
|
Height = 481
|
||||||
|
Hint = 'jScrollPane1'
|
||||||
|
Foreground = 3355443
|
||||||
|
Background = 15658734
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -12
|
||||||
|
Font.Name = 'Dialog'
|
||||||
|
Font.Style = [fsBold]
|
||||||
|
HorizontalScrollBarPolicy = AS_NEEDED
|
||||||
|
VerticalScrollBarPolicy = ALWAYS
|
||||||
|
Autoscrolls = False
|
||||||
|
WheelScrollingEnabled = True
|
||||||
|
Border.BorderType = NoBorder
|
||||||
|
Border.LineColor = clBlack
|
||||||
|
Border.LineThickness = 0
|
||||||
|
Border.LineRounded = False
|
||||||
|
Border.EtchHighlightColor = clBlack
|
||||||
|
Border.EtchShadowColor = clBlack
|
||||||
|
Border.Etchtype = 0
|
||||||
|
Border.BevelHighlightColor = clBlack
|
||||||
|
Border.BevelShadowColor = clBlack
|
||||||
|
Border.Beveltype = 0
|
||||||
|
Border.MatteColor = clBlack
|
||||||
|
Border.MatteTop = 0
|
||||||
|
Border.MatteLeft = 0
|
||||||
|
Border.MatteBottom = 0
|
||||||
|
Border.MatteRight = 0
|
||||||
|
end
|
||||||
|
object jScrollPane2: TJScrollPane
|
||||||
|
Tag = 11
|
||||||
|
Left = 96
|
||||||
|
Top = 64
|
||||||
|
Width = 953
|
||||||
|
Height = 57
|
||||||
|
Hint = 'jScrollPane2'
|
||||||
|
Foreground = 3355443
|
||||||
|
Background = 15658734
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -12
|
||||||
|
Font.Name = 'Dialog'
|
||||||
|
Font.Style = [fsBold]
|
||||||
|
HorizontalScrollBarPolicy = AS_NEEDED
|
||||||
|
VerticalScrollBarPolicy = AS_NEEDED
|
||||||
|
Autoscrolls = False
|
||||||
|
WheelScrollingEnabled = True
|
||||||
|
Border.BorderType = NoBorder
|
||||||
|
Border.LineColor = clBlack
|
||||||
|
Border.LineThickness = 0
|
||||||
|
Border.LineRounded = False
|
||||||
|
Border.EtchHighlightColor = clBlack
|
||||||
|
Border.EtchShadowColor = clBlack
|
||||||
|
Border.Etchtype = 0
|
||||||
|
Border.BevelHighlightColor = clBlack
|
||||||
|
Border.BevelShadowColor = clBlack
|
||||||
|
Border.Beveltype = 0
|
||||||
|
Border.MatteColor = clBlack
|
||||||
|
Border.MatteTop = 0
|
||||||
|
Border.MatteLeft = 0
|
||||||
|
Border.MatteBottom = 0
|
||||||
|
Border.MatteRight = 0
|
||||||
|
end
|
||||||
|
object jLabel4: TJLabel
|
||||||
|
Tag = 1
|
||||||
|
Left = 8
|
||||||
|
Top = 144
|
||||||
|
Width = 86
|
||||||
|
Height = 20
|
||||||
|
Hint = 'jLabel4'
|
||||||
|
Foreground = 3355443
|
||||||
|
Background = clBtnFace
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -12
|
||||||
|
Font.Name = 'Dialog'
|
||||||
|
Font.Style = [fsBold]
|
||||||
|
Text = 'Nachrichten'
|
||||||
|
HorizontalAlignment = LEFT
|
||||||
|
VerticalAlignment = CENTER
|
||||||
|
HorizontalTextPosition = RIGHT
|
||||||
|
VerticalTextPosition = CENTER
|
||||||
|
IconTextGap = 4
|
||||||
|
DisplayedMnemonic = 0
|
||||||
|
DisplayedMnemonicIndex = 0
|
||||||
|
end
|
||||||
|
end
|
||||||
59
Quellcodes/iud_key_rsachat/MessagePopup.java
Normal file
|
|
@ -0,0 +1,59 @@
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
import java.awt.event.MouseEvent;
|
||||||
|
|
||||||
|
import javax.swing.JFrame;
|
||||||
|
import javax.swing.JMenu;
|
||||||
|
import javax.swing.JMenuItem;
|
||||||
|
import javax.swing.JPopupMenu;
|
||||||
|
import javax.swing.*;
|
||||||
|
|
||||||
|
public class MessagePopup extends JPopupMenu implements ActionListener {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
JMenuItem bmi, ami, emi, kmi, dmi1, dmi2, dmi3, vmi;
|
||||||
|
ChatClient cc;
|
||||||
|
Nachricht n;
|
||||||
|
|
||||||
|
public MessagePopup( MouseEvent event, ChatClient cc, Nachricht n){
|
||||||
|
this.cc = cc;
|
||||||
|
this.n = n;
|
||||||
|
// Submenu
|
||||||
|
|
||||||
|
dmi1 = new JMenuItem("Hashcode berechnen");
|
||||||
|
dmi1.addActionListener(this);
|
||||||
|
add(dmi1);
|
||||||
|
dmi2 = new JMenuItem("Hashcode prüfen");
|
||||||
|
dmi2.addActionListener(this);
|
||||||
|
add(dmi2);
|
||||||
|
show(event.getComponent(), event.getX(), event.getY());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
|
||||||
|
|
||||||
|
if (e.getSource() == dmi1) {
|
||||||
|
n.generateHash();
|
||||||
|
cc.updateNachrichtenListe();
|
||||||
|
}
|
||||||
|
if (e.getSource() == dmi2) {
|
||||||
|
Nachricht dummy = new Nachricht("dummy","dummy",n.getInhaltString());
|
||||||
|
dummy.generateHash();
|
||||||
|
String ha2 = new String(dummy.getHashCode());
|
||||||
|
String ha = new String(n.getHashCode());
|
||||||
|
System.out.println(ha2+","+ha);
|
||||||
|
if(ha.equals(ha2)) {
|
||||||
|
JOptionPane.showMessageDialog(this,
|
||||||
|
"Der Hashcode der Nachricht stimmt mit dem übermittelten Hashcode überein",
|
||||||
|
"Bestätigung",
|
||||||
|
JOptionPane.INFORMATION_MESSAGE);
|
||||||
|
} else {
|
||||||
|
JOptionPane.showMessageDialog(this,
|
||||||
|
"Der Hashcode der Nachricht passt nicht zum übermittelten Hashcode.",
|
||||||
|
"Fehler",
|
||||||
|
JOptionPane.ERROR_MESSAGE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
128
Quellcodes/iud_key_rsachat/MessagePopup2.java
Normal file
|
|
@ -0,0 +1,128 @@
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
import java.awt.event.MouseEvent;
|
||||||
|
import java.awt.Dimension;
|
||||||
|
|
||||||
|
import javax.swing.JFrame;
|
||||||
|
import javax.swing.JMenu;
|
||||||
|
import javax.swing.JMenuItem;
|
||||||
|
import javax.swing.JPopupMenu;
|
||||||
|
import javax.swing.*;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
public class MessagePopup2 extends JPopupMenu implements ActionListener {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
JMenuItem bmi, ami, emi, kmi, dmi1, dmi2, dmi3, vmi;
|
||||||
|
ChatClient cc;
|
||||||
|
Nachricht n;
|
||||||
|
ArrayList<Key> keys;
|
||||||
|
|
||||||
|
public MessagePopup2( MouseEvent event, ChatClient cc, Nachricht n, ArrayList<Key> keys){
|
||||||
|
this.cc = cc;
|
||||||
|
this.n = n;
|
||||||
|
this.keys = keys;
|
||||||
|
|
||||||
|
// Submenu
|
||||||
|
if (!n.getSended() && n.getInhaltString().startsWith("Key:")) {
|
||||||
|
ami = new JMenuItem("Schlüssel austauschen");
|
||||||
|
ami.addActionListener(this);
|
||||||
|
add(ami);
|
||||||
|
} // end of if
|
||||||
|
if (!n.getSended()) {
|
||||||
|
emi = new JMenuItem("Nachricht verändern");
|
||||||
|
emi.addActionListener(this);
|
||||||
|
add(emi);
|
||||||
|
|
||||||
|
this.addSeparator();
|
||||||
|
|
||||||
|
} // end of if
|
||||||
|
dmi1 = new JMenuItem("Hashcode berechnen");
|
||||||
|
dmi1.addActionListener(this);
|
||||||
|
add(dmi1);
|
||||||
|
dmi2 = new JMenuItem("Hashcode prüfen");
|
||||||
|
dmi2.addActionListener(this);
|
||||||
|
add(dmi2);
|
||||||
|
show(event.getComponent(), event.getX(), event.getY());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
|
||||||
|
if (e.getSource() == ami && !n.getSended()) {
|
||||||
|
n.setStopped(true);
|
||||||
|
|
||||||
|
JComboBox cb = new JComboBox();
|
||||||
|
for(Key k: keys) {
|
||||||
|
cb.addItem(k.getName());
|
||||||
|
} // end of for
|
||||||
|
|
||||||
|
|
||||||
|
Object[] message = {"Wähle den Schlüssel, der eingesetzt werden soll.", cb};
|
||||||
|
|
||||||
|
JOptionPane pane = new JOptionPane( message,
|
||||||
|
JOptionPane.PLAIN_MESSAGE,
|
||||||
|
JOptionPane.OK_CANCEL_OPTION);
|
||||||
|
pane.createDialog(null, "Nachricht manipulieren").setVisible(true);
|
||||||
|
|
||||||
|
int value = ((Integer)pane.getValue()).intValue();
|
||||||
|
if(value == JOptionPane.OK_OPTION) {
|
||||||
|
String s = n.getInhaltString();
|
||||||
|
String[] ss = s.split(",|=");
|
||||||
|
String ks = keys.get(cb.getSelectedIndex()).toString(ss[1]);
|
||||||
|
Nachricht nn = n.copy();
|
||||||
|
nn.setInhalt(ks);
|
||||||
|
cc.nachrichten.add(cc.nachrichten.indexOf(n)+1,nn);
|
||||||
|
cc.updateNachrichtenListe();
|
||||||
|
} // end of if
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // end of if
|
||||||
|
|
||||||
|
if (e.getSource() == emi && !n.getSended()) {
|
||||||
|
n.setStopped(true);
|
||||||
|
JTextArea mess = new JTextArea(n.getInhaltString());
|
||||||
|
JScrollPane scrollPane = new JScrollPane(mess);
|
||||||
|
mess.setLineWrap(true);
|
||||||
|
mess.setWrapStyleWord(true);
|
||||||
|
scrollPane.setPreferredSize( new Dimension( 500, 200 ) );
|
||||||
|
|
||||||
|
Object[] message = {"Nachricht", scrollPane};
|
||||||
|
|
||||||
|
JOptionPane pane = new JOptionPane( message,
|
||||||
|
JOptionPane.PLAIN_MESSAGE,
|
||||||
|
JOptionPane.OK_CANCEL_OPTION);
|
||||||
|
pane.createDialog(null, "Nachricht manipulieren").setVisible(true);
|
||||||
|
|
||||||
|
int value = ((Integer)pane.getValue()).intValue();
|
||||||
|
if(value == JOptionPane.OK_OPTION) {
|
||||||
|
n.setInhalt(mess.getText());
|
||||||
|
} // end of if
|
||||||
|
cc.updateNachrichtenListe();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.getSource() == dmi1) {
|
||||||
|
n.generateHash();
|
||||||
|
cc.updateNachrichtenListe();
|
||||||
|
}
|
||||||
|
if (e.getSource() == dmi2) {
|
||||||
|
Nachricht dummy = new Nachricht("dummy","dummy",n.getInhaltString());
|
||||||
|
dummy.generateHash();
|
||||||
|
String ha2 = new String(dummy.getHashCode());
|
||||||
|
String ha = new String(n.getHashCode());
|
||||||
|
System.out.println(ha2+","+ha);
|
||||||
|
if(ha.equals(ha2)) {
|
||||||
|
JOptionPane.showMessageDialog(this,
|
||||||
|
"Der Hashcode der Nachricht stimmt mit dem übermittelten Hashcode überein",
|
||||||
|
"Bestätigung",
|
||||||
|
JOptionPane.INFORMATION_MESSAGE);
|
||||||
|
} else {
|
||||||
|
JOptionPane.showMessageDialog(this,
|
||||||
|
"Der Hashcode der Nachricht passt nicht zum übermittelten Hashcode.",
|
||||||
|
"Fehler",
|
||||||
|
JOptionPane.ERROR_MESSAGE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
98
Quellcodes/iud_key_rsachat/MyServer.java
Normal file
|
|
@ -0,0 +1,98 @@
|
||||||
|
import java.net.ServerSocket;
|
||||||
|
import java.net.Socket;
|
||||||
|
import java.util.Scanner;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Die Klasse MyServer verwaltet einen ServerSocket. Sie erstellt einen ServerSocket an einem
|
||||||
|
* bestimmten Port und wartet dort auf Clients. Es können mehrere Clients gleichzeitig angemeldet sein.
|
||||||
|
* Eine Klasse, die diesen Server benutzt, muss MyServerSocketListener implementieren. Sie wird dann
|
||||||
|
* über die Methode neuerClient informiert, wenn sich ein neuer Client am Server angemeldet hat.
|
||||||
|
* Beschreibung
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @version 1.0 vom 15.11.2012
|
||||||
|
* @author Thomas Schaller
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class MyServer extends Thread {
|
||||||
|
|
||||||
|
// Anfang Attribute
|
||||||
|
private ServerSocket ss;
|
||||||
|
private int port;
|
||||||
|
private boolean aktiv = true;
|
||||||
|
private MyServerSocketListener listener;
|
||||||
|
// Ende Attribute
|
||||||
|
|
||||||
|
/** Dieser Konstruktor erzeugt einen neuen ServerSocket, startet ihn aber nicht sofort.
|
||||||
|
* @param listener Klasse, die MyServerSocketListener implementiert und dann über neue Clients und eingehende Nachrichten informiert wird.
|
||||||
|
* @param port Port, den der ServerSocket abhört.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public MyServer(MyServerSocketListener listener, int port) {
|
||||||
|
this.port = port;
|
||||||
|
this.listener = listener;
|
||||||
|
try {
|
||||||
|
ss = new ServerSocket(port);
|
||||||
|
} catch(Exception e) {
|
||||||
|
System.out.println(e);
|
||||||
|
} // end of try
|
||||||
|
}
|
||||||
|
|
||||||
|
// Anfang Methoden
|
||||||
|
/** Liefert den Port, den der Server abhört.
|
||||||
|
* @return Port
|
||||||
|
*/
|
||||||
|
public int getPort() {
|
||||||
|
return port;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Startet das Abhören des Ports und das Annehmen der Clients
|
||||||
|
*/
|
||||||
|
public void starten() {
|
||||||
|
start();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Verwaltet das Annehmen der Clients (Diese Methode bitte nicht direkt aufrufen, sondern mit starten() aktivieren).
|
||||||
|
*/
|
||||||
|
public void run() {
|
||||||
|
aktiv = true;
|
||||||
|
try {
|
||||||
|
while(aktiv) {
|
||||||
|
System.out.println("Warte auf Client");
|
||||||
|
Socket s = ss.accept();
|
||||||
|
System.out.println("Client empfangen");
|
||||||
|
MySocket ms = new MySocket(s, listener);
|
||||||
|
listener.neuerClient(ms);
|
||||||
|
}
|
||||||
|
} catch(Exception e) {
|
||||||
|
System.out.println(e);
|
||||||
|
} // end of try
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Bricht das Abhören des Ports ab. Es kann nicht wieder durch starten aktiviert werden. Dazu muss ein neuer Server erstellt werden.
|
||||||
|
*/
|
||||||
|
public void stoppen() {
|
||||||
|
aktiv = false;
|
||||||
|
try{
|
||||||
|
ss.close();
|
||||||
|
interrupt();
|
||||||
|
} catch( Exception e) {
|
||||||
|
System.out.println(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Meldet, ob der Server aktiv ist.
|
||||||
|
* @return true, falls der Server den Port abhört, sonst false.
|
||||||
|
*/
|
||||||
|
public boolean getAktiv() {
|
||||||
|
return aktiv;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ende Methoden
|
||||||
|
} // end of Server
|
||||||
|
|
||||||
|
|
||||||
196
Quellcodes/iud_key_rsachat/MySocket.java
Normal file
|
|
@ -0,0 +1,196 @@
|
||||||
|
import java.net.ServerSocket;
|
||||||
|
import java.net.Socket;
|
||||||
|
import java.util.Scanner;
|
||||||
|
import java.io.*;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Die Klasse MySocket verwaltet eine Client-Server-Verbindung. Sie wartet auf eingehende Nachrichten und
|
||||||
|
* informiert ihren Listener, wenn eine Nachricht eingangen ist. Die Nachricht kann dann beim Socket abgeholt werden.
|
||||||
|
* Außerdem können Nachrichten in Form von Strings versendet werden.
|
||||||
|
* Der Listener wird außerdem informiert, wenn die Verbindung zusammengebrochen / beendet ist.
|
||||||
|
* Der Listener muss das Interface MySocketListener implementieren.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @version 1.0 vom 15.11.2012
|
||||||
|
* @author Thomas Schaller
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class MySocket extends Thread{
|
||||||
|
|
||||||
|
// Anfang Attribute2
|
||||||
|
private boolean aktiv;
|
||||||
|
private Socket socket;
|
||||||
|
private BufferedReader eingang=null;
|
||||||
|
PrintWriter ausgang=null;
|
||||||
|
MySocketListener listener=null;
|
||||||
|
|
||||||
|
// Ende Attribute2
|
||||||
|
|
||||||
|
/** Dieser Konstruktor erstellt einen MySocket aus einem schon vorhandenen Socket und ist für die Verwendung durch MyServer gedacht.
|
||||||
|
* @param s Socket, der durch MySocket verwaltet werden soll.
|
||||||
|
* @param listener Listener, der über eingehende Nachrichten und das Beenden der Verbindung informiert wird. Der Listener muss MySocketListener implementieren.
|
||||||
|
*/
|
||||||
|
public MySocket(Socket s, MySocketListener listener){
|
||||||
|
this.socket = s;
|
||||||
|
this.listener = listener;
|
||||||
|
try {
|
||||||
|
eingang = new BufferedReader(new InputStreamReader(socket.getInputStream()));
|
||||||
|
ausgang = new PrintWriter(socket.getOutputStream());
|
||||||
|
aktiv = true;
|
||||||
|
this.start();
|
||||||
|
} catch(Exception e) {;
|
||||||
|
System.out.println(e);
|
||||||
|
e.printStackTrace();
|
||||||
|
aktiv = false;
|
||||||
|
} // end of try
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Dieser Konstruktor erstellt einen neuen Socket. Er verbindet sich mit einem Server an der angegebenen Adresse unter dem angegebenen Port. Der Listener wird
|
||||||
|
* über eingehende Nachrichten und das Beenden der Verbindung informiert.
|
||||||
|
* @param address IP-Adresse oder Domain-Name des Servers
|
||||||
|
* @param port Portnummer, die der Server abhört
|
||||||
|
* @param listener Listener, der über eingehende Nachrichten und das Beenden der Verbindung informiert wird. Der Listener muss MySocketListener implementieren.
|
||||||
|
*/
|
||||||
|
public MySocket(String address, int port, MySocketListener listener) {
|
||||||
|
this.listener = listener;
|
||||||
|
try {
|
||||||
|
this.socket = new Socket(address, port);
|
||||||
|
eingang = new BufferedReader(new InputStreamReader(socket.getInputStream()));
|
||||||
|
ausgang = new PrintWriter(socket.getOutputStream());
|
||||||
|
aktiv = true;
|
||||||
|
this.start();
|
||||||
|
} catch(Exception e) {
|
||||||
|
System.out.println(e);
|
||||||
|
e.printStackTrace();
|
||||||
|
aktiv = false;
|
||||||
|
} // end of try
|
||||||
|
}
|
||||||
|
|
||||||
|
// Anfang Methoden2
|
||||||
|
/** Verwaltet das Annehmen der Nachrichten (Diese Methode bitte nicht direkt aufrufen, sie wird automatisch gestartet).
|
||||||
|
*/
|
||||||
|
public void run(){
|
||||||
|
try {
|
||||||
|
while (aktiv){
|
||||||
|
if (listener != null && eingang.ready()) listener.nachrichtEmpfangen(this);
|
||||||
|
Thread.sleep(5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
if(socket!=null)try{socket.close();}catch(Exception ex){;}
|
||||||
|
System.err.println(e);
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
aktiv = false;
|
||||||
|
if (listener != null) listener.verbindungBeendet(this);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** Liefert die eingangene Nachricht. Diese Methode bitte nur aufrufen, wenn der Listener über den Eingang einer Nachricht informiert wurde, da die Methode sonst bis
|
||||||
|
* zur nächsten eingehenden Nachricht wartet.
|
||||||
|
* @return Nachricht
|
||||||
|
*/
|
||||||
|
public String holeNachricht() {
|
||||||
|
try{
|
||||||
|
|
||||||
|
|
||||||
|
if (aktiv && eingang.ready()) {
|
||||||
|
|
||||||
|
String s = eingang.readLine();
|
||||||
|
System.out.println(s);
|
||||||
|
byte[] b = Base64.decode(s);
|
||||||
|
/* for (int i = 0; i < b.length ; i++) {
|
||||||
|
System.out.print(b[i]);
|
||||||
|
System.out.print(" ");
|
||||||
|
} // end of for
|
||||||
|
System.out.println("");*/
|
||||||
|
|
||||||
|
return s;
|
||||||
|
} // end of if
|
||||||
|
}
|
||||||
|
catch(Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Versendet eine Nachricht an den Server.
|
||||||
|
* @param nachricht Zu sendender Text.
|
||||||
|
*/
|
||||||
|
public void sendeNachricht(String nachricht) {
|
||||||
|
try {
|
||||||
|
//byte[] b = nachricht;
|
||||||
|
/* for (int i = 0; i < b.length ; i++) {
|
||||||
|
System.out.print(b[i]);
|
||||||
|
System.out.print(" ");
|
||||||
|
} // end of for
|
||||||
|
System.out.println("");*/
|
||||||
|
//ausgang.println(Base64.encode(nachricht));
|
||||||
|
ausgang.println(nachricht);
|
||||||
|
// System.out.println(Base64.encode(nachricht));
|
||||||
|
ausgang.flush();
|
||||||
|
} catch(Exception e) {
|
||||||
|
System.out.println(e);
|
||||||
|
e.printStackTrace();
|
||||||
|
if (listener != null) listener.verbindungBeendet(this);
|
||||||
|
aktiv = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Bricht eine bestehende Client-Server-Verbindung ab.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public void trenneVerbindung() {
|
||||||
|
aktiv = false;
|
||||||
|
if (socket != null) {
|
||||||
|
try {
|
||||||
|
socket.close();
|
||||||
|
} catch(Exception e) {
|
||||||
|
System.out.println(e);
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // end of if
|
||||||
|
socket = null; // end of try
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Liefert den Socket der Verbindung. Kann benutzt werden, um dann aus dem Socket weitere Informationen wie IP-Adressen oder Portnummern zu ermitteln.
|
||||||
|
* @return Socket, der Verbindung.
|
||||||
|
*/
|
||||||
|
public Socket getSocket() {
|
||||||
|
return socket;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Liefert den Status der Verbindung.
|
||||||
|
* @return true, falls die Verbindung noch aktiv ist, sonst false.
|
||||||
|
*/
|
||||||
|
public boolean isAktiv() {
|
||||||
|
return aktiv;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Räumt alles auf, damit der Thread nicht weiterläuft (bitte nicht aufrufen).
|
||||||
|
*/
|
||||||
|
public void finalize() {
|
||||||
|
// Schließen der Streams und des Sockets, wenn
|
||||||
|
// die Verbindung gelöscht wird wird
|
||||||
|
try {
|
||||||
|
trenneVerbindung();
|
||||||
|
}
|
||||||
|
catch(Exception e) {
|
||||||
|
System.out.println(e);
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Ende Methoden2
|
||||||
|
}
|
||||||
19
Quellcodes/iud_key_rsachat/MySocketListener.java
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
import java.net.ServerSocket;
|
||||||
|
import java.net.Socket;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Listenerdefinitionen für MyServer und MySocket.
|
||||||
|
* Klassen, die mit diesen beiden Klassen arbeiten müssen diese Listener implementieren.
|
||||||
|
*
|
||||||
|
* @version 1.0 vom 15.11.2012
|
||||||
|
* @author Thomas Schaller
|
||||||
|
*/
|
||||||
|
|
||||||
|
interface MySocketListener { // Der Listener wird über folgendes informiert...
|
||||||
|
void nachrichtEmpfangen(MySocket s); // am Socket ist eine Nachricht eingegangen. Diese kann dann mit s.holeNachricht() abgeholt werden.
|
||||||
|
void verbindungBeendet(MySocket s); // die Verbindung wurde beendet oder ist zusammengebrochen.
|
||||||
|
}
|
||||||
|
|
||||||
|
interface MyServerSocketListener extends MySocketListener {
|
||||||
|
void neuerClient(MySocket s); // ein neuer Client hat sich mit dem Server verbunden.
|
||||||
|
}
|
||||||
183
Quellcodes/iud_key_rsachat/Nachricht.java
Normal file
|
|
@ -0,0 +1,183 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* description
|
||||||
|
*
|
||||||
|
* @version 1.1 from 30.01.2020
|
||||||
|
* Änderungen: Hash-Funktion verbessert, damit ähnliche Texte nicht so ähnliche Hashes bekommen
|
||||||
|
* @author
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.security.MessageDigest;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
|
public class Nachricht {
|
||||||
|
|
||||||
|
// Anfang Attribute
|
||||||
|
private byte[] inhalt;
|
||||||
|
private String absender;
|
||||||
|
private String empfaenger;
|
||||||
|
private ArrayList<Key> keys;
|
||||||
|
private ArrayList<Key> hashKeys;
|
||||||
|
private byte[] hashCode;
|
||||||
|
private long time;
|
||||||
|
private boolean stopped;
|
||||||
|
private boolean sended;
|
||||||
|
// Ende Attribute
|
||||||
|
|
||||||
|
public Nachricht(String absender, String empfaenger, String inhalt) {
|
||||||
|
setInhalt(inhalt);
|
||||||
|
this.absender = absender;
|
||||||
|
this.empfaenger = empfaenger;
|
||||||
|
this.keys = new ArrayList<Key>();
|
||||||
|
this.hashKeys = new ArrayList<Key>();
|
||||||
|
this.hashCode = ("").getBytes() ;
|
||||||
|
this.time = System.currentTimeMillis();
|
||||||
|
this.stopped = false;
|
||||||
|
this.sended = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Nachricht(String absender, String empfaenger, byte[] inhalt, byte[] hashCode) {
|
||||||
|
this.inhalt = inhalt;
|
||||||
|
this.absender = absender;
|
||||||
|
this.empfaenger = empfaenger;
|
||||||
|
this.keys = new ArrayList<Key>();
|
||||||
|
this.hashKeys = new ArrayList<Key>();
|
||||||
|
this.hashCode = hashCode;
|
||||||
|
this.time = System.currentTimeMillis();
|
||||||
|
this.stopped = false;
|
||||||
|
this.sended = false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public Nachricht(String absender, String empfaenger, String inhalt, ArrayList<Key> keys, ArrayList<Key> hashKeys) {
|
||||||
|
setInhalt(inhalt);
|
||||||
|
this.absender = absender;
|
||||||
|
this.empfaenger = empfaenger;
|
||||||
|
this.keys = (ArrayList<Key>)keys.clone();
|
||||||
|
this.hashKeys = (ArrayList<Key>) hashKeys.clone();
|
||||||
|
this.hashCode = ("").getBytes() ;
|
||||||
|
this.time = System.currentTimeMillis();
|
||||||
|
this.stopped = false;
|
||||||
|
this.sended = false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public Nachricht(String absender, String empfaenger, byte[] inhalt, byte[] hashCode, ArrayList<Key> keys, ArrayList<Key> hashKeys) {
|
||||||
|
this.inhalt = inhalt;
|
||||||
|
this.absender = absender;
|
||||||
|
this.empfaenger = empfaenger;
|
||||||
|
this.keys = (ArrayList<Key>)keys.clone();
|
||||||
|
this.hashKeys = (ArrayList<Key>) hashKeys.clone();
|
||||||
|
this.hashCode = hashCode;
|
||||||
|
this.time = System.currentTimeMillis();
|
||||||
|
this.stopped = false;
|
||||||
|
this.sended = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Anfang Methoden
|
||||||
|
public String getInhaltString() {
|
||||||
|
return new String(inhalt);
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] getInhalt() {
|
||||||
|
return inhalt;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void setInhalt(String inhalt) {
|
||||||
|
this.inhalt = inhalt.getBytes();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setInhalt(byte[] inhalt) {
|
||||||
|
this.inhalt = inhalt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAbsender() {
|
||||||
|
return absender;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAbsender(String absender) {
|
||||||
|
this.absender = absender;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEmpfaenger() {
|
||||||
|
return empfaenger;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEmpfaenger(String empfaenger) {
|
||||||
|
this.empfaenger = empfaenger;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Nachricht copy() {
|
||||||
|
Nachricht n = new Nachricht(absender, "", inhalt, hashCode, keys, hashKeys);
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
public void addKey(Key k) {
|
||||||
|
|
||||||
|
keys.add(k);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<Key> getKeys() {
|
||||||
|
|
||||||
|
return keys;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addHashKey(Key k) {
|
||||||
|
|
||||||
|
hashKeys.add(k);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<Key> getHashKeys() {
|
||||||
|
|
||||||
|
return hashKeys;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void generateHash() {
|
||||||
|
try{
|
||||||
|
MessageDigest digest = MessageDigest.getInstance("SHA-256");
|
||||||
|
hashCode = Base64.encode(digest.digest(getInhaltString().getBytes(StandardCharsets.UTF_8))).substring(0,10).getBytes();
|
||||||
|
|
||||||
|
} catch(Exception e) {
|
||||||
|
System.out.println(e);
|
||||||
|
hashCode = new byte[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] getHashCode() {
|
||||||
|
return hashCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHashCode(byte[] hashCode) {
|
||||||
|
this.hashCode = hashCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getRestzeit() {
|
||||||
|
if (sended || stopped) {
|
||||||
|
return 0;
|
||||||
|
} // end of if
|
||||||
|
return 10 - (int) ((System.currentTimeMillis()-this.time)/1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public boolean getSended() {
|
||||||
|
return sended;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSended(boolean s) {
|
||||||
|
sended = s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public boolean getStopped() {
|
||||||
|
return stopped;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStopped(boolean s) {
|
||||||
|
stopped = s;
|
||||||
|
}
|
||||||
|
// Ende Methoden
|
||||||
|
|
||||||
|
}
|
||||||
53
Quellcodes/iud_key_rsachat/PicPanel.java
Normal file
|
|
@ -0,0 +1,53 @@
|
||||||
|
import java.awt.Graphics;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URL;
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
|
import javax.swing.*;
|
||||||
|
import java.util.*;
|
||||||
|
import java.awt.FontMetrics;
|
||||||
|
import java.awt.event.MouseEvent;
|
||||||
|
import java.awt.event.MouseListener;
|
||||||
|
|
||||||
|
|
||||||
|
//pic erbt von Panel - spart eine Klasse
|
||||||
|
public class PicPanel extends JPanel {
|
||||||
|
|
||||||
|
ArrayList<Key> keys;
|
||||||
|
|
||||||
|
|
||||||
|
public PicPanel(ArrayList<Key> keys){
|
||||||
|
|
||||||
|
this.keys = keys;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void drawCenteredString(String s, int xx, int yy, Graphics g) {
|
||||||
|
FontMetrics fm = g.getFontMetrics();
|
||||||
|
int x = xx- fm.stringWidth(s) / 2;
|
||||||
|
g.drawString(s, x, yy);
|
||||||
|
}
|
||||||
|
|
||||||
|
//paintComponent überschreiben, Image zeichnen, super-Aufruf nicht vergessen
|
||||||
|
@Override
|
||||||
|
protected void paintComponent(Graphics g) {
|
||||||
|
super.paintComponent(g);
|
||||||
|
for (int x = 0; x < keys.size(); x++) {
|
||||||
|
g.drawImage(keys.get(x).getImage(),x*32,2,this);
|
||||||
|
drawCenteredString(keys.get(x).getName(),x*32+16,50,g);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getToolTipText(MouseEvent evt) {
|
||||||
|
int k = evt.getX() /32;
|
||||||
|
if (keys.size()>k) {
|
||||||
|
return "<html><p width=400><b>Exponent:</b><br>"+keys.get(k).getE()+"</p><p width=400><b>Modul:</b><br>"+keys.get(k).getN()+"</p></html>";
|
||||||
|
} // end of if
|
||||||
|
return "Schlüsselspeicher";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
130
Quellcodes/iud_key_rsachat/RSA.java
Normal file
|
|
@ -0,0 +1,130 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Beschreibung
|
||||||
|
*
|
||||||
|
* @version 1.0 vom 14.01.2016
|
||||||
|
* @author
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.math.BigInteger;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class RSA {
|
||||||
|
|
||||||
|
// Anfang Attribute
|
||||||
|
private int SIZE = 1024;
|
||||||
|
private int BLOCKSIZE = 2;
|
||||||
|
private BigInteger n;
|
||||||
|
private BigInteger p, q;
|
||||||
|
private BigInteger PhiN;
|
||||||
|
private BigInteger e, d;
|
||||||
|
|
||||||
|
// Ende Attribute
|
||||||
|
|
||||||
|
public RSA() {
|
||||||
|
|
||||||
|
generateKey();
|
||||||
|
}
|
||||||
|
|
||||||
|
public RSA(int bits) {
|
||||||
|
SIZE = bits;
|
||||||
|
generateKey();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Anfang Methoden
|
||||||
|
|
||||||
|
public BigInteger getN() {
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void setN(BigInteger n) {
|
||||||
|
this.n = n;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void generateKey() {
|
||||||
|
/* Step 1: Select two large prime numbers. Say p and q. */
|
||||||
|
p = BigInteger.probablePrime(SIZE, new Random());
|
||||||
|
q = BigInteger.probablePrime(SIZE, new Random());
|
||||||
|
/* Step 2: Calculate n = p.q */
|
||||||
|
n = p.multiply(q);
|
||||||
|
/* Step 3: Calculate ø(n) = (p - 1).(q - 1) */
|
||||||
|
PhiN = p.subtract(BigInteger.valueOf(1));
|
||||||
|
PhiN = PhiN.multiply(q.subtract(BigInteger.valueOf(1)));
|
||||||
|
/* Step 4: Find e such that gcd(e, ø(n)) = 1 ; 1 < e < ø(n) */
|
||||||
|
/* do {
|
||||||
|
e = new BigInteger(2 * SIZE, new Random());
|
||||||
|
} while ((e.compareTo(PhiN) != 1)
|
||||||
|
|| (e.gcd(PhiN).compareTo(BigInteger.valueOf(1)) != 0));
|
||||||
|
*/
|
||||||
|
/* Als e wird in der Praxis immer 65537 verwendet*/
|
||||||
|
e = BigInteger.valueOf(65537);
|
||||||
|
/* Step 5: Calculate d such that e.d = 1 (mod ø(n)) */
|
||||||
|
d = e.modInverse(PhiN);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public Key getPublicKey() {
|
||||||
|
return new Key("Ö",e,n);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Key getPrivateKey() {
|
||||||
|
return new Key("P",d,n);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Key getPublicKeyZert() {
|
||||||
|
return new Key("ZS",new BigInteger("92020722032510237098687730821345002475852926519687505393637258322619905644760889379395080699744916048107242925967027699181978133434386836838764269376892530783630654811456718501622805"+
|
||||||
|
"0429691604569763800205767093030273564571085665400962405818664165449303338714877264756844232275146244572923302600861123085509774896697571445612708416287450226532029033236047907922857453176065518750862719489230457831441"+
|
||||||
|
"7173388889137991463283210462111428501392067084189267999492753829846440287839192599579471258088572439889541316908031255266831632514679577179417418047234941358616454031601382865835722476368628684965351829298264441751183"+
|
||||||
|
"4765538945638034868762252381408904028140439409187378031978842476147164936819798249655054427494851690069200746638913551812853454469432164195272770583598350122258729847670066946154048177957396760843403465486329401836814"+
|
||||||
|
"9990639814827911842782103318445952572226732629881400041393595241900643703238957157012120488385905509895908742240747739986701990654721595793098375922165943034668657422624955521278896354123265004069921640297875759614496"+
|
||||||
|
"742155179442639630932330086817709676636648111414906681085732877503585719166804978513181384327884382400889164642851924835156763044152821991745397448110186145769503874106711784628283015"),
|
||||||
|
new BigInteger("5139848029926993084030177297754816256127765376419362760006875069769259661872914759939556724394537974685918407976961929857609117001554132888941990323118389734140650301936109978057312726558318809808688530"+
|
||||||
|
"99773725611495268508136211646337118765334983074807622287602613120954964306249607670374637031866390157648764929632399710705078606495073542059188462314599000331802944594967393118351191103705051281495305712977081775868511"+
|
||||||
|
"76669514447588704897250963384817831024230705289577095855693680350648450932456258694411608347436126446258894555954026134724123826545582729849892381402885181473492517034956094364025058973837607228431208754049905489662832"+
|
||||||
|
"09739142470309153125447402018234554037154608185773467018511970065694249410104669788842146660693780223399943991335490758657838309774214025815008528258836495746672516751271291457802304100684624522436687990982028305751185"+
|
||||||
|
"48926383285704725365240957188638904019694020065564925826265319075541291979464737277137720345398870073684194532135223107690328725385189503977019793221936587592861157513836453534572733867521266351697630143131367971098119"+
|
||||||
|
"501251155238775343770355444640289263220749122642671050995480950737812740946324944965924224677968141284858329942830891138365556546396148300565405098100850501841"));
|
||||||
|
}
|
||||||
|
public static Key getPrivateKeyZert() {
|
||||||
|
return new Key("ZSP", new BigInteger("88405792460374902093708496634850741322105940917351683868541504012830882621245768251091372013156643395250448929783142177860165402492647945415104962343917444383622605496273629917298"+
|
||||||
|
"610236655119004745619089104384026215301496147234635587743965575319499761064848213230757151103779005504514500023252356175847116728347255176088139236137082826628487749466300296767988898076628975938940677076738206736367"+
|
||||||
|
"124996756783169958055053177519677571981271713255438344078311774536073940876121321362816462939120383991608570431036543882874480977769541084535126636925352742738338245898199820269860018114420772543302483230833480292931"+
|
||||||
|
"352334730109447074945409204173176619699849050721926499420093861285836519963502042472293474805213779251720392591031533706581969617690636531135793143059665641797414237435624262623024366515969141242459029652395794721850"+
|
||||||
|
"8436689537023284104630131792447652257617740873015159381631615655581919939509498869888015294276578911842474036086993469464623230276020243502751167826145879239288526145360234428912097606211745547385659522887117076882491"+
|
||||||
|
"04675147998869220229602216434114268798658103586693108736443392251539998599980668517520134276984180168498165513964507909008004400364235467465743076136818915438381335591270604629182883277111"),
|
||||||
|
new BigInteger("5139848029926993084030177297754816256127765376419362760006875069769259661872914759939556724394537974685918407976961929857609117001554132888941990323118389734140650301936109978057312726558318809808688530"+
|
||||||
|
"99773725611495268508136211646337118765334983074807622287602613120954964306249607670374637031866390157648764929632399710705078606495073542059188462314599000331802944594967393118351191103705051281495305712977081775868511"+
|
||||||
|
"76669514447588704897250963384817831024230705289577095855693680350648450932456258694411608347436126446258894555954026134724123826545582729849892381402885181473492517034956094364025058973837607228431208754049905489662832"+
|
||||||
|
"09739142470309153125447402018234554037154608185773467018511970065694249410104669788842146660693780223399943991335490758657838309774214025815008528258836495746672516751271291457802304100684624522436687990982028305751185"+
|
||||||
|
"48926383285704725365240957188638904019694020065564925826265319075541291979464737277137720345398870073684194532135223107690328725385189503977019793221936587592861157513836453534572733867521266351697630143131367971098119"+
|
||||||
|
"501251155238775343770355444640289263220749122642671050995480950737812740946324944965924224677968141284858329942830891138365556546396148300565405098100850501841"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ende Methoden
|
||||||
|
public static void main(String[] args) {
|
||||||
|
RSA r = new RSA(2048);
|
||||||
|
Key o = r.getPublicKey();
|
||||||
|
Key p = r.getPrivateKey();
|
||||||
|
|
||||||
|
/*BigInteger i = new BigInteger("2237891328923");
|
||||||
|
System.out.println(i.toString());
|
||||||
|
byte[] b = o.convert(i);
|
||||||
|
BigInteger j = o.convert(b);
|
||||||
|
System.out.println(j.toString());
|
||||||
|
|
||||||
|
System.out.println(new String(o.encrypt(("Hallo").getBytes())));
|
||||||
|
System.out.println("------------");
|
||||||
|
System.out.println(new String(p.encrypt(o.encrypt(("Hallo").getBytes()))));
|
||||||
|
*/
|
||||||
|
System.out.println(o.getE());
|
||||||
|
System.out.println("---");
|
||||||
|
System.out.println(p.getE());
|
||||||
|
System.out.println("---");
|
||||||
|
System.out.println(o.getN());
|
||||||
|
|
||||||
|
}
|
||||||
|
} // end of RSA
|
||||||
25
Quellcodes/iud_key_rsachat/TestRSA.java
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* description
|
||||||
|
*
|
||||||
|
* @version 1.0 from 20.01.2016
|
||||||
|
* @author
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.math.BigInteger;
|
||||||
|
import java.util.Random;
|
||||||
|
public class TestRSA {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
RSA rsa = new RSA();
|
||||||
|
Key k1 = rsa.getPublicKey();
|
||||||
|
Key k2 = rsa.getPrivateKey();
|
||||||
|
System.out.println("Keys generiert");
|
||||||
|
BigInteger i = BigInteger.valueOf(100);
|
||||||
|
BigInteger j = k1.encrypt(i);
|
||||||
|
BigInteger z = k2.encrypt(j);
|
||||||
|
System.out.println(i.toString()+"\n"+j.toString()+"\n"+z.toString());
|
||||||
|
System.out.println(k1.encrypt(k2.encrypt("Hallo Leute, dies ist ein langer Text")).trim());
|
||||||
|
}
|
||||||
|
}
|
||||||
186
Quellcodes/iud_key_rsachat/TestRSA2.java
Normal file
|
|
@ -0,0 +1,186 @@
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.ObjectInputStream;
|
||||||
|
import java.io.ObjectOutputStream;
|
||||||
|
import java.security.KeyPair;
|
||||||
|
import java.security.KeyPairGenerator;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.security.PrivateKey;
|
||||||
|
import java.security.PublicKey;
|
||||||
|
|
||||||
|
import javax.crypto.Cipher;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author JavaDigest
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class TestRSA2 {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* String to hold name of the encryption algorithm.
|
||||||
|
*/
|
||||||
|
public static final String ALGORITHM = "RSA";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* String to hold the name of the private key file.
|
||||||
|
*/
|
||||||
|
public static final String PRIVATE_KEY_FILE = "C:/keys/private.key";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* String to hold name of the public key file.
|
||||||
|
*/
|
||||||
|
public static final String PUBLIC_KEY_FILE = "C:/keys/public.key";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate key which contains a pair of private and public key using 1024
|
||||||
|
* bytes. Store the set of keys in Prvate.key and Public.key files.
|
||||||
|
*
|
||||||
|
* @throws NoSuchAlgorithmException
|
||||||
|
* @throws IOException
|
||||||
|
* @throws FileNotFoundException
|
||||||
|
*/
|
||||||
|
public static void generateKey() {
|
||||||
|
try {
|
||||||
|
final KeyPairGenerator keyGen = KeyPairGenerator.getInstance(ALGORITHM);
|
||||||
|
keyGen.initialize(1024);
|
||||||
|
final KeyPair key = keyGen.generateKeyPair();
|
||||||
|
|
||||||
|
File privateKeyFile = new File(PRIVATE_KEY_FILE);
|
||||||
|
File publicKeyFile = new File(PUBLIC_KEY_FILE);
|
||||||
|
|
||||||
|
// Create files to store public and private key
|
||||||
|
if (privateKeyFile.getParentFile() != null) {
|
||||||
|
privateKeyFile.getParentFile().mkdirs();
|
||||||
|
}
|
||||||
|
privateKeyFile.createNewFile();
|
||||||
|
|
||||||
|
if (publicKeyFile.getParentFile() != null) {
|
||||||
|
publicKeyFile.getParentFile().mkdirs();
|
||||||
|
}
|
||||||
|
publicKeyFile.createNewFile();
|
||||||
|
|
||||||
|
// Saving the Public key in a file
|
||||||
|
ObjectOutputStream publicKeyOS = new ObjectOutputStream(
|
||||||
|
new FileOutputStream(publicKeyFile));
|
||||||
|
publicKeyOS.writeObject(key.getPublic());
|
||||||
|
publicKeyOS.close();
|
||||||
|
|
||||||
|
// Saving the Private key in a file
|
||||||
|
ObjectOutputStream privateKeyOS = new ObjectOutputStream(
|
||||||
|
new FileOutputStream(privateKeyFile));
|
||||||
|
privateKeyOS.writeObject(key.getPrivate());
|
||||||
|
privateKeyOS.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The method checks if the pair of public and private key has been generated.
|
||||||
|
*
|
||||||
|
* @return flag indicating if the pair of keys were generated.
|
||||||
|
*/
|
||||||
|
public static boolean areKeysPresent() {
|
||||||
|
|
||||||
|
File privateKey = new File(PRIVATE_KEY_FILE);
|
||||||
|
File publicKey = new File(PUBLIC_KEY_FILE);
|
||||||
|
|
||||||
|
if (privateKey.exists() && publicKey.exists()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encrypt the plain text using public key.
|
||||||
|
*
|
||||||
|
* @param text
|
||||||
|
* : original plain text
|
||||||
|
* @param key
|
||||||
|
* :The public key
|
||||||
|
* @return Encrypted text
|
||||||
|
* @throws java.lang.Exception
|
||||||
|
*/
|
||||||
|
public static byte[] encrypt(String text, PublicKey key) {
|
||||||
|
byte[] cipherText = null;
|
||||||
|
try {
|
||||||
|
// get an RSA cipher object and print the provider
|
||||||
|
final Cipher cipher = Cipher.getInstance(ALGORITHM);
|
||||||
|
// encrypt the plain text using the public key
|
||||||
|
cipher.init(Cipher.ENCRYPT_MODE, key);
|
||||||
|
cipherText = cipher.doFinal(text.getBytes());
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return cipherText;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decrypt text using private key.
|
||||||
|
*
|
||||||
|
* @param text
|
||||||
|
* :encrypted text
|
||||||
|
* @param key
|
||||||
|
* :The private key
|
||||||
|
* @return plain text
|
||||||
|
* @throws java.lang.Exception
|
||||||
|
*/
|
||||||
|
public static String decrypt(byte[] text, PrivateKey key) {
|
||||||
|
byte[] dectyptedText = null;
|
||||||
|
try {
|
||||||
|
// get an RSA cipher object and print the provider
|
||||||
|
final Cipher cipher = Cipher.getInstance(ALGORITHM);
|
||||||
|
|
||||||
|
// decrypt the text using the private key
|
||||||
|
cipher.init(Cipher.DECRYPT_MODE, key);
|
||||||
|
dectyptedText = cipher.doFinal(text);
|
||||||
|
|
||||||
|
} catch (Exception ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return new String(dectyptedText);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test the EncryptionUtil
|
||||||
|
*/
|
||||||
|
public static void main(String[] args) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
// Check if the pair of keys are present else generate those.
|
||||||
|
if (!areKeysPresent()) {
|
||||||
|
// Method generates a pair of keys using the RSA algorithm and stores it
|
||||||
|
// in their respective files
|
||||||
|
generateKey();
|
||||||
|
}
|
||||||
|
|
||||||
|
final String originalText = "Text to be encrypted. Dies ist ein längerer Text.";
|
||||||
|
ObjectInputStream inputStream = null;
|
||||||
|
|
||||||
|
// Encrypt the string using the public key
|
||||||
|
inputStream = new ObjectInputStream(new FileInputStream(PUBLIC_KEY_FILE));
|
||||||
|
final PublicKey publicKey = (PublicKey) inputStream.readObject();
|
||||||
|
final byte[] cipherText = encrypt(originalText, publicKey);
|
||||||
|
|
||||||
|
// Decrypt the cipher text using the private key.
|
||||||
|
inputStream = new ObjectInputStream(new FileInputStream(PRIVATE_KEY_FILE));
|
||||||
|
final PrivateKey privateKey = (PrivateKey) inputStream.readObject();
|
||||||
|
final String plainText = decrypt(cipherText, privateKey);
|
||||||
|
|
||||||
|
// Printing the Original, Encrypted and Decrypted Text
|
||||||
|
System.out.println("Private Key"+privateKey);
|
||||||
|
System.out.println("Original: " + originalText);
|
||||||
|
System.out.println("Encrypted: " +cipherText.toString());
|
||||||
|
System.out.println("Decrypted: " + plainText);
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
Quellcodes/iud_key_rsachat/arrow.png
Normal file
|
After Width: | Height: | Size: 202 B |
BIN
Quellcodes/iud_key_rsachat/key0.png
Normal file
|
After Width: | Height: | Size: 984 B |
BIN
Quellcodes/iud_key_rsachat/key0s.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
Quellcodes/iud_key_rsachat/key1.png
Normal file
|
After Width: | Height: | Size: 1 KiB |
BIN
Quellcodes/iud_key_rsachat/key1s.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
Quellcodes/iud_key_rsachat/key2.png
Normal file
|
After Width: | Height: | Size: 999 B |
BIN
Quellcodes/iud_key_rsachat/key2s.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
Quellcodes/iud_key_rsachat/key3.png
Normal file
|
After Width: | Height: | Size: 1,002 B |
BIN
Quellcodes/iud_key_rsachat/key3s.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
Quellcodes/iud_key_rsachat/key4.png
Normal file
|
After Width: | Height: | Size: 994 B |
BIN
Quellcodes/iud_key_rsachat/key4s.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
Quellcodes/iud_key_rsachat/key5.png
Normal file
|
After Width: | Height: | Size: 969 B |
BIN
Quellcodes/iud_key_rsachat/key5s.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
Quellcodes/iud_key_rsachat/key6.png
Normal file
|
After Width: | Height: | Size: 992 B |
BIN
Quellcodes/iud_key_rsachat/key6s.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
Quellcodes/iud_key_rsachat/key7.png
Normal file
|
After Width: | Height: | Size: 981 B |
BIN
Quellcodes/iud_key_rsachat/key7s.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
Quellcodes/iud_key_rsachat/key8.png
Normal file
|
After Width: | Height: | Size: 977 B |
BIN
Quellcodes/iud_key_rsachat/key8s.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
Quellcodes/iud_key_rsachat/key9.png
Normal file
|
After Width: | Height: | Size: 975 B |
BIN
Quellcodes/iud_key_rsachat/key9s.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
Quellcodes/iud_key_rsachat/privateKey.RSA
Normal file
BIN
Quellcodes/iud_key_rsachat/publicKey.RSA
Normal file
12
Quellcodes/iud_key_rsachat/readme.adoc
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
= Material der ZPG IMP 10:
|
||||||
|
|
||||||
|
|===
|
||||||
|
|Zuordnung| Informationsgesellschaft und Datenschutz
|
||||||
|
|Klassenstufe| IMP 10
|
||||||
|
|Bildungsplanbezug |
|
||||||
|
|Werkzeug| Chatprogramm mit asymmetrischer Verschlüsselung
|
||||||
|
|Autoren| Thomas Schaller
|
||||||
|
|===
|
||||||
|
|
||||||
|
== Inhalt
|
||||||
|
Chatprogramm zur Veranschaulichung von asymmetrischer Kryptologie. Nachrichten können verschlüsselt und signiert werden. Ein Man in the Middle Angriff kann simuliert werden.
|
||||||
BIN
Quellcodes/iud_key_rsachat/sign.xcf
Normal file
BIN
Quellcodes/iud_key_rsachat/stop.png
Normal file
|
After Width: | Height: | Size: 216 B |