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?
Quel est l'objectif du programme? Qu'essayez-vous d'accomplir? – ewernli