当前位置: 首页 > 知识库问答 >
问题:

使用AESJava加密

曹恩
2023-03-14

我试图使用AES类做一个加密系统:

package Source;
import java.security.MessageDigest;
import java.util.Arrays;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.spec.IvParameterSpec;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class AES {
  static String IV = "AAAAAAAAAAAAAAAA";
  static String plaintext = "test text 123\0\0\0"; /*Note null padding*/
  static String encryptionKey = "H4tch4repratygonetowil5h4kers";
  public static void main(String [] args) {
    try {

      System.out.println("==Java==");
      System.out.println("plain:   " + plaintext);

      byte[] cipher = encrypt(plaintext, encryptionKey);

      System.out.print("cipher:  ");
      for (int i=0; i<cipher.length; i++)
        System.out.print(new Integer(cipher[i])+" ");
      System.out.println("");

      String decrypted = decrypt(cipher, encryptionKey);

      System.out.println("decrypt: " + decrypted);

    } catch (Exception e) {
      e.printStackTrace();
    } 
  }

  public static byte[] encrypt(String plainText, String encryptionKey) throws Exception {
    Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding", "SunJCE");
    SecretKeySpec key = new SecretKeySpec(encryptionKey.getBytes("UTF-8"), "AES");
    cipher.init(Cipher.ENCRYPT_MODE, key,new IvParameterSpec(IV.getBytes("UTF-8")));
    return cipher.doFinal(plainText.getBytes("UTF-8"));
  }

  private static String decrypt(byte[] cipherText, String encryptionKey) throws Exception{
    Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding", "SunJCE");
    SecretKeySpec key = new SecretKeySpec(encryptionKey.getBytes("UTF-8"), "AES");
    cipher.init(Cipher.DECRYPT_MODE, key,new IvParameterSpec(IV.getBytes("UTF-8")));
    return new String(cipher.doFinal(cipherText),"UTF-8");
  }
}

下面是我的代码实现:

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JButton;
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JTextPane;


import Source.AES;
import javax.swing.JTextField;
import javax.swing.JPasswordField;
import javax.swing.JTextArea;

public class first {

    private JFrame frame;
    private JPasswordField passwordField;
    private JTextArea txtrEnterTextHere;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    first window = new first();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public first() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JOptionPane.showMessageDialog(null, "Welcome to Encryption System! ");
        JButton btnNewButton = new JButton("Send Info");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {

                String text = txtrEnterTextHere.getText();
                String pass = passwordField.getText();
                String str = null;
                try {
                    str = new String(AES.encrypt(text, pass));
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                txtrEnterTextHere.setText(str);

                JOptionPane.showMessageDialog(null, "Your intel has been encrypted!");

            }
        });
        frame.getContentPane().add(btnNewButton, BorderLayout.NORTH);

        passwordField = new JPasswordField();
        frame.getContentPane().add(passwordField, BorderLayout.SOUTH);

        txtrEnterTextHere = new JTextArea();
        txtrEnterTextHere.setText("ENTER TEXT HERE AND PASSWORD BELLOW!");

        frame.getContentPane().add(txtrEnterTextHere, BorderLayout.CENTER);
    }

}

如何使变量'str'实际具有加密文本的值?在运行时,我得到错误和一个空字段。。。可以将字节[]更改为字符串吗?

更新错误:

JAVAlang.IllegalArgumentException:javax中的空键。加密。规范SecretKeySpec。(SecretKeySpec.java:96)在源代码处。AES。加密(AES.java:41)在第一个$2。在javax上执行的操作(first.java:62)。摆动抽象按钮。fireActionPerformed(未知源代码)在javax上执行。摆动AbstractButton$Handler。在javax上执行的操作(未知源)。摆动DefaultButtonModel。fireActionPerformed(未知源代码)在javax上执行。摆动DefaultButtonModel。javax上的setPressed(未知源)。摆动普拉夫。基本的基本按钮列表。java上的MouseRelease(未知源代码)。awt。组成部分javax上的processMouseEvent(未知源)。摆动JComponent。java上的ProcessMouseeEvent(未知源代码)。awt。组成部分java上的processEvent(未知源)。awt。容器java上的processEvent(未知源)。awt。组成部分java上的dispatchEventImpl(未知源)。awt。容器java上的dispatchEventImpl(未知源)。awt。组成部分java上的dispatchEvent(未知源)。awt。轻量级调度员。java上的retargetMouseEvent(未知源)。awt。轻量级调度员。java上的ProcessMouseeEvent(未知源代码)。awt。轻量级调度员。java上的dispatchEvent(未知源)。awt。容器java上的dispatchEventImpl(未知源)。awt。窗java上的dispatchEventImpl(未知源)。awt。组成部分java上的dispatchEvent(未知源)。awt。事件队列。java上的dispatchEventImpl(未知源)。awt。事件队列。在java上访问$500(未知来源)。awt。事件队列3美元。在java上运行(未知源代码)。awt。事件队列3美元。在java上运行(未知源代码)。安全访问控制器。java上的doPrivileged(本机方法)。安全ProtectionDomain$JavaSecurityAccessImpl。java上的doIntersectionPrivilege(未知源)。安全ProtectionDomain$JavaSecurityAccessImpl。java上的doIntersectionPrivilege(未知源)。awt。事件队列4美元。在java上运行(未知源代码)。awt。事件队列4美元。在java上运行(未知源代码)。安全访问控制器。java上的doPrivileged(本机方法)。安全ProtectionDomain$JavaSecurityAccessImpl。java上的doIntersectionPrivilege(未知源)。awt。事件队列。java上的dispatchEvent(未知源)。awt。EventDispatchThread。java上的pumpOneEventForFilters(未知源)。awt。EventDispatchThread。java上的pumpEventsForFilter(未知源)。awt。EventDispatchThread。java上的pumpEventsForHierarchy(未知源)。awt。EventDispatchThread。java上的pumpEvents(未知源)。awt。EventDispatchThread。java上的pumpEvents(未知源)。awt。EventDispatchThread。运行(未知源)

共有1个答案

杭昊空
2023-03-14

这里有几个问题。

>

输入密码后,会出现异常,如无效AES密钥长度:8字节,因为密钥应为特定长度(请参阅此处的详细信息)。

使用哈希生成密钥后,将出现以下异常-javax。加密。IllegalBlockSizeException:输入长度不是16字节的倍数,因为您的加密模式不使用填充。您可以将其更改为类似于AES/CBC/pkcs5pdadding

最后,使用以下“加密”方法,您将得到您想要的:

public static byte[] encrypt(String plainText, String encryptionKey) throws Exception {
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding", "SunJCE");
    MessageDigest sha = MessageDigest.getInstance("SHA-1");
    byte [] hashedPassword = sha.digest(encryptionKey.getBytes("UTF-8"));
    hashedPassword = Arrays.copyOf(hashedPassword, 16);
    SecretKeySpec key = new SecretKeySpec(hashedPassword, "AES");
    cipher.init(Cipher.ENCRYPT_MODE, key,new IvParameterSpec(IV.getBytes("UTF-8")));
    return cipher.doFinal(plainText.getBytes("UTF-8"));
}

(*)当然,为了解密消息,您还必须对“decrypt”方法进行类似的更改。。。

 类似资料:
  • 我需要在iPhone或iPad上加密字符串(实际上是XML文件),然后用.NET应用程序解密。感谢David Veksler在这里提出的问题“.NET和iPhone之间的AES互操作性?”,以及在这里发表的博客文章http://automagical.rationalmind.net/2009/02/12/aes-interoperability-between-net-and-iPhone/。

  • 问题内容: 我正在使用Bouncy Castle提供的库来加密,解密,签名和验证符号。我这样做是 1.加密数据 2.签名数据 3.将签名字节写入文件 4.从文件读取签名字节 5.验证签名 6.解密数据 我 从使用Java的密码学开始学了 参考 __ 我的问题是在第5步中,当我验证数据时 org.bouncycastle.cms.CMSException:消息摘要属性值与计算值不匹配 我的代码如下

  • 我正在尝试构建一个程序,该程序接收一个文件(任意大小的EXE),对其进行加密并将其复制到一个结构中。然后稍后对其进行解密,并确保其与使用时相同。 我有一个艰难的时间加密,然后解密文件。它似乎没有正确加密,我不知道如何测试它。 以下是我的问题: 我在这里做错了什么? 是否有更好的库使用AES加密?或者我应该坚持openSSL 让我们说我想用另一个键说“你好世界”。我能不能用这个字符串作为加密算法的参

  • 我对Java知之甚少。请帮忙

  • 我试图保存到带有加密字段的表,但找不到R2DBC支持。 加密列的图像 发现类似问题,但未使用R2DBC 使用Azure Key Vault和Spring Boot的SQL Server列加密 JDBC文档它解释了如何做到这一点,但我没有发现与R2DBC类似的东西 https://docs.microsoft.com/en-us/sql/connect/jdbc/using-always-encry

  • 当我偶然发现let's加密时,我开始查看ssl证书,我想将其与gitlab一起使用,但是由于它在树莓pi 2上运行,并且现在运行得非常完美(所以我不想搞砸任何事情),他会让我正确安装let加密ssl证书吗?PS:我的安装是综合的。