我试图使用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。运行(未知源)
这里有几个问题。
>
输入密码后,会出现异常,如无效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:我的安装是综合的。