Avatar billede trp79 Nybegynder
17. januar 2003 - 09:53 Der er 47 kommentarer og
2 løsninger

Krypteringsmetoder - MD5?

Jeg har aldrig arbejdet med kryptering før, men jeg kunne godt tænke mig at kryptere nogle tekststrenge. Hvordan kunne jeg fx. gøre dette, og hvad kræver det af import?

I http://www.eksperten.dk/spm/293596 fandt jeg denne metode til at kryptere:

private String encrypt(String pass) {
    try {
      MessageDigest md = MessageDigest.getInstance("MD5");
      return new String(md.digest(pass.getBytes()));
    } catch (Exception e) {
      return null;
    }
  }

men der skal jo også bruges en dekrypteringsmetode på klient siden... hvordan ser sådan een ud og er overstående overhovedet brugelig, og hvilke pakker skal man importer?

Håber nogen kan hjælpe :o)
Avatar billede arne_v Ekspert
17. januar 2003 - 10:02 #1
Ovenstående er faktisk slet ikke en kryptering, men derimod en digital
signatur.

D.v.s. at man har sine data, så beregner man en hash af den, man sender
så både data og hash, modtagerenb kan så verificere at hash matcher
data.

Men både dette og rigtig kryptering er i java.security pakkerne.

D eer standard i JDK 1.4 (med JDK 1.3 skal du have fat i JCE 1.2.1).
Avatar billede trp79 Nybegynder
17. januar 2003 - 10:09 #2
Okey!
Har JDK 1.4. Men hvordan kunne en krypterings- og dekrypteringsmetode så se ud? og bør man bruge MD5 eller findes der andre kryperingsalgoritmer man kan komme til?
Avatar billede sthen Nybegynder
17. januar 2003 - 10:15 #3
Du bør til dit formål IKKE anvende MD5, da det kun er muligt at kryptere, men ikke at DE-kryptere MD5.
Avatar billede trp79 Nybegynder
17. januar 2003 - 10:19 #4
Okey, men jeg spørger så til hvad jeg ellers kunne gøre og hvordan metoderne kunne se ud...
Avatar billede arne_v Ekspert
17. januar 2003 - 11:05 #5
Her er lidt kode til DES:

import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class Encrypt {
  private Cipher des;
  private SecretKey deskey;
  Encrypt(String key) {
      try {
        Security.addProvider(new com.sun.crypto.provider.SunJCE());
        des = Cipher.getInstance("DES/ECB/PKCS5Padding");
        deskey = new SecretKeySpec(key.getBytes(), "DES");
      } catch(Exception e) {
      }
  }
  private byte[] encrypt(byte[] plaindata, SecretKey deskey) throws Exception {
      des.init(Cipher.ENCRYPT_MODE, deskey);
      return des.doFinal(plaindata);
  }
       
  private byte[] decrypt(byte[] cipherdata, SecretKey deskey) throws Exception {
      des.init(Cipher.DECRYPT_MODE, deskey);
      return des.doFinal(cipherdata);
  }
}
Avatar billede arne_v Ekspert
17. januar 2003 - 11:09 #6
Ups. Ikke helt rigtigt. Vi prøver lige igen.

import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class Encrypt {
  private Cipher des;
  private SecretKey deskey;
  Encrypt(String key) {
      try {
        Security.addProvider(new com.sun.crypto.provider.SunJCE());
        des = Cipher.getInstance("DES/ECB/PKCS5Padding");
        deskey = new SecretKeySpec(key.getBytes(), "DES");
      } catch(Exception e) {
      }
  }
  private byte[] encrypt(byte[] plaindata) throws Exception {
      des.init(Cipher.ENCRYPT_MODE, deskey);
      return des.doFinal(plaindata);
  }
       
  private byte[] decrypt(byte[] cipherdata) throws Exception {
      des.init(Cipher.DECRYPT_MODE, deskey);
      return des.doFinal(cipherdata);
  }
  public static void main(String[] args) throws Exception {
        Encrypt ec = new Encrypt("hemmelig");
        String s1 = "Dette er en test";
        byte[] b1 = ec.encrypt(s1.getBytes());
        byte[] b2 = ec.decrypt(b1);
        String s2 = new String(b2);
        System.out.println(s2);
       
  }
}
Avatar billede arne_v Ekspert
17. januar 2003 - 11:10 #7
Bemærk at der er adskillige krypterings algoritmer at vælge
imellem.

DES er ikke længere tidssvarende.
Avatar billede carstenknudsen Nybegynder
17. januar 2003 - 11:14 #8
Her er et eksempel på symmetrisk kryptering, hvor der kræves
en hemmelig kode, der er ens til både kryptering og dekryptering.
    public class DESEncrypter {
        private Cipher ecipher;
        private Cipher dcipher;
        byte[] salt = {
            (byte)0xA9, (byte)0x9B, (byte)0xC8, (byte)0x32,
            (byte)0x56, (byte)0x35, (byte)0xE3, (byte)0x03
        };
        int iterationCount = 19;
        DESEncrypter(String passPhrase) {
            try {
                // Create the key
                KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), salt, iterationCount);
                SecretKey key = SecretKeyFactory.getInstance(
                    "PBEWithMD5AndDES").generateSecret(keySpec);
                ecipher = Cipher.getInstance(key.getAlgorithm());
                dcipher = Cipher.getInstance(key.getAlgorithm());
   
                // Prepare the parameter to the ciphers
                AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);
                ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
                dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
            } catch (java.security.InvalidAlgorithmParameterException e) {
            } catch (java.security.spec.InvalidKeySpecException e) {
            } catch (javax.crypto.NoSuchPaddingException e) {
            } catch (java.security.NoSuchAlgorithmException e) {
            } catch (java.security.InvalidKeyException e) {
            }
        }
   
        public String encrypt(String str) {
            try {
                byte[] utf8 = str.getBytes("UTF8");
                byte[] enc = ecipher.doFinal(utf8); // krypter
                return new sun.misc.BASE64Encoder().encode(enc);
            } catch (javax.crypto.BadPaddingException e) {
            } catch (IllegalBlockSizeException e) {
            } catch (UnsupportedEncodingException e) {
            } catch (java.io.IOException e) {
            }
            return null;
        }
   
        public String decrypt(String str) {
            try {
                byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str);
                byte[] utf8 = dcipher.doFinal(dec); // dekrypter
                return new String(utf8, "UTF8");
            } catch (javax.crypto.BadPaddingException e) {
            } catch (IllegalBlockSizeException e) {
            } catch (UnsupportedEncodingException e) {
            } catch (java.io.IOException e) {
            }
            return null;
        }
    }

    try {
        DesEncrypter encrypter = new DesEncrypter("Dette er den hemmelige kode.");
        String encrypted = encrypter.encrypt("Denne tekst skal krypteres.");
        String decrypted = encrypter.decrypt(encrypted);//dekrypteres streng
    } catch (Exception e) {
    }
Avatar billede trp79 Nybegynder
17. januar 2003 - 12:44 #9
Jeg får desværre en:
C:\Documents and Settings\Torben Pedersen\Dokumenter\DØK\2.År\Datalogi\Java\encrypt\Encrypt.java:2: cannot resolve symbol
symbol  : class Cipher 
location: package crypto
import javax.crypto.Cipher;

Den er ikke helt tilfreds med Cipher. Burde den ikke lige standard i j2sdk1.4.0_01?
What to do?
Avatar billede arne_v Ekspert
17. januar 2003 - 13:21 #10
javax.crypto.Cipher er ihvertfald i 1.4.1_01 !
Avatar billede arne_v Ekspert
17. januar 2003 - 13:27 #11
Jeg kan lige se, at den ikke er i rt.jar, men i jce.jar !

Prøv evt. og tilføje jdkdir\jre\lib\jce.jar til din classpath
og prøve igen.
Avatar billede arne_v Ekspert
17. januar 2003 - 13:51 #12
Jeg har lige testet med JB7 og JDK 1.4.1 og der compilede det fint.

Men JBuilder putter også jce.jar ind i classpath.
Avatar billede trp79 Nybegynder
17. januar 2003 - 13:58 #13
Mit classpath ser således ud nu...: .;%SystemRoot%\java\classes;%SystemRoot%\java\classes\swing.jar;%SystemRoot%\j2sdk1.4.0_01\jre\lib\jce.jar
Men den kommer med samme fejl :o( Jeg har tjekket at jce.jar ligger der.
Jeg forstår det ikke... :o(
Avatar billede arne_v Ekspert
17. januar 2003 - 14:00 #14
Builder du command-line ?

Hvis ja, så prøv:
  java -classpath %SystemRoot%\j2sdk1.4.0_01\jre\lib\jce.jar Encrypt.java
Avatar billede radiohead Nybegynder
18. januar 2003 - 11:24 #15
flot EXP!!!
Avatar billede viht Nybegynder
18. januar 2003 - 12:34 #16
Er der i øvrigt nogen der har en fornuftig implementering af Rijndael i Java? Med fuld key support 128/192/256. Den er ikke endnu en del af JCE og de implementeringer jeg har kunnet finde var til cryptix. Nogen der har en standalone version?
Avatar billede arne_v Ekspert
18. januar 2003 - 13:03 #17
Hmmm.

JCE indeholde AES.

Og jeg troede at Rijndael var AES ??
Avatar billede viht Nybegynder
18. januar 2003 - 13:07 #18
Ifølge sun er JCE en del af 1.4.1 apiet, men AES er IKKE en del af 1.4.1 apiet - det er ikke i security pakken.

Rijndael er AES, bare ikke officielt endnu.
Avatar billede arne_v Ekspert
18. januar 2003 - 13:21 #19
My 1.4.1 API docs say:

#Cipher
#Algorithm
#
#The following names can be specified as the algorithm component in a
#transformation when requesting an instance of Cipher:
#
#* AES: Advanced Encryption Standard as specified by NIST in a draft FIPS.
#Based on the Rijndael algorithm by Joan Daemen and Vincent Rijmen, AES is a
#128-bit block cipher supporting keys of 128, 192, and 256 bits.

Siger du at de har reserveret navnet i interfacet men ikke
implementeret det ?
Avatar billede viht Nybegynder
18. januar 2003 - 13:28 #20
Give me an example then :)
Avatar billede arne_v Ekspert
18. januar 2003 - 13:32 #21
Hmm.

Måske har du ret.

Security.addProvider(new com.sun.crypto.provider.SunJCE());
des = Cipher.getInstance("AES");

giver:

java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES
Avatar billede arne_v Ekspert
18. januar 2003 - 13:51 #22
Men efter jeg downloadede:
  http://polydistortion.net/bc/download/bcprov-jdk14-117.jar
og tilføjede den i classpath og tilføjede:
  Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
i koden, så gik det meget bedre !

:-)
Avatar billede viht Nybegynder
18. januar 2003 - 16:16 #23
Jeg havde set Bouncycastles plugin.. tror jeg arbejder videre med det.
Avatar billede arne_v Ekspert
18. januar 2003 - 16:21 #24
package test;

import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class Encrypt {
    private Cipher aes;
    private SecretKey aeskey;
    Encrypt(String key) {
        try {
            Security.addProvider(new com.sun.crypto.provider.SunJCE());
            Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
            aes = Cipher.getInstance("AES");
            aeskey = new SecretKeySpec(key.getBytes(), "AES");
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
    private byte[] encrypt(byte[] plaindata) throws Exception {
        aes.init(Cipher.ENCRYPT_MODE, aeskey);
        return aes.doFinal(plaindata);
    }

    private byte[] decrypt(byte[] cipherdata) throws Exception {
        aes.init(Cipher.DECRYPT_MODE, aeskey);
        return aes.doFinal(cipherdata);
    }
    public static void main(String[] args) throws Exception {
        Encrypt ec = new Encrypt("hemmelighemmelig");
        String s1 = "Dette er en test";
        byte[] b1 = ec.encrypt(s1.getBytes());
        byte[] b2 = ec.decrypt(b1);
        String s2 = new String(b2);
        System.out.println(s2);

    }
}
Avatar billede viht Nybegynder
18. januar 2003 - 17:40 #25
Ja, det virker jo fint... men hvad med krypteringsstyrken? Er det bestemt ud fra længden på aeskey ? < 128/192/256 aeskey += 0;?
Avatar billede arne_v Ekspert
18. januar 2003 - 17:45 #26
API doc siger:

public SecretKeySpec(byte[] key,
                    String algorithm)

    Constructs a secret key from the given byte array.

This constructor does not check if the given bytes indeed specify a secret key of the specified algorithm. For example, if the algorithm is DES, this constructor does not check if key is 8 bytes long, and also does not check for weak or semi-weak keys. In order for those checks to be performed, an algorithm-specific key specification class (in this case: DESKeySpec) should be used.

som jeg læser det, så er det din opgave at kalde med en key af korrekt
længde.

Men der er også andre måder at generere keys på. Det her er
bare den det kræver mindst indtastning.
Avatar billede viht Nybegynder
18. januar 2003 - 20:07 #27
Det viser sig dog at noget går galt når større mængder tekst krypteres... dekrypteringen er næppe rigtig:

Ren tekst:
This constructor does not check if the given bytes indeed specify a secret key of the specified algorithm. For example, if the algorithm is DES, this constructor does not check if key is 8 bytes long, and also does not check for weak or semi-weak keys. In order for those checks to be performed, an algorithm-specific key specification class (in this case: DESKeySpec) should be used.

Krypteret:
---------- BEGIN ENCRYPTED MESSAGE ----------
Õ…—>r,TCž*ΣíЖÈ>p˜/ªˆ<?F~Ïw5w±ôuŪ&#65533;ò—=nH*hùÿ7–³Gü—ÈzÉ–nIçAgñ¾KJ`ʤÌÑKÍ›Ü@<)_eo¸îrƒÄðþšÌ    c­§J²ý_B»+D&#65533;[¸ã~[‰c¸è¨çæd·¥ƒ¦û?
BV·­˜‘k‰´îUýÑs±“!Úh:]
Ò0XÿA&#65533;Ï&#65533;],}¹™&#65533;“t˜‰éZH–`|XVhDw‰Ã&#65533;wƒ :Þ—
Cr­»N·¬yìÚlößuÜ+SAÊ>¿]Ál%ÍäÙ¼Í&#65533;íJƒôÕÒñ¬#ºÖöcÛtÞžÑ"Û!ÇõõáßlÇüU¿¥Ó3/O´”kñŒ>e[?»zbcšQÞîTïL©Èû…óAQÒ†R,•oŸGzt×q7ØOíåº4¢DžœÑÌÚ&#65533;ywŒf'òV&#65533;ÀXÿÐe^øÖi0yÆ«‚fQ¢‚véwžó~fÈìÑ69?iûû^oR7ä ‡xO,ë"&›)
----------  END ENCRYPTED MESSAGE  ----------

Dekrypteret:
This constructor does not check 9ôó{! Tñ,¯es indeed specify a secret key of the specified algorithm. For e‰
óÓ»šuÞíC    &#65533;ÒIÚlgorithm is DES, this constructoμM«SEûf^{ʦ‘Õ if key is 8 bytɈw    ¶$<îºî,I•o does not check›—6Ð@nËõû¦„×­ƒÛ)i-weak keys. In order for those checks to be performed, an algorithm-specific key specification çÔ+)&jã5·^ ase: DESKeySpec) should be used.

Den ødelagte tekst kommer i blokke efterfulgt af ren tekst.. jeg ser ingen mening i det.
Avatar billede viht Nybegynder
18. januar 2003 - 20:09 #28
Det gælder i øvrigt både for 128, 192 og 256 bit nøgler.
Avatar billede arne_v Ekspert
18. januar 2003 - 20:13 #29
Mystisk.

Jeg har lige prøvet med 800 tegn. Ingen fejl.
Avatar billede viht Nybegynder
18. januar 2003 - 20:27 #30
Kan det være fordi jeg grabber den krypterede tekst fra et JTextArea?
Avatar billede arne_v Ekspert
18. januar 2003 - 20:31 #31
Hmm.

Det burde jo ikke gøre nogen forskel.

Virker dette program hos dig:

package test;

import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class Encrypt {
    private Cipher aes;
    private SecretKey aeskey;
    Encrypt(String key) {
        try {
            Security.addProvider(new com.sun.crypto.provider.SunJCE());
            Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
            aes = Cipher.getInstance("AES");
            aeskey = new SecretKeySpec(key.getBytes(), "AES");
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
    private byte[] encrypt(byte[] plaindata) throws Exception {
        aes.init(Cipher.ENCRYPT_MODE, aeskey);
        return aes.doFinal(plaindata);
    }

    private byte[] decrypt(byte[] cipherdata) throws Exception {
        aes.init(Cipher.DECRYPT_MODE, aeskey);
        return aes.doFinal(cipherdata);
    }
    public static void main(String[] args) throws Exception {
        Encrypt ec = new Encrypt("hemmelighemmelig");
        String s1 = "1234567890123456789012345678901234567890" +
                    "1234567890123456789012345678901234567890" +
                    "1234567890123456789012345678901234567890" +
                    "1234567890123456789012345678901234567890" +
                    "1234567890123456789012345678901234567890" +
                    "1234567890123456789012345678901234567890" +
                    "1234567890123456789012345678901234567890" +
                    "1234567890123456789012345678901234567890" +
                    "1234567890123456789012345678901234567890" +
                    "1234567890123456789012345678901234567890" +
                    "1234567890123456789012345678901234567890" +
                    "1234567890123456789012345678901234567890" +
                    "1234567890123456789012345678901234567890" +
                    "1234567890123456789012345678901234567890" +
                    "1234567890123456789012345678901234567890" +
                    "1234567890123456789012345678901234567890" +
                    "1234567890123456789012345678901234567890" +
                    "1234567890123456789012345678901234567890" +
                    "1234567890123456789012345678901234567890" +
                    "1234567890123456789012345678901234567890";
        byte[] b1 = ec.encrypt(s1.getBytes());
        byte[] b2 = ec.decrypt(b1);
        String s2 = new String(b2);
        System.out.println(s2);

    }
}
Avatar billede viht Nybegynder
18. januar 2003 - 23:11 #32
Ja, intet problem. MEN når det kommer på et JTextArea opstår der problemer.

// AESFrame.java:
import javax.swing.*;
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.event.*;

import javax.swing.text.*;
import javax.swing.event.DocumentListener;
import javax.swing.event.DocumentEvent;

import java.util.StringTokenizer;

public class AESFrame extends JFrame implements ActionListener {
   
    private JLabel inputLabel;
    private JLabel outputLabel;
    private JTextArea inputText;
    private JTextArea outputText;
   
    private JButton encrypt;
    private JButton decrypt;
    private JButton reset;
    private JButton copyToClipBoard;
    private JButton pasteFromClipBoard;
   
    private JMenuItem exitItem;
    private JMenuItem metalItem;
      private JMenuItem windowsItem;
  private JMenuItem motifItem;
   
    private Document inputDocument;
    private Document outputDocument;
   
    private Clipboard clipboard;
   
    private GridBagLayout layout;
   
    private AESEncrypt aes;
   
    private final String ENCRYPTION_START = "---------- BEGIN ENCRYPTED MESSAGE ----------\n";
    private final String ENCRYPTION_END =  "----------  END ENCRYPTED MESSAGE  ----------";
   
    public AESFrame() {
       
        setTitle("AES Kryptering");
        aes = new AESEncrypt();
       
        setSize(500,500);
       
        GridBagConstraints con;
        layout = new GridBagLayout();
       
        getContentPane().setLayout(layout);
       
        Insets space = new Insets(5,5,5,5);
       
        JPanel inputPanel = new JPanel(new BorderLayout());
        inputLabel = new JLabel("Input område");
        inputText = new JTextArea();
        inputText.setLineWrap(true);
        inputText.setWrapStyleWord(true);
        inputText.setBorder(BorderFactory.createEmptyBorder(2,2,2,2));
        inputDocument = inputText.getDocument();
      inputDocument.addDocumentListener(new DocumentListener() {
          public void changedUpdate(DocumentEvent e ) {
                if (e.getDocument()== inputDocument)
                      disableIfEmpty(inputDocument);
            } 
           
            public void insertUpdate( DocumentEvent e ){
                if (e.getDocument()==inputDocument)
                    disableIfEmpty(inputDocument);
            } 
           
            public void removeUpdate( DocumentEvent e ){
                if (e.getDocument()==inputDocument)
                      disableIfEmpty(inputDocument);
            } 
           
            public void disableIfEmpty(Document d) {
                encrypt.setEnabled(d.getLength() > 0);
                decrypt.setEnabled(d.getLength() > 0);
            }
        });
        inputText.getInputMap().put(KeyStroke.getKeyStroke("TAB"), "none");
       
        inputPanel.add(inputLabel, BorderLayout.NORTH);
        inputPanel.add(new JScrollPane(inputText), BorderLayout.CENTER);
       
        con = createGBC(0,0,3,1);
        con.fill = GridBagConstraints.BOTH;
        con.weightx = 1.0;
        con.weighty = 1.0;
        con.insets = space;
        add(inputPanel, con);
       
        JPanel outputPanel = new JPanel(new BorderLayout());
        outputLabel = new JLabel("Output område");
        outputText = new JTextArea();
        outputText.setLineWrap(true);
        outputText.setWrapStyleWord(true);
        outputText.setEditable(false);
        outputText.setBorder(BorderFactory.createEmptyBorder(2,2,2,2));
      outputDocument = outputText.getDocument();
      outputDocument.addDocumentListener(new DocumentListener() {
          public void changedUpdate(DocumentEvent e ) {
                if (e.getDocument()== outputDocument)
                      disableIfEmpty(outputDocument);
            } 
           
            public void insertUpdate( DocumentEvent e ){
                if (e.getDocument()==outputDocument)
                    disableIfEmpty(outputDocument);
            } 
           
            public void removeUpdate( DocumentEvent e ){
                if (e.getDocument()==outputDocument)
                      disableIfEmpty(outputDocument);
            } 
           
            public void disableIfEmpty(Document d) {
                copyToClipBoard.setEnabled(d.getLength() > 0);
            }
        });
   
        outputPanel.add(outputLabel, BorderLayout.NORTH);
        outputPanel.add(new JScrollPane(outputText), BorderLayout.CENTER);
       
        con = createGBC(0,1,3,1);
        con.fill = GridBagConstraints.BOTH;
        con.weightx = 1.0;
        con.weighty = 1.0;
        con.insets = space;
        add(outputPanel, con);
       
        JPanel buttonPanel = new JPanel();
        encrypt = new JButton("Krypter");
        encrypt.addActionListener(this);
        decrypt = new JButton("Dekrypter");
        decrypt.addActionListener(this);
        reset = new JButton("Reset");
        reset.addActionListener(this);
        copyToClipBoard = new JButton("Kopiér");
        copyToClipBoard.addActionListener(this);
        pasteFromClipBoard = new JButton("Sæt ind");
        pasteFromClipBoard.addActionListener(this);
        encrypt.setEnabled(false);
        decrypt.setEnabled(false);
        copyToClipBoard.setEnabled(false);
       
        encrypt.setToolTipText("Krypterer teksten i inputfeltet");
        decrypt.setToolTipText("Dekrypterer teksten i inputfeltet");
        reset.setToolTipText("Nulstiller alle felter");
        copyToClipBoard.setToolTipText("Kopierer ouputfeltets tekst til udklipsholderen");
        pasteFromClipBoard.setToolTipText("Sætter udklipsholderens data ind i inputfeltet");
       
        buttonPanel.add(encrypt);
        buttonPanel.add(decrypt);
        buttonPanel.add(reset);
        buttonPanel.add(copyToClipBoard);
        buttonPanel.add(pasteFromClipBoard);

        con = createGBC(0,2,3,1);
        con.anchor = GridBagConstraints.CENTER;
        add(buttonPanel, con);
       
        JMenuBar menuBar = new JMenuBar();
       
        JMenu fileMenu = new JMenu(("Filer"));
        fileMenu.setMnemonic(KeyEvent.VK_F);
        exitItem = new JMenuItem("Afslut");
        exitItem.setMnemonic(KeyEvent.VK_A);
        exitItem.addActionListener(this);
        fileMenu.add(exitItem);
        menuBar.add(fileMenu);
       
        JMenu lookAndFeelMenu = new JMenu("Udseende");
       
        metalItem = new JRadioButtonMenuItem("Metal", true);
        metalItem.setMnemonic(KeyEvent.VK_M);
        metalItem.addActionListener(this);
        metalItem.setEnabled(false);
       
        windowsItem = new JRadioButtonMenuItem("Windows");
        windowsItem.setMnemonic(KeyEvent.VK_W);
        windowsItem.addActionListener(this);
        windowsItem.setEnabled(false);
       
        motifItem = new JRadioButtonMenuItem("Motif");
        motifItem.setMnemonic(KeyEvent.VK_O);
        motifItem.addActionListener(this);
        motifItem.setEnabled(false);
       
        ButtonGroup group = new ButtonGroup();
        group.add(metalItem);
        group.add(windowsItem);
        group.add(motifItem);
       
        lookAndFeelMenu.add(metalItem);
        lookAndFeelMenu.add(windowsItem);
        lookAndFeelMenu.add(motifItem);
        menuBar.add(lookAndFeelMenu);
       
        setJMenuBar(menuBar);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
               
    }
   
    public void actionPerformed(ActionEvent event) {
       
        if( event.getSource() == encrypt ) {
            String toEncrypt = inputText.getText();
            outputText.setText("");
        //    outputText.append(ENCRYPTION_START);
            try {
                outputText.append(new String(aes.encrypt(toEncrypt.getBytes())));
            }
            catch(Exception e) {
                System.out.println (e);
            }
        //    outputText.append("\n"+ENCRYPTION_END);
        }

        else if( event.getSource() == decrypt ) {
            String toDecrypt = inputText.getText();
            outputText.setText("");
            try {
                outputText.append(new String(aes.decrypt(toDecrypt.getBytes())));
            }
            catch(Exception e) {
                System.out.println (e);
            }
        }
        else if( event.getSource() == reset ) {
            inputText.setText("");
            outputText.setText("");
        }
        else if( event.getSource() == copyToClipBoard ) {
          if (clipboard == null)
            clipboard = getToolkit().getSystemClipboard();
        StringSelection data = new StringSelection (outputText.getText());
        clipboard.setContents (data, data);
        }
        else if( event.getSource() == pasteFromClipBoard ) {
            if (clipboard == null)
            clipboard = getToolkit().getSystemClipboard();
            Transferable clipData = clipboard.getContents(this);
        String stringValue = "";
        try {
            stringValue = (String)(clipData.getTransferData(DataFlavor.stringFlavor));
        }
        catch (UnsupportedFlavorException ufe) {
            System.out.println (ufe);
          }
          catch( java.io.IOException ioe ) {
              System.out.println (ioe);
          }

          inputText.setText(stringValue);
        }
        else if( event.getSource() == exitItem ) {
            System.exit(0);
        }
        else if( event.getSource() == metalItem ) {
            setLookAndFeel(1);
        }
        else if( event.getSource() == windowsItem ) {
            setLookAndFeel(2);
        }
        else if( event.getSource() == motifItem ) {
            setLookAndFeel(3);
        }
    }
   
    private void setLookAndFeel(int type) {
          String laf = "javax.swing.plaf.metal.MetalLookAndFeel";
          switch(type) {
          case 1: {
                laf = "javax.swing.plaf.metal.MetalLookAndFeel";
          } break;
          case 2: {
              laf = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
            } break;
          case 3: {
              laf = "com.sun.java.swing.plaf.motif.MotifLookAndFeel";
          } break;
          }
        try {
          UIManager.setLookAndFeel(laf);
          SwingUtilities.updateComponentTreeUI(this);
          }
          catch(ClassNotFoundException cnfe) {
          System.out.println (cnfe);
          }
          catch( InstantiationException ie ) {
              System.out.println (ie);
          }
          catch( IllegalAccessException iae ) {
              System.out.println (iae);
          }
          catch( UnsupportedLookAndFeelException ulfe ) {
              System.out.println (ulfe);
          }
    }
   
    private GridBagConstraints createGBC( int x, int y, int width, int height ) {
      GridBagConstraints gbc = new GridBagConstraints();
 
        gbc.gridx = x;
        gbc.gridy = y;
 
        gbc.gridwidth = width;
        gbc.gridheight = height;
 
        return gbc;
    }

    private void add( JComponent component, GridBagConstraints gbc ) {
        layout.setConstraints( component, gbc );
        getContentPane().add( component );
    }
}

// AESEncrypt.java
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;

public class AESEncrypt {
    private Cipher aes;
    private SecretKey aeskey;
    private String key = "ABCDEFGHABCDEFGHABCDEFGHABCDEFGH";
    public AESEncrypt() {
        try {
            Security.addProvider(new com.sun.crypto.provider.SunJCE());
            Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
            aes = Cipher.getInstance("AES");
            aeskey = new SecretKeySpec(key.getBytes(), "AES");
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
    public byte[] encrypt(byte[] plaindata) throws Exception {
        aes.init(Cipher.ENCRYPT_MODE, aeskey);
        byte[] retur = aes.doFinal(plaindata);
        System.out.println (new String(retur));
        return retur;
    }

    public byte[] decrypt(byte[] cipherdata) throws Exception {
        aes.init(Cipher.DECRYPT_MODE, aeskey);
        byte[] retur = aes.doFinal(cipherdata);
        System.out.println (new String(retur));
        return retur;
    }
}

// StartAES.java
public class StartAES {
   
    public static void main(String[] args) {
       
        javax.swing.JFrame.setDefaultLookAndFeelDecorated(true);
        AESFrame frame = new AESFrame();
        frame.setLocation(150,150);
        frame.show();
    }
}
Avatar billede arne_v Ekspert
18. januar 2003 - 23:59 #33
Jeg får forskellige exceptions, når jeg forsøger at køre det.

Bl.a.:
  javax.crypto.BadPaddingException: pad block corrupted

Så et eller andet virker ikke som det skal !
Avatar billede arne_v Ekspert
19. januar 2003 - 00:10 #34
public void actionPerformed(ActionEvent event) {

        if( event.getSource() == encrypt ) {
            String toEncrypt = inputText.getText();
System.out.println("L1=" + toEncrypt.length());
            outputText.setText("");
        //    outputText.append(ENCRYPTION_START);
            try {
System.out.println("L2=" + aes.encrypt(toEncrypt.getBytes()).length);
                outputText.append(new String(aes.encrypt(toEncrypt.getBytes())));
            }
            catch(Exception e) {
                System.out.println (e);
            }
        //    outputText.append("\n"+ENCRYPTION_END);
        }

        else if( event.getSource() == decrypt ) {
            String toDecrypt = inputText.getText();
System.out.println("L3=" + toDecrypt.length());
            outputText.setText("");
            try {
System.out.println("L4=" + aes.decrypt(toDecrypt.getBytes()).length);
                outputText.append(new String(aes.decrypt(toDecrypt.getBytes())));
            }
            catch(Exception e) {
                System.out.println (e);
            }
        }


giver:

L1=384

L2=400

L3=384

Der er noget galt L2 og L3 skal være ens !!!!
Avatar billede arne_v Ekspert
19. januar 2003 - 00:10 #35
Jeg tror du dekrypterer den original plain og ikke det krypterede !!
Avatar billede arne_v Ekspert
19. januar 2003 - 00:12 #36
public void actionPerformed(ActionEvent event) {

        if( event.getSource() == encrypt ) {
            String toEncrypt = inputText.getText();
System.out.println("L1=" + toEncrypt.length());
            outputText.setText("");
        //    outputText.append(ENCRYPTION_START);
            try {
System.out.println("L2=" + aes.encrypt(toEncrypt.getBytes()).length);
                outputText.append(new String(aes.encrypt(toEncrypt.getBytes())));
            }
            catch(Exception e) {
                System.out.println (e);
            }
        //    outputText.append("\n"+ENCRYPTION_END);
        }

        else if( event.getSource() == decrypt ) {
            String toDecrypt = outputText.getText();
System.out.println("L3=" + toDecrypt.length());
            inputText.setText("");
            try {
System.out.println("L4=" + aes.decrypt(toDecrypt.getBytes()).length);
                inputText.append(new String(aes.decrypt(toDecrypt.getBytes())));
            }
            catch(Exception e) {
                System.out.println (e);
            }
        }

nu får jeg den samme fejlagtige kryptering som du referede til.
Avatar billede arne_v Ekspert
19. januar 2003 - 00:23 #37
Problemet er lokaliseret.

Når du gemmer de kryptererde data i outputText, så er Swing
så "venlig" at konvertere diverse non-printable karakterer til
"?" !

Det virker ikke så godt. Men er næppe et reelt problem, da krypterede
jo ikke skal vises i en GUI.

Du kan selv se det med:

    byte[] b2 = null;
    byte[] b3 = null;
    public void actionPerformed(ActionEvent event) {
        if( event.getSource() == encrypt ) {
            String toEncrypt = inputText.getText();
System.out.println("L1=" + toEncrypt.length());
            outputText.setText("");
        //    outputText.append(ENCRYPTION_START);
            try {
System.out.println("L2=" + aes.encrypt(toEncrypt.getBytes()).length);
b2 = aes.encrypt(toEncrypt.getBytes());
                outputText.append(new String(aes.encrypt(toEncrypt.getBytes())));
            }
            catch(Exception e) {
                System.out.println (e);
            }
        //    outputText.append("\n"+ENCRYPTION_END);
        }

        else if( event.getSource() == decrypt ) {
            String toDecrypt = outputText.getText();
System.out.println("L3=" + toDecrypt.length());
b3 = toDecrypt.getBytes();
for(int i = 0; i < b2.length; i++) {
    if(b2[i] != b3[i]) System.out.println(i + ": " + b2[i] + " != " + b3[i]);
}
            inputText.setText("");
            try {
System.out.println("L4=" + aes.decrypt(toDecrypt.getBytes()).length);
                inputText.append(new String(aes.decrypt(toDecrypt.getBytes())));
            }
            catch(Exception e) {
                System.out.println (e);
            }
        }
Avatar billede arne_v Ekspert
19. januar 2003 - 00:25 #38
Og viht jeg tror at:
  - du skylder trp79 en undskyldning for at have shanghajet hans spørgsmål
  - du muligvis skylder mig lidt point

:-)
Avatar billede viht Nybegynder
19. januar 2003 - 08:12 #39
Ja, undskyld mange gange.
Avatar billede trp79 Nybegynder
21. januar 2003 - 13:08 #40
Tilbage efter weekend....

No prob vith :) Måske jeg kan bruge det hvis jeg nogensinde får den til at ville compile....! Når jeg prøver med Arnes: java -classpath %SystemRoot%\j2sdk1.4.0_01\jre\lib\jce.jar Encrypt.java får jeg følgende fejl: "Registry key 'Software\JavaSoft\Java Runtime Environment\CurrentVersion has value 1.3, but 1.4 is required.
Error: could not find java.dll
Error: could not find Java 2 Runtime Environment."
Kan ikke forstå den brokker sig over at det ikke er 1.4.
What dælen do i do?
Avatar billede arne_v Ekspert
21. januar 2003 - 14:29 #41
Hvilken version compiler du med ?

Det lyder næsten som om du forsøger at compile med 1.3.1 compiler og
en JCE fra 1.4.0 !
Avatar billede arne_v Ekspert
21. januar 2003 - 14:30 #42
Compile med 1.4.0 og brug 1.4.0 JCE så bør det virke.
Avatar billede trp79 Nybegynder
21. januar 2003 - 22:23 #43
Jeg har nu afinstalleret J2SE v 1.4.0_01 og installeret J2SE v 1.4.1_01 (og desuden også installeret Java(TM) 2 Platform, Enterprise Edition 1.4 Beta)

Men jeg får desværre stadig en fejl (heldigvis en ny een:o)
"package org.bouncycastle.jce.provider does not exist
            Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());"

Hvad kan denne fejl skyldes?

(Jeg har tilrettet min classpath)   

Det er vist ved at være point tid til point til jer...
Avatar billede trp79 Nybegynder
21. januar 2003 - 22:23 #44
(jer = arne_v og carstenknudsen)
Avatar billede arne_v Ekspert
21. januar 2003 - 22:47 #45
Du har added bouncy castle jar til classpath ?
Avatar billede arne_v Ekspert
21. januar 2003 - 22:52 #46
Og du behøver kun Bouncy Castle hvis du vælger en af de algoritmer der ikke
er i SUN provider.

(SUN har DES men ikke AES)
Avatar billede trp79 Nybegynder
21. januar 2003 - 23:02 #47
Har fundet ud af fejlen, og du havde ret arne, det var min Classpath. Jeg troede at %systemroot% betød c: men det er åbenbart c:\windows
Mange tak for al den ekstra hjælp :o) Nu funker min j2ee også :o)
Avatar billede arne_v Ekspert
29. juni 2003 - 22:48 #48
En lille note: JDK 1.4.2 er lige releaset og skulle inkludere AES.
Avatar billede simonvalter Praktikant
29. juni 2003 - 22:52 #49
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester