2009-12-16 13 views
2

J'ai un programme Java. ceci est un programme de chiffrement AES - décryptage. le programme a une interface utilisateur graphique avec la chaîne d'entrée de can et montre la chaîne cryptée par AES. le programme montre également la chaîne originale en utilisant la fonction de décryptage écrite dans le code. l'interface est telle que lorsque la chaîne est entrée et que le bouton de conversion est cliqué, le résultat crypté et déchiffré est affiché dans un panneau. voici le programme.Cryptage AES - comment décrypter plus tard la chaîne cryptée?

import java.awt.event.*; 
import java.awt.*; 
import javax.swing.*; 
import java.security.*; 
import javax.crypto.*; 
import javax.crypto.spec.*; 
import java.io.*; 

public class AESGUI extends JPanel { 

    public static void main(String[] args) { 
     JFrame frame = new JFrame("AES Encryption"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setPreferredSize(new Dimension(600,300)); 

     frame.setLocationRelativeTo(null); 
     frame.setResizable(false); 

     AESGUI p = new AESGUI(); 

     frame.getContentPane().add(p); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private JTextField in; 
    private JTextArea out; 

    public AESGUI() { 
     JLabel info = new JLabel("Type any String"); 
     in = new JTextField(20); 
     JButton encrypt = new JButton("Encrypt"); 
     out = new JTextArea(10,40); 

     out.setEditable(false); 

     encrypt.addActionListener(new encryptListener()); 
     in.addActionListener(new encryptListener()); 

     add(info); 
     add(in); 
     add(encrypt); 
     add(out); 
     add(new JScrollPane(out)); 
    } 

    private class encryptListener implements ActionListener { 
     public void actionPerformed(ActionEvent e) { 
      String data = in.getText(); 
      if (data.length() == 0) { } 
      else 
       try { 
        String en = encrypt(data); 
        out.append("Encrypted string: " + en + "\n"); 
        out.append("Original String: " + decrypt(en) + "\n\n"); 
       } catch(Exception ex) { } 
     } 
    } 

    public String asHex(byte[] buf) { 
     StringBuffer strbuf = new StringBuffer(buf.length * 2); 
     int i; 
     for (i = 0; i < buf.length; i++) { 
      if (((int) buf[i] & 0xff) < 0x10) 
       strbuf.append("0"); 
      strbuf.append(Long.toString((int) buf[i] & 0xff, 16)); 
     } 
     return strbuf.toString(); 
    } 

    private SecretKeySpec skeySpec; 
    private Cipher cipher; 
    private byte[] encrypted; 

    public String encrypt(String str) throws Exception { 
     // Get the KeyGenerator 
     KeyGenerator kgen = KeyGenerator.getInstance("AES"); 
     kgen.init(128); // 192 and 256 bits may not be available 

     // Generate the secret key specs. 
     SecretKey skey = kgen.generateKey(); 
     byte[] raw = skey.getEncoded(); 
     skeySpec = new SecretKeySpec(raw, "AES"); 

     // Instantiate the cipher 
     cipher = Cipher.getInstance("AES"); 

     cipher.init(Cipher.ENCRYPT_MODE, skeySpec); 

     encrypted = cipher.doFinal(str.getBytes()); 
     return asHex(encrypted); 
    } 

    public String decrypt(String str) throws Exception { 
     cipher.init(Cipher.DECRYPT_MODE, skeySpec); 
     byte[] original = cipher.doFinal(encrypted); 
     String originalString = new String(original); 
     return originalString; 
    } 

} 

ce programme ne dit pas l'utilisateur qui touche a été utilisée pour chiffrer la chaîne. car il ne dit pas la clé à l'utilisateur, l'utilisateur ne peut pas déchiffrer la chaîne chiffrée plus tard. le programme affiche la chaîne cryptée en codage hexadécimal. pour décrypter plus tard la chaîne il est préférable de changer le programme pour que le programme crée une clé secrète basée sur un mot de passe ou est-il préférable que le programme soit changé pour afficher la clé secrète générée aléatoirement à l'utilisateur en utilisant plus tard décrypter la chaîne?

+0

Quel est l'objectif du programme? Qu'essayez-vous d'accomplir? – ewernli

Répondre

1

Si l'utilisateur est l'utilisateur final réel qui utiliserait les clés de chiffrement pour déchiffrer les données chiffrées à un moment ultérieur, je ne vois rien de mal à afficher la clé pour l'utilisateur. Vous pouvez également utiliser la première option de génération de la clé de chiffrement à partir d'un mot de passe, mais si vous souhaitez que l'utilisateur déchiffre les données plus tard, vous devez lui faire entrer le mot de passe de chiffrement et générer une clé de chiffrement. (Assurez-vous également qu'il donne la clé Sme) et intime l'utilisateur.