AES加解密的JAVA实现
- 格式:doc
- 大小:189.00 KB
- 文档页数:6
1、深入理解AES加解密算法;2、用JAVA编程完成一个明文分组的加密和解密,其中密钥是十六进制,长度为128比特(32个16进制数),并且进行加密后,能够进行正确的解密。
二、实验条件1、熟悉JA V A开发环境,能熟练运用JA V A进行程序编写;2、掌握AES加解密算法知识,了解其算法原理;3、安装了JA V A环境的计算机。
三、实验背景随着对称密码的发展,3DES用软件实现速度相对较慢,它使用的64位分组长度显得不够高效和安全的缺点使得需要一种新的高级加密标准来替代它。
AES的全称是Advanced Encryption Standard,即高级加密标准。
该项目由美国国家标准技术研究所(NIST)于1997年开始启动并征集算法,在2000年确定采用Rijndael作为其最终算法,并于2001年被美国商务部部长批准为新的联邦信息加密标准(FIPS PUB 197),该标准的正式生效日期是2002年5月26日。
2000年10月2日,NIST对Rijndael做出了最终评估。
AES是一个迭代的、对称密钥分组的密码,它可以使用128、192和256位密钥,并且用128位(16字节)分组加密和解密数据。
与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。
通过分组密码返回的加密数据的位数与输入数据相同。
迭代加密使用一个循环结构,在该循环中重复置换(permutations)和替换(substitutions)输入数据。
1、AES 加密模块子密钥轮密钥加(AddRoundKey )明文块字节代替(SubBytes )行移位(ShiftRows )列混合(MixColumns )轮密钥加(AddRoundKey )是否最后一轮是否轮密钥加(AddRoundKey )字节代替(SubBytes )行移位(ShiftRows )密文块子密钥子密钥 字节替代:通过一个非线性的替换函数,用查找表的方式把每个字节替换成对应的字节;行移位:将矩阵中的每个横列进行循环式移位;列混合:为了充分混合矩阵中各个直行的操作,这个步骤使用线性转换来混合每行内的四个字节;轮密钥加:矩阵中的每一个自己都与该次循环的子密钥做XOR 逻辑运算;每个子密钥有密钥生成方案产生;最后一个加密循环中省略列混合步骤,而以另一个轮密钥加取代。
java 密码加密解密方法在Java中,密码的加密和解密可以通过多种方式实现。
其中,常用的方法包括使用MessageDigest类进行加密,以及使用对称加密和非对称加密算法进行加密和解密。
一种常见的密码加密方法是使用MessageDigest类进行加密。
这可以通过以下步骤实现:首先,将密码转换为字节数组。
然后,使用MessageDigest类的getInstance方法获取特定的加密算法实例,例如SHA-256或MD5。
接下来,使用update方法将密码的字节数组传递给MessageDigest实例。
最后,使用digest方法获得加密后的字节数组,并将其转换为十六进制字符串或其他格式存储在数据库或其他地方。
另一种常见的方法是使用对称加密算法,例如AES或DES。
这些算法使用相同的密钥进行加密和解密。
在Java中,可以使用javax.crypto包中的类来实现对称加密。
通常,需要生成一个密钥并将其存储在安全的地方,然后使用该密钥对密码进行加密和解密。
此外,还可以使用非对称加密算法,例如RSA。
这种方法使用公钥对数据进行加密,然后使用私钥进行解密。
在Java中,可以使用java.security包中的类来实现非对称加密。
无论使用哪种方法,都需要注意密码安全的问题。
例如,密钥的安全存储和管理,以及密码传输过程中的安全性。
另外,还需要考虑密码的哈希加盐等技术来增加密码的安全性。
总之,在Java中实现密码的加密和解密有多种方法,开发人员可以根据实际需求和安全要求选择合适的加密算法和实现方式。
希望这些信息能够帮助你更好地理解Java中密码加密解密的方法。
AES加密解密代码(key是16位)--java import javax.crypto.Cipher;import javax.crypto.spec.SecretKeySpec;import mons.codec.binary.Base64;public class AES16 {// 加密public static String Encrypt(String sSrc, String sKey) throws Exception {if (sKey == null) {System.out.print("Key为空null");return null;}// 判断Key是否为16位if (sKey.length() != 16) {System.out.print("Key长度不是16位");return null;}byte[] raw = sKey.getBytes("utf-8");SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");//"算法/模式/补码⽅式"cipher.init(Cipher.ENCRYPT_MODE, skeySpec);byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));return new Base64().encodeToString(encrypted);//此处使⽤BASE64做转码功能,同时能起到2次加密的作⽤。
}// 解密public static String Decrypt(String sSrc, String sKey) throws Exception {try {// 判断Key是否正确if (sKey == null) {System.out.print("Key为空null");return null;}// 判断Key是否为16位if (sKey.length() != 16) {System.out.print("Key长度不是16位");return null;}byte[] raw = sKey.getBytes("utf-8");SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");cipher.init(Cipher.DECRYPT_MODE, skeySpec);byte[] encrypted1 = new Base64().decode(sSrc);//先⽤base64解密try {byte[] original = cipher.doFinal(encrypted1);String originalString = new String(original,"utf-8");return originalString;} catch (Exception e) {System.out.println(e.toString());return null;}} catch (Exception ex) {System.out.println(ex.toString());return null;}}/**** @Description AES解密,加密内容转化为16位⼆进制后解密mxg20190906* @return String* @author mxg*/public static String aesDecrypt(String sSrc, String sKey) throws Exception {try {// 判断Key是否正确if (sKey == null) {System.out.print("Key为空null");return null;}// 判断Key是否为16位if (sKey.length() != 16) {System.out.print("Key长度不是16位");return null;}byte[] raw = sKey.getBytes("utf-8");SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, skeySpec);// byte[] encrypted1 = new Base64().decode(sSrc);//先⽤base64解密try {byte[] original = cipher.doFinal( parseHexStr2Byte(sSrc));String originalString = new String(original,"utf-8");return originalString;} catch (Exception e) {System.out.println(e.toString());return null;}} catch (Exception ex) {System.out.println(ex.toString());return null;}}/**将16进制转换为⼆进制* @param hexStr* @return*/public static byte[] parseHexStr2Byte(String hexStr) {if (hexStr.length() < 1)return null;byte[] result = new byte[hexStr.length()/2];for (int i = 0;i< hexStr.length()/2; i++) {int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);result[i] = (byte) (high * 16 + low);}return result;}public static void main(String[] args) throws Exception {/** 此处使⽤AES-128-ECB加密模式,key需要为16位。
JAVA加密解密之对称加密算法AESAES(Advanced Encryption Standard)是一种对称加密算法,也被称为Rijndael加密算法。
它是目前应用最广泛的加密算法之一,常用于保护数据的机密性。
AES算法是在公开的一种替代算法Rijndael的基础上,经美国国家标准与技术研究院(NIST)的认证,成为美国政府的标准加密算法。
AES算法使用固定长度的密钥来对数据进行加密和解密,密钥长度可以是128位、192位或256位。
AES算法通过对数据进行一系列的替换、转置和异或操作,以及多轮的加密处理来实现数据的加密。
加密过程可以简单地分为四个步骤:字节替换(SubBytes)、行移位(ShiftRows)、列混淆(MixColumns)和轮密钥加(AddRoundKey)。
解密过程则是加密过程的逆向操作。
字节替换(SubBytes)是AES算法的第一步,它将输入的明文字节映射到一个经过预定义的S盒(Substitution Box)变换后的值,这样可以增加数据的混淆性和扩散性。
行移位(ShiftRows)是AES算法的第二步,它将每一行的字节进行循环移位,使得输入数据的局部特征在整个加密过程中得到更好的扩散效果。
列混淆(MixColumns)是AES算法的第三步,它对输入数据的每一列进行一系列的线性变换,增加密文的随机性和混淆性。
轮密钥加(AddRoundKey)是AES算法的最后一步,它将每一轮的密钥与加密(或解密)轮次的状态矩阵进行异或操作,从而引入密钥的影响,增加数据的复杂性和随机性。
AES算法的安全性主要依赖于以下几个方面:1.替换和混淆:AES算法使用了非线性的S盒和列混淆操作,使得加密操作难以反向计算和预测。
2.扩散性:AES算法的多轮处理和行移位操作,使得每个明文字节的影响在加密过程中能够尽可能地扩散到输出密文。
3.密钥长度:AES算法支持不同长度的密钥,对于较长的密钥长度,破解算法需要更大的计算量。
JAVA实现AES的加密和解密算法AES(高级加密标准)是一种对称加密算法,可以通过Java的javax.crypto库来实现。
下面我们将介绍一种基于Java的AES加密和解密算法的实现方法。
1.导入所需的包在Java中使用AES加密和解密算法需要导入以下两个包:```import javax.crypto.Cipher;import javax.crypto.spec.SecretKeySpec;```2.创建加密和解密函数首先,我们需要创建加密函数和解密函数。
加密函数将输入的明文数据加密为密文,解密函数将输入的密文数据解密为明文。
```javaprivate static byte[] encrypt(byte[] key, byte[] data) throws ExceptionSecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);return cipher.doFinal(data);private static byte[] decrypt(byte[] key, byte[] encryptedData) throws ExceptionSecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);return cipher.doFinal(encryptedData);```3.测试加密和解密函数为了验证加密和解密函数的正确性,我们可以创建一个测试函数来测试它们。
JAVA实现AES的加密和解密算法JAVA实现AES的加密和解密算法加密模式为 AES-128-CBC1import javax.crypto.Cipher;2import javax.crypto.spec.IvParameterSpec;3import javax.crypto.spec.SecretKeySpec;45import sun.misc.BASE64Decoder;6import sun.misc.BASE64Encoder;78/**AES 是⼀种可逆加密算法,对⽤户的敏感信息加密处理9* 对原始数据进⾏AES加密后,在进⾏Base64编码转化;10*/11public class AESOperator {12/*13* 加密⽤的Key 可以⽤26个字母和数字组成14* 此处使⽤AES-128-CBC加密模式,key需要为16位。
15*/16private String sKey=”0123456789abcdef”;17private String ivParameter=”0123456789abcdef”;18private static AESOperator instance=null;19private AESOperator(){2021 }22public static AESOperator getInstance(){23if (instance==null)24 instance= new AESOperator();25return instance;26 }27// 加密28public String encrypt(String sSrc) throws Exception {29 Cipher cipher = Cipher.getInstance(“AES/CBC/PKCS5Padding”);30byte[] raw = sKey.getBytes();31 SecretKeySpec skeySpec = new SecretKeySpec(raw, “AES”);32 IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());//使⽤CBC模式,需要⼀个向量iv,可增加加密算法的强度33 cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);34byte[] encrypted = cipher.doFinal(sSrc.getBytes(“utf-8″));35return new BASE64Encoder().encode(encrypted);//此处使⽤BASE64做转码。
java aes加密方法AES(Advanced Encryption Standard)是一种高级加密标准,是一种对称加密算法,用于数据的加密和解密。
它是目前被广泛使用的加密算法之一,安全性较高。
在Java中,可以使用JCE(Java Cryptography Extension)库来实现AES加密。
以下是使用Java实现AES加密的示例代码。
1. 导入JCE库在Java中,需要先导入JCE库才能使用AES加密。
在导入JCE库之前,需要在系统中安装Java的JDK(Java Development Kit)。
2. 生成密钥在AES加密中,需要使用一个密钥来加密和解密数据。
可以使用Java中的KeyGenerator类来生成一个随机的AES密钥。
例如:```KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");keyGenerator.init(128);SecretKey secretKey = keyGenerator.generateKey();byte[] keyBytes = secretKey.getEncoded();```此代码将生成一个128位(16字节)长度的随机密钥,存储在keyBytes变量中。
3. 初始化加密器接下来,需要使用已生成的密钥来初始化加密器。
可以使用Java中的Cipher类来实现这个过程。
例如:上面的代码将生成一个Cipher加密对象,并使用生成的密钥secretKeySpec来初始化加密器。
此时,加密器已准备好加密数据。
4. 加密数据接下来,可以使用加密器将数据进行加密。
可以将要加密的数据存储在byte数组中,然后将byte数组传递给加密器进行加密。
例如:```byte[] data = "Encrypt me".getBytes("UTF-8");byte[] encryptedData = cipher.doFinal(data);```上面的代码将字符串“Encrypt me”转换为UTF-8编码的byte数组,并将byte数组传递给加密器进行加密。
java 通用的aes256加密方法摘要:1.AES256加密算法简介2.Java实现AES256加密方法3.应用场景及实例正文:一、AES256加密算法简介AES(高级加密标准,Advanced Encryption Standard)是一种对称加密算法,密钥长度分为128位、192位和256位。
AES256是其中安全性最高的一种,因其加密处理轮数更多,故安全性更高。
AES256算法主要包括以下几个部分:明文分组、密钥加密、初始向量IV、填充方式等。
二、Java实现AES256加密方法在Java中,我们可以使用Java Cryptography Extension(JCE)实现AES256加密。
以下是一个通用的Java AES256加密方法:```javaimport javax.crypto.Cipher;import javax.crypto.SecretKey;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;import java.nio.charset.StandardCharsets;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import java.util.Base64;public class AES256Util {private static final String ALGORITHM = "AES256";private static final String IV_ALGORITHM ="AES/CBC/PKCS5Padding";public static String encrypt(String secretKey, String content) { try {SecretKey key = newSecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), ALGORITHM);Cipher cipher = Cipher.getInstance(IV_ALGORITHM);byte[] iv = new byte[16];new SecureRandom().nextBytes(iv);IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);cipher.init(Cipher.ENCRYPT_MODE, key, ivParameterSpec);byte[] encryptedContent =cipher.doFinal(content.getBytes(StandardCharsets.UTF_8));returnBase64.getEncoder().encodeToString(encryptedContent);} catch (Exception e) {throw new RuntimeException("AES256 encryption failed", e);}}// 解密方法省略,参考上述加密方法的实现方式}```三、应用场景及实例1.加密文件:可以利用AES256加密算法对文件进行加密和解密,确保数据安全。
1.AES加密解密软件界面效果:2.工程目录:3.源代码:import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import javax.crypto.BadPaddingException;import javax.crypto.Cipher;import javax.crypto.IllegalBlockSizeException;import javax.crypto.KeyGenerator;import javax.crypto.NoSuchPaddingException;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;import javax.swing.JOptionPane;/*** @author【轰隆隆】**/publicclass AES {/*** AES加密算法*/public AES() {}/*** 加密* @param content 需要加密的内容* @param keyWord加密密钥* @return byte[] 加密后的字节数组*/publicstaticbyte[] encrypt(byte[] content, String keyWord) {try {KeyGeneratorkgen = KeyGenerator.getInstance("AES"); SecureRandomsecureRandom = SecureRandom.getInstance("SHA1PRNG" ); secureRandom.setSeed(keyWord.getBytes());kgen.init(128,secureRandom);SecretKeysecretKey = kgen.generateKey();byte[] enCodeFormat = secretKey.getEncoded();SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");Cipher cipher = Cipher.getInstance("AES");// 创建密码器byte[] byteContent = content;cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化byte[] result = cipher.doFinal(byteContent);return result; // 加密} catch (NoSuchPaddingException e) {JOptionPane.showConfirmDialog(null, "密码有误!", "警告!", 1); } catch (InvalidKeyException e) {JOptionPane.showConfirmDialog(null, "密码有误!", "警告!", 1);} catch (IllegalBlockSizeException e) {JOptionPane.showConfirmDialog(null, "密码有误!", "警告!", 1); } catch (BadPaddingException e) {JOptionPane.showConfirmDialog(null, "密码有误!", "警告!", 1); } catch(Exception e){JOptionPane.showConfirmDialog(null, "密码有误!", "警告!", 1);}returnnull;}/*** @param content 需要加密的内容* @param password 加密密钥* @return String 加密后的字符串*/publicstatic String encrypttoStr(byte[] content, String password){ return parseByte2HexStr(encrypt(content,password));}/**解密* @param content 待解密内容* @param keyWord解密密钥* @return byte[]*/publicstaticbyte[] decrypt(byte[] content, String keyWord) {try {KeyGeneratorkgen = KeyGenerator.getInstance("AES"); SecureRandomsecureRandom = SecureRandom.getInstance("SHA1PRNG" );secureRandom.setSeed(keyWord.getBytes());kgen.init(128,secureRandom);SecretKeysecretKey = kgen.generateKey();byte[] enCodeFormat = secretKey.getEncoded();SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES"); Cipher cipher = Cipher.getInstance("AES");// 创建密码器cipher.init(Cipher.DECRYPT_MODE, key);// 初始化byte[] result = cipher.doFinal(content);return result; // 加密} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (NoSuchPaddingException e) {JOptionPane.showMessageDialog(null, "密码有误!", "警告!", 1);} catch (InvalidKeyException e) {JOptionPane.showMessageDialog(null, "密码有误!", "警告!", 1);} catch (IllegalBlockSizeException e) {JOptionPane.showMessageDialog(null, "密码有误!", "警告!", 1);} catch (BadPaddingException e) {JOptionPane.showMessageDialog(null, "密码有误!", "警告!", 1);}returnnull;}publicstaticbyte[] decrypt(String content, String keyWord) {return decrypt(parseHexStr2Byte(content),keyWord);}/**将二进制转换成16进制* @param buf* @return String*/publicstatic String parseByte2HexStr(byte buf[]) {StringBuffersb = new StringBuffer();for (int i = 0; i<buf.length; i++) {String hex = Integer.toHexString(buf[i] & 0xFF);if (hex.length() == 1) {hex = '0' + hex;}sb.append(hex.toUpperCase());}return sb.toString();}/**将16进制转换为二进制* @param hexStr* @return byte[]*/publicstaticbyte[] parseHexStr2Byte(String hexStr) {if (hexStr.length() < 1)returnnull;byte[] result = newbyte[hexStr.length()/2];for (int i = 0;i<hexStr.length()/2; i++) {int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16); int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16); result[i] = (byte) (high * 16 + low);}return result;}/*public static void main(String[] args) {String content = "HongLonglong";String Key = "";//加密System.out.println("加密前:" + content);String encryptResult = encrypttoStr(content, Key);System.out.println("加密后:" + encryptResult);//解密byte[] decryptResult = decrypt(encryptResult,Key);System.out.println("解密后:" + new String(decryptResult));}*/}importjava.awt.Color;importjava.awt.EventQueue;importjava.awt.Font;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JPanel;importjavax.swing.JTabbedPane;importjavax.swing.SwingConstants;importjavax.swing.border.BevelBorder;importjavax.swing.border.MatteBorder;importjavax.swing.border.TitledBorder;importcom.swtdesigner.SwingResourceManager;public class AesLocher extends JFrame{/****//****//****/private static final long serialVersionUID = 1L;/*** Launch the application* @paramargs*/public static void main(String args[]){EventQueue.invokeLater(new Runnable(){public void run(){try{AesLocher frame = new AesLocher();frame.setVisible(true);} catch (Exception e){e.printStackTrace();}}});}/*** Create the frame*/publicAesLocher(){super();setResizable(false);setIconImage(SwingResourceManager.getImage(AesLocher.class, "com/yan/icon1.png"));/*Image icon = Toolkit.getDefaultToolkit().createImage(this.getClass().getResource("com/yan/icon.png"));this.setIconImage(icon);*///setIconImage(SwingResourceManager.getImage(AesLocher.class, "com/yan/icon.png"));setFont(new Font("宋体-PUA", Font.PLAIN, 28));setTitle("AES加密解密器");getContentPane().setLayout(null);setBounds(100, 100, 375, 334);//Dimension dimension = this.getSize();setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);finalJTabbedPanetabbedPane = new JTabbedPane();tabbedPane.setBounds(0, 0, 367, 307);getContentPane().add(tabbedPane);JPanel panel = new JPanel();panel.setBorder(new MatteBorder(0, 0, 0, 0, Color.black));panel.setLayout(null);tabbedPane.setFont(new Font("微软雅黑_GB2312", Font.PLAIN, 14));tabbedPane.addTab("加密", null, panel, null);finalJButton button_1 = new JButton();button_1.addActionListener(newMyLockButtonListener(panel));button_1.setIcon(SwingResourceManager.getIcon(AesLocher.class, "com/yan/unlock.png"));button_1.setText("加密到");button_1.setBounds(110, 65, 128, 128);panel.add(button_1);finalJPanel panel_2 = new JPanel();panel_2.setLayout(null);panel_2.setBorder(new TitledBorder(new BevelBorder(BevelBorder.LOWERED), "步骤", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, new Font("WST_Swed", Font.BOLD | Font.ITALIC, 16), Color.GRAY));panel_2.setBounds(10, 211, 342, 56);panel.add(panel_2);finalJLabel label = new JLabel();label.setFont(new Font("楷体_GB2312", Font.ITALIC, 14));label.setHorizontalAlignment(SwingConstants.CENTER);label.setText("找要加密的文件>>输入密钥>>找到密文存放文件夹");label.setBounds(10, 15, 322, 34);panel_2.add(label);finalJPanel panel_1 = new JPanel();panel_1.setLayout(null);tabbedPane.addTab("解密", null, panel_1, null);finalJButton button = new JButton();button.addActionListener(newMyLockButtonListener(panel_1) );button.setIcon(SwingResourceManager.getIcon(AesLocher.class, "com/yan/lock.png"));button.setText("jiemi");button.setBounds(110, 65, 128, 128);panel_1.add(button);finalJPanel panel_3 = new JPanel();panel_3.setBorder(new TitledBorder(new BevelBorder(BevelBorder.LOWERED), "步骤",TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, new Font("", Font.BOLD | Font.ITALIC, 16), Color.GRAY));panel_3.setLayout(null);panel_3.setBounds(10, 211, 342, 56);panel_1.add(panel_3);finalJLabel label_1 = new JLabel();label_1.setHorizontalAlignment(SwingConstants.CENTER);label_1.setFont(new Font("楷体_GB2312", Font.ITALIC, 14));label_1.setBackground(Color.GREEN);label_1.setBounds(10, 15, 322, 34);label_1.setText("找要解密的文件>>输入密钥>>找到明文存放文件夹");panel_3.add(label_1);//}}import java.awt.Font;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.BufferedWriter;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.FileWriter;import java.util.Arrays;import java.util.HashMap;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JFileChooser;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JTextField;import javax.swing.ProgressMonitor;import javax.swing.ProgressMonitorInputStream;import com.swtdesigner.SwingResourceManager;publicclass MyLockButtonListener implements ActionListener {JPanel panel;File sorFile;String detPathString;String keyString;JTextField jtField;JButton button;static String title;staticint con;static JLabel label;public MyLockButtonListener(JPanel panel){this.panel=panel;}publicvoid actionPerformed(ActionEvent e){JFileChooserfDialog = new JFileChooser();int b = fDialog.showOpenDialog(panel);this.button = (JButton )e.getSource();if(b == JFileChooser.APPROVE_OPTION){JLabeljla =new JLabel(new ImageIcon(ClassLoader.getSystemResource("com/yan/key.pn g")));jla.setBounds(0,0,128,128);sorFile = fDialog.getSelectedFile();panel.remove(panel.getComponentAt(110, 65));jtField = new JTextField();label = new JLabel(title="字节数:");label.setFont(new Font("微软雅黑_GB2312",YOUT_NO_LIMIT_CONTEXT, 17));label.setBounds(140,34,76,39);panel.add(label);panel.add(jla);jtField.addKeyListener(new KeyAdapter(){publicvoid keyPressed(KeyEvent e){if(!(e.getSource() instanceof MouseEvent)){con =jtField.getText().getBytes().length+1;MyLockButtonListener.title+=con;bel .setText(title);title="字节数:";}}});jtField.setBounds(60,90,252,22);panel.add(jtField);JButton button = new JButton("确定");button.setBounds(panel.getWidth()/2-56,118,106,28);panel.add(button);button.addMouseListener(new MyMouseadapter());panel.updateUI();}}class MyMouseadapter extends MouseAdapter{publicvoid mouseClicked(MouseEvent e){keyString = jtField.getText();if(jtField.getText().equals("")||jtField.getText()==null){JOptionPane.showMessageDialog(null, "请你输入密码!", "警告", 1);}else{JPaneljp =(JPanel)panel.getComponentAt(10,211);panel.removeAll();panel.add(jp);JButtonjButton = new JButton();jButton.setIcon(SwingResourceManager.getIcon(AesLocher.class, (button.getText().equals("jiemi")?"com/yan/unlock.png":"com/yan/lock .png")));jButton.setBounds(110, 65, 128, 128);jButton.addMouseListener(new MyunlockPath());panel.add(jButton);panel.updateUI();}}}class MyunlockPath extends MouseAdapter{publicvoid mouseClicked(MouseEvent e){JFileChooserfDialog = new JFileChooser();int b = fDialog.showSaveDialog(panel);if(b==JFileChooser.APPROVE_OPTION){detPathString=fDialog.getSelectedFile().getPath();//System.out.println(detPathString);panel.remove(panel.getComponentAt(110, 65));JLabel jLabel1 = new JLabel();jLabel1.setText("源文件:"+sorFile.getPath());jLabel1.setHorizontalTextPosition(JLabel.LEFT);JLabel jLabel2 = new JLabel();jLabel2.setText("密钥:"+keyString);jLabel2.setHorizontalTextPosition(JLabel.LEFT);JLabel jLabel3 = new JLabel();jLabel3.setText("保存路径:"+detPathString);jLabel3.setHorizontalTextPosition(JLabel.LEFT);jLabel1.setBounds(10,40,342,18);jLabel2.setBounds(10,64,342,18);jLabel3.setBounds(10,88,342,18);panel.add(jLabel1);panel.add(jLabel2);panel.add(jLabel3);JButtonstartButton = new JButton("开始");startButton.addMouseListener(new saveButtonListener());startButton.setBounds(119,112,106,28);panel.add(startButton);panel.updateUI();}}}class saveButtonListener extends MouseAdapter{finalstaticint bufferUnit = 1024;int bufferSize;publicvoid mouseClicked(final MouseEvent e){((JButton)e.getSource()).setEnabled(false);new Thread(){publicvoid run(){ProgressMonitor progress =null;try{BufferedInputStream in=null;BufferedOutputStream out=null;in =new BufferedInputStream(new FileInputStream(sorFile));ProgressMonitorInputStreamdatainInputStream =new ProgressMonitorInputStream(null,button.getText().equals("jiemi")? "文件解密中...":"文件加密中...",in);progress =datainInputStream.getProgressMonitor();progress.setMillisToDecideToPopup(0);out =new BufferedOutputStream(new FileOutputStream(detPathString));if(button.getText().equals("jiemi")){HashMap<Integer, Integer>hm = new HashMap<Integer, Integer>();hm.put((int)'G',bufferUnit);hm.put((int)'H',10*bufferUnit);hm.put((int)'I',100*bufferUnit);hm.put((int)'J',512*bufferUnit);bufferSize =hm.get(datainInputStream.read());}else{out.write(decbuffersize(datainInputStream.available()));}String midTemp = "";String prefixTempString = "";String postfixTempString="";byte[] b2 =null;int len=0;byte[] bytes = newbyte[bufferSize];while((len =datainInputStream.read(bytes))!=-1){byte[] b = Arrays.copyOf(bytes, len);if(button.getText().equals("jiemi")){int index = byteArrayIndexOf(b,"|".getBytes()[0]);if(index==-1){midTemp+=newString(b);}else{b2 =Arrays.copyOfRange(b, 0, index);if(b2!=null){postfixTempString = new String(b2);}String enCodeBlock = prefixTempString+midTemp+postfixTempString;midTemp = "";out.write(AES.decrypt(enCodeBlock, keyString));b2=Arrays.copyOfRange(b, index+1, b.length);if(b2!=null){prefixTempString=new String(b2);}}}else{String str =AES.encrypttoStr(b, keyString);out.write(str.getBytes());out.write("|".getBytes());}}if(!(button.getText().equals("jiemi"))){BufferedWriterbWriter =new BufferedWriter(new FileWriter(new File(newFile(detPathString).getParent(),"key.txt")));bWriter.write(keyString);bWriter.flush();bWriter.close();}out.flush();out.close();in.close();}catch (Exception e) {progress.close();//e.printStackTrace();}((JButton)e.getSource()).setText("完成!");}}.start();}publicint byteArrayIndexOf(byte[] bt,byte by){//ArrayList<Integer> list = new ArrayList<Integer>();for(int i=0;i<bt.length;i++){if(bt[i]==by){return i;}}return -1;}publicint decbuffersize (int s){int defBuffersize = 1024*1024;if(s<defBuffersize){bufferSize = bufferUnit;return'G';}elseif(s<10*defBuffersize){bufferSize = 10*bufferUnit;return'H';}elseif(s<100*defBuffersize){bufferSize = 100*bufferUnit;return'I';}else{bufferSize = 512*bufferUnit;return'J';}}}}。
实现功能:已知明文为0123456789ABCDEF的ASCII码表示的128比特* 密钥是0101101100001110的12次重复构成的192比特密钥* 编写AES的加解密程序,对明文进行加密,并进行解密验证1.程序结构2.运行结果3.源代码<1>.AESclass类:public class AESclass {private byte[][] sbox={{99,124,119,123,-14,107,111,-59,48,1,103,43,-2,-41,-85,118},{-54,-126,-55,125,-6,89,71,-16,-83,-44,-94,-81,-100,-92,114,-64},{-73,-3,-109,38,54,63,-9,-52,52,-91,-27,-15,113,-40,49,21},{4,-57,35,-61,24,-106,5,-102,7,18,-128,-30,-21,39,-78,117},{9,-125,44,26,27,110,90,-96,82,59,-42,-77,41,-29,47,-124},{83,-47,0,-19,32,-4,-79,91,106,-53,-66,57,74,76,88,-49},{-48,-17,-86,-5,67,77,51,-123,69,-7,2,127,80,60,-97,-88},{81,-93,64,-113,-110,-99,56,-11,-68,-74,-38,33,16,-1,-13,-46},{-51,12,19,-20,95,-105,68,23,-60,-89,126,61,100,93,25,115},{96,-127,79,-36,34,42,-112,-120,70,-18,-72,20,-34,94,11,-37},{-32,50,58,10,73,6,36,92,-62,-45,-84,98,-111,-107,-28,121},{-25,-56,55,109,-115,-43,78,-87,108,86,-12,-22,101,122,-82,8},{-70,120,37,46,28,-90,-76,-58,-24,-35,116,31,75,-67,-117,-118},{112,62,-75,102,72,3,-10,14,97,53,87,-71,-122,-63,29,-98},{-31,-8,-104,17,105,-39,-114,-108,-101,30,-121,-23,-50,85,40,-33},{-116,-95,-119,13,-65,-26,66,104,65,-103,45,15,-80,84,-69,22}, };private byte[][] rsbox={{82,9,106,-43,48,54,-91,56,-65,64,-93,-98,-127,-13,-41,-5},{124,-29,57,-126,-101,47,-1,-121,52,-114,67,68,-60,-34,-23,-53},{84,123,-108,50,-90,-62,35,61,-18,76,-107,11,66,-6,-61,78},{8,46,-95,102,40,-39,36,-78,118,91,-94,73,109,-117,-47,37},{114,-8,-10,100,-122,104,-104,22,-44,-92,92,-52,93,101,-74,-110},{108,112,72,80,-3,-19,-71,-38,94,21,70,87,-89,-115,-99,-124},{-112,-40,-85,0,-116,-68,-45,10,-9,-28,88,5,-72,-77,69,6},{-48,44,30,-113,-54,63,15,2,-63,-81,-67,3,1,19,-118,107},{58,-111,17,65,79,103,-36,-22,-105,-14,-49,-50,-16,-76,-26,115},{-106,-84,116,34,-25,-83,53,-123,-30,-7,55,-24,28,117,-33,110},{71,-15,26,113,29,41,-59,-119,111,-73,98,14,-86,24,-66,27},{-4,86,62,75,-58,-46,121,32,-102,-37,-64,-2,120,-51,90,-12},{31,-35,-88,51,-120,7,-57,49,-79,18,16,89,39,-128,-20,95},{96,81,127,-87,25,-75,74,13,45,-27,122,-97,-109,-55,-100,-17},{-96,-32,59,77,-82,42,-11,-80,-56,-21,-69,60,-125,83,-103,97},{23,43,4,126,-70,119,-42,38,-31,105,20,99,85,33,12,125}};private byte[][] mut={{2,3,1,1},{1,2,3,1},{1,1,2,3},{3,1,1,2}};private byte[][] rmut={{14,11,13,9},{9,14,11,13},{13,9,14,11},{11,13,9,14}};private byte[] by={1,2,4,8,16,32,64,-128,27,54,108,-40,-85,77,-102,};private int[] r={0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1b,0x36,0x17,0x15};byte[][][] allkey=new byte[13][4][4];byte[] enbyte=new byte[16];byte[] debyte=new byte[16];//字节替代,public byte[][] subbyte(byte[][] sub){byte row,col;byte[][] temp=new byte[4][4];for(int i=0;i<4;i++)for(int j=0;j<4;j++){col=(byte)(sub[i][j]&0xf);row=(byte)((sub[i][j]>>4)&0xf);temp[i][j]=sbox[row][col];}return temp;}public byte[][] subbyte(byte[][] sub,int r){byte row,col;byte[][] temp=new byte[4][4];for(int i=0;i<4;i++)for(int j=0;j<4;j++){col=(byte)(sub[i][j]&0xf);row=(byte)((sub[i][j]>>4)&0xf);temp[i][j]=rsbox[row][col];}return temp;}//行移位public byte[][] shift(byte[][] sub){byte temp;temp=sub[1][0];sub[1][0]=sub[1][1];sub[1][1]=sub[1][2];sub[1][2]=sub[1][3];sub[1][3]=temp;temp=sub[2][0];sub[2][0]=sub[2][2];sub[2][2]=temp;temp=sub[2][1];sub[2][1]=sub[2][3];sub[2][3]=temp;temp=sub[3][0];sub[3][0]=sub[3][3];sub[3][3]=sub[3][2];sub[3][2]=sub[3][1];sub[3][1]=temp;return sub;}public byte[][] shift(byte[][] sub,int mode){byte temp;temp=sub[3][0];sub[3][0]=sub[3][1];sub[3][1]=sub[3][2];sub[3][2]=sub[3][3];sub[3][3]=temp;temp=sub[2][0];sub[2][0]=sub[2][2];sub[2][2]=temp;temp=sub[2][1];sub[2][1]=sub[2][3];sub[2][3]=temp;temp=sub[1][0];sub[1][0]=sub[1][3];sub[1][3]=sub[1][2];sub[1][2]=sub[1][1];sub[1][1]=temp;return sub;}//列混合public byte[][] mix(byte[][] sub){byte count=0;byte[][] temp=new byte[4][4];for(int i=0;i<4;i++){for(int j=0;j<4;j++){while(count<4){temp[i][j]=(byte)(temp[i][j]^mu(mut[i][count],sub[count][j]));count++;}count=0;}}return temp;}public byte[][] mix(byte[][] sub,int mode){byte count=0;byte[][] temp=new byte[4][4];for(int i=0;i<4;i++){for(int j=0;j<4;j++){while(count<4){temp[i][j]=(byte)(temp[i][j]^mu(rmut[i][count],sub[count][j]));count++;}count=0;}}return temp;}//轮密钥加public byte[][] add(byte sub[][],byte[][] roundkey){for(int i=0;i<4;i++)for(int j=0;j<4;j++){sub[i][j]=(byte)(sub[i][j]^roundkey[i][j]);}return sub;}//列混合中所用函数public byte mu(byte b,byte c){byte ret=0 ,count1=0,count2=0;byte[] barray=new byte[8];byte[] carray=new byte[8];byte[] pro=new byte[15];if(b==1|c==0)return c;if(c==1)return b;for(int i=0;i<8&&b!=0;i++){barray[i]=(byte)(b&1);b=(byte)(b>>1);count1++;}for(int i=0;i<8&&c!=0;i++){carray[i]=(byte)(c&1);c=(byte)(c>>1);count2++;}for(int i=0;i<count1;i++)for(int j=0;j<count2;j++){if(barray[i]>0&carray[j]>0)pro[i+j]=(byte)((pro[i+j]+1)%2);}for(int m=0;m<count1+count2;m++){if(pro[m]>0)ret=(byte)((by[m])^(ret));}return ret;}//密钥扩展public byte[][][] key(byte[][] okey){byte[][][] retarray=new byte[13][4][4];for(int i=0;i<4;i++)for(int j=0;j<4;j++){retarray[0][j][i]=okey[i][j];}for(int i=1;i<13;i++){retarray[i]=tkey(retarray[i-1],r[i]);}return retarray;}//密钥扩展中所用函数public byte[][] tkey(byte[][] okey,int ri){byte[][] temp=new byte[4][4];byte col,row;col=(byte)(okey[1][3]&0xf);row=(byte)((okey[1][3]>>4)&0xf);temp[0][0]=(byte)(ri^sbox[row][col]^okey[0][0]);col=(byte)(okey[2][3]&0xf);row=(byte)((okey[2][3]>>4)&0xf);temp[1][0]=(byte)(sbox[row][col]^okey[1][0]);col=(byte)(okey[3][3]&0xf);row=(byte)((okey[3][3]>>4)&0xf);temp[2][0]=(byte)(sbox[row][col]^okey[2][0]);col=(byte)(okey[0][3]&0xf);row=(byte)((okey[0][3]>>4)&0xf);temp[3][0]=(byte)(sbox[row][col]^okey[3][0]);for(int i=1;i<4;i++){temp[0][i]=(byte)(temp[0][i-1]^okey[0][i]);temp[1][i]=(byte)(temp[1][i-1]^okey[1][i]);temp[2][i]=(byte)(temp[2][i-1]^okey[2][i]);temp[3][i]=(byte)(temp[3][i-1]^okey[3][i]);}return temp;}}<2>.EnDecrypt类:public class EnDecrypt extends AESclass {/*** AES加密算法* 加密* @param content 需要加密的内容* @param keyWord 加密密钥* @return byte[] 加密后的字节数组*/public String strEncrypt (String content,byte[][] key){allkey=key(key);enbyte = content.getBytes();en();String ciphertext = parseByte2HexStr(debyte);return ciphertext;}public void en(){byte[][] temp=new byte[4][4];for(int i=0;i<4;i++)for(int j=0;j<4;j++)temp[i][j]=enbyte[j*4+i];temp=add(temp, allkey[0]);for(int i=1;i<12;i++)temp=this.add(mix(shift(subbyte(temp))),allkey[i]);temp=this.add(this.shift(this.subbyte(temp)), allkey[12]);for(int i=0;i<4;i++)for(int j=0;j<4;j++)debyte[i*4+j]=temp[j][i];}/**解密* @param content 待解密内容* @param keyWord 解密密钥* @return byte[]*/public String strDecrypt (String content,byte[][] key){allkey = key(key);debyte = parseHexStr2Byte(content);de();String text =new String(enbyte);return text;}public void de(){byte[][] temp=new byte[4][4];for(int i=0;i<4;i++)for(int j=0;j<4;j++)temp[i][j]=debyte[j*4+i];temp=add(temp,allkey[12]);for(int i=1;i<12;i++)temp=mix(add(subbyte(shift(temp,-1),-1),allkey[12-i]),-1);temp=add(subbyte(shift(temp, -1), -1), allkey[0]);for(int i=0;i<4;i++)for(int j=0;j<4;j++)enbyte[i*4+j]=temp[j][i];}/**将byte转换成16进制* @param buf* @return String*/public static String parseByte2HexStr(byte buf[]) {StringBuffer sb = new StringBuffer();for (int i = 0; i < buf.length; i++) {String hex = Integer.toHexString(buf[i] & 0xFF);if (hex.length() == 1) {hex = '0' + hex;}sb.append(hex.toUpperCase());}return sb.toString();}/**将16进制转换为byte* @param hexStr* @return byte[]*/public static byte[] parseHexStr2Byte(String hexStr) {int index=hexStr.length()/2;//文本十六进制转换为文件流byte[] b=new byte[index];for(int i=0;i<index;i++){b[i]=(byte)Integer.parseInt(hexStr.substring(i*2,i*2+2),16);}return b;}}<3>.MyAESProgram类:/*** @ author yan* 已知明文为0123456789ABCDEF的ASCII码表示的128比特* 密钥是0101101100001110的12次重复构成的192比特密钥* 编写AES的加解密程序,对明文进行加密,并进行解密验证*/public class MyAESProgram/** 主类*/{public static void main(String[] args){//生成192bit密钥byte[][] key = new byte[4][6];byte[] bt = new byte[24];for(int i=0;i<12;i++){bt[2*i] = 91;bt[2*i+1] = 14;}int k = 0;for(int i=0;i<4;i++){for(int j=0;j<6;j++){key[i][j] = bt[k];k++;}}String originalText = "0123456789ABCDEF";EnDecrypt crypt = new EnDecrypt();String cipherText=crypt.strEncrypt(originalText,key);String decryptText = crypt.strDecrypt(cipherText,key);System.out.println("originalText: "+originalText);System.out.println("cipherText: "+cipherText);System.out.println("decryptText: "+decryptText);}}。
java接收文件加密解密方法
在Java中接收加密文件并进行解密可以通过多种方式实现。
下面我将从多个角度介绍几种常见的方法:
1. 使用对称加密算法:
可以使用Java的javax.crypto包中的类来实现对称加密算法,如AES。
首先,接收加密文件后,可以使用FileInputStream 读取文件内容,然后使用Cipher类进行解密操作,最后使用FileOutputStream将解密后的内容写入新文件。
2. 使用非对称加密算法:
如果发送方使用了公钥加密文件,接收方可以使用私钥进行解密。
可以使用Java的java.security包中的类来实现非对称加密算法,如RSA。
首先,接收加密文件后,可以使用PrivateKey类进行解密操作,最后使用FileOutputStream将解密后的内容写入新文件。
3. 使用第三方库:
除了Java自带的加密算法外,也可以使用第三方库来简化加密解密操作,例如Bouncy Castle或者Apache Commons Crypto 等。
这些库提供了更多的加密选项和更简单的API,可以更容易地实现文件的加密和解密操作。
无论使用哪种方法,都需要注意文件的安全传输和存储,以及密钥的安全管理。
另外,要确保在解密文件时处理可能出现的异常情况,如文件损坏或者密码错误等。
希望这些信息能够帮助你实现在Java中接收文件并进行加密解密的操作。
Java使⽤Hutool实现AES、DES加密解密的⽅法在Java世界中,AES、DES加密解密需要使⽤Cipher对象构建加密解密系统,Hutool中对这⼀对象做再包装,简化了加密解密过程。
介绍AES和DES同属对称加密算法,数据发信⽅将明⽂(原始数据)和加密密钥⼀起经过特殊加密算法处理后,使其变成复杂的加密密⽂发送出去。
收信⽅收到密⽂后,若想解读原⽂,则需要使⽤加密⽤过的密钥及相同算法的逆算法对密⽂进⾏解密,才能使其恢复成可读明⽂。
在对称加密算法中,使⽤的密钥只有⼀个,发收信双⽅都使⽤这个密钥对数据进⾏加密和解密,这就要求解密⽅事先必须知道加密密钥。
在Java世界中,AES、DES加密解密需要使⽤Cipher对象构建加密解密系统,Hutool中对这⼀对象做再包装,简化了加密解密过程。
引⼊Hutool<dependency><groupId>com.xiaoleilu</groupId><artifactId>hutool-all</artifactId><version>3.0.9</version></dependency>使⽤AES加密解密String content = "test中⽂";//随机⽣成密钥byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();//构建AES aes = SecureUtil.aes(key);//加密byte[] encrypt = aes.encrypt(content);//解密byte[] decrypt = aes.decrypt(encrypt);//加密为16进制表⽰String encryptHex = des.encryptHex(content);//解密为原字符串String decryptStr = des.decryptStr(encryptHex);DES加密解密DES的使⽤⽅式与AES基本⼀致String content = "test中⽂";//随机⽣成密钥byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.DES.getValue()).getEncoded();//构建DES des = SecureUtil.des(key);//加密解密byte[] encrypt = des.encrypt(content);byte[] decrypt = des.decrypt(encrypt);//加密为16进制,解密为原字符串String encryptHex = des.encryptHex(content);String decryptStr = des.decryptStr(encryptHex);更多Hutool中针对JDK⽀持的所有对称加密算法做了封装,封装为SymmetricCrypto类,AES和DES两个类是此类的简化表⽰。
java相关加密解密方法Java加密解密方法是保护数据安全的重要手段,本文将详细介绍几种常见的Java加密解密方法。
一、对称加密算法对称加密算法是一种使用相同的密钥进行加密和解密的算法。
这种加密方式简单高效,但存在密钥管理的问题,因为所有用户都必须知道密钥。
在Java中,常用的对称加密算法有DES、3DES、AES等。
1. DES:Data Encryption Standard,数据加密标准,是一种使用56位密钥的对称块密码算法。
在Java中,我们可以使用javax.crypto.Cipher类来实现DES 加密解密。
2. 3DES:Triple Data Encryption Algorithm,三重数据加密算法,是DES的增强版本,使用三个不同的56位密钥进行三次加密。
在Java中,我们同样可以使用Cipher类来实现3DES加密解密。
3. AES:Advanced Encryption Standard,高级加密标准,是一种使用128、192或256位密钥的对称块密码算法。
在Java中,我们可以使用Cipher类来实现AES加密解密。
二、非对称加密算法非对称加密算法是一种使用一对密钥(公钥和私钥)进行加密和解密的算法。
公钥可以公开给所有人,而私钥需要保密。
在Java中,常用的非对称加密算法有RSA、DSA等。
1. RSA:Rivest-Shamir-Adleman,一种基于大数因子分解难题的非对称加密算法。
在Java中,我们可以使用java.security.KeyPairGenerator类生成RSA密钥对,然后使用Cipher类进行RSA加密解密。
2. DSA:Digital Signature Algorithm,数字签名算法,是一种基于整数有限域离散对数难题的非对称加密算法。
在Java中,我们可以使用KeyPairGenerator类生成DSA密钥对,然后使用Signature类进行DSA签名和验证。
java后台加密解密方法Java后台加密解密方法在当今互联网安全领域中具有重要意义。
为了保护数据的安全,各种加密算法应运而生。
本文将介绍几种常见的Java后台加密解密方法,包括RSA、AES、DES和SM2。
1.RSA加密解密原理及实现RSA是一种非对称加密算法,其公钥和私钥是成对存在的。
使用公钥加密后的数据只能通过私钥进行解密。
在Java中,我们可以使用KeyPairGenerator生成一对公私钥,然后使用RSAPrivateKey对数据进行解密。
2.AES加密解密原理及实现AES是一种对称加密算法,加密和解密过程使用相同的密钥。
在Java中,我们可以使用Java的加密库如Java Cryptography Extension (JCE)实现AES 加密解密。
3.DES加密解密原理及实现DES是一种对称加密算法,其加密过程和解密过程使用不同的密钥。
在Java中,我们可以使用Java Cryptography Extension (JCE)实现DES加密解密。
4.SM2加密解密原理及实现SM2是一种国密算法,具有非对称加密和对称加密的特点。
在前端,我们可以使用SM2加密请求参数,然后在后台使用对应的私钥进行解密。
在Java 中,我们可以使用Hutool库实现SM2加密解密。
5.总结:选择合适的加密解密方法及注意事项在实际应用中,选择合适的加密解密方法至关重要。
需要考虑数据安全性、算法复杂度、性能和兼容性等因素。
此外,还需注意以下几点:- 加密解密算法应根据实际需求进行选择,如对称加密算法适用于加密大量数据,非对称加密算法适用于加密少量数据;- 加密密钥和解密密钥应妥善保管,避免泄露;- 在传输加密数据时,应注意防范中间人攻击,可以使用SSL/TLS等安全协议进行保护;- 定期更新和升级加密算法,以应对潜在的安全威胁。
本文介绍了Java后台加密解密方法,包括RSA、AES、DES和SM2。
java使⽤AES256解密⽹上关于java⽤AES加密解密的⽂章有很多,我这⾥只⽤到解密(加密是服务器那边做^_^),所以更简洁⼀些:public class AES256Utils {private static final String KEY = "xxxx";//从服务器要的密钥public static final String CIPHER_ALGORITHM = "AES/ECB/PKCS7Padding";/*** 解密* @param content* 待解密内容* @return*/public static byte[] decrypt(byte[] data) throws Exception {Key k = toKey(KEY.getBytes());Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, k);return cipher.doFinal(data);}private static Key toKey(byte[] key) throws Exception {SecretKey secretKey = new SecretKeySpec(key, "AES");return secretKey;}}这⾥有⼀点要注意,⽹上都要添加⼀个类似bcprov-jdk的库和两个policy⽂件,那是加密时候⽤的,解密不需要他们。
还有⼀点注意,⼀般服务器返回来的加密后数据都是要Base64编码的(否则容易丢失数据,抛出异常:javax.crypto.IllegalBlockSizeException: last block incomplete in decryption)。
所以要⽤Base64解码。
在Java中,`AES.encrypt`方法通常需要两个参数:1. 第一个参数是明文数据(plaintext),即你想要加密的原始数据。
这个参数通常是一个字符串或者字节数组。
2. 第二个参数是加密密钥(encryption key),用于对数据进行加密。
这个参数通常是一个字符串或者字节数组。
以下是一个使用AES加密的简单示例:```javaimport javax.crypto.Cipher;import javax.crypto.spec.SecretKeySpec;import java.nio.charset.StandardCharsets;import java.util.Base64;public class Main {public static void main(String[] args) throws Exception {// 明文String plaintext = "Hello, World!";// 密钥,16位String key = "1234567890123456";Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");cipher.init(Cipher.ENCRYPT_MODE, secretKey);byte[] encrypted = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));String encryptedString = Base64.getEncoder().encodeToString(encrypted);System.out.println(encryptedString);}}```在这个例子中,我们使用AES算法、ECB模式和PKCS5Padding 填充方式创建了一个Cipher实例。
JAVAAES加密算法实现代码1、代码package com.zhaochao.utill;import java.io.UnsupportedEncodingException;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import javax.crypto.BadPaddingException;import javax.crypto.Cipher;import javax.crypto.IllegalBlockSizeException;import javax.crypto.KeyGenerator;import javax.crypto.NoSuchPaddingException;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;public class AESUitl {public static byte[] encrypt(String content, String password) {try {KeyGenerator kgen = KeyGenerator.getInstance("AES");kgen.init(128, new SecureRandom(password.getBytes()));SecretKey secretKey = kgen.generateKey();byte[] enCodeFormat = secretKey.getEncoded();SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");Cipher cipher = Cipher.getInstance("AES");// 创建密码器byte[] byteContent = content.getBytes("utf-8");cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化byte[] result = cipher.doFinal(byteContent);return result; // 加密} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (NoSuchPaddingException e) {e.printStackTrace();} catch (InvalidKeyException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IllegalBlockSizeException e) {e.printStackTrace();} catch (BadPaddingException e) {e.printStackTrace();}return null;}public static byte[] decrypt(byte[] content, String password) {try {KeyGenerator kgen = KeyGenerator.getInstance("AES");kgen.init(128, new SecureRandom(password.getBytes()));SecretKey secretKey = kgen.generateKey();byte[] enCodeFormat = secretKey.getEncoded();SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");Cipher cipher = Cipher.getInstance("AES");// 创建密码器cipher.init(Cipher.DECRYPT_MODE, key);// 初始化byte[] result = cipher.doFinal(content);return result; // 加密} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (NoSuchPaddingException e) {e.printStackTrace();} catch (InvalidKeyException e) {e.printStackTrace();} catch (IllegalBlockSizeException e) {e.printStackTrace();} catch (BadPaddingException e) {e.printStackTrace();}return null;}public static void main(String[] rags) {String content = "test2222";String password = "12345678";// 加密System.out.println("加密前:" + content);byte[] encryptResult = encrypt(content, password);System.out.println("加密后:"+new String(encryptResult));// 解密byte[] decryptResult = decrypt(encryptResult, password); System.out.println("解密后:" + new String(decryptResult)); }}2、输出结果加密前:test2222加密后:��»�4�s-�?�D�H�解密后:test2222。
javaAES实现字符串的加密、解密(配合⼆进制、⼗六进制转换的⼯具使⽤)//BinHexSwitchUtil 参考这个链接https:///xiaoxiao075/p/13230454.htmlimport javax.crypto.*;import javax.crypto.spec.SecretKeySpec;import java.security.InvalidKeyException;import java.security.Key;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import java.util.Arrays;import java.util.Base64;//import mons.codec.binary.Base64;public class EncryptStrUtil {/*** KeyGenerator的⽅式,通过传⼊种⼦串⽣成key,进⾏加密* @param seed ⽣成key传⼊的种⼦串* @param toEncryptStr 要加密的字节数组* @return返回 Base64 的加密字符串*/public static String encrypt(String seed, byte[] toEncryptStr) {try {return Base64.getEncoder().encodeToString(getCipher(seed, Cipher.ENCRYPT_MODE).doFinal(toEncryptStr)); //此时使⽤的 Base64 编码} catch (Exception e) {e.printStackTrace();}return null;}/*** 根据传⼊的⼆进制 key数组,返回AES的⼗六进制加密串* @param keyBytes* @param toEncryptStr* @return*/public static String encrypt(byte[] keyBytes, byte[] toEncryptStr) {try {return BinHexSwitchUtil.bytesToHexString(getCipher(keyBytes, Cipher.ENCRYPT_MODE).doFinal(toEncryptStr));} catch (Exception e) {e.printStackTrace();}return null;}/*** KeyGenerator的⽅式,通过传⼊种⼦串⽣成key,进⾏解密* @param seed ⽣成key传⼊的种⼦串* @param encryptedStr 要解密的字节数组,Base64加密的* @return返回解密的字节数组*/public static byte[] decrypt(String seed, byte[] encryptedStr) {try {return getCipher(seed, Cipher.DECRYPT_MODE).doFinal(Base64.getDecoder().decode(encryptedStr));} catch (Exception e) {e.printStackTrace();}return null;}/*** 根据传⼊的⼆进制 key数组,将16进制加密串解密* @param keyBytes* @param encryptedStr 要解密的字符串* @return已解密的⼆进制数组*/public static byte[] decrypt(byte[] keyBytes, String encryptedStr) {try {return getCipher(keyBytes, Cipher.DECRYPT_MODE).doFinal(BinHexSwitchUtil.hexStringTobytes(encryptedStr));} catch (Exception e) {e.printStackTrace();}return null;}/*** KeyGenerator 的⽅式⽣成key,获取密码⽣成器* @param seed 传⼊的种⼦字符串* @param encryptMode 传⼊加密模式、解密模式* @return返回密码⽣成器* @throws Exception*/private static Cipher getCipher(String seed, int encryptMode) throws Exception {//⽣成加密随机数SecureRandom random = SecureRandom.getInstance("SHA1PRNG");//并设置seedrandom.setSeed(seed.getBytes());//创建AES⽣产者KeyGenerator generator = KeyGenerator.getInstance("AES");//初始化⽣产者,128位generator.init(128, random);Key key=generator.generateKey();// 返回基本编码格式的密钥(初始key),如果此密钥不⽀持编码,则返回null。
C#, Java, PHP, Python 和Javascript 的AES 加密解密实现c#里面的AES加密解密其中加密后以及解密后的字符串都能成功打印,但Console.WriteLine( =3== 之后的输出就没有了,最后输出个线程返回值0,然后就没有然后了。
c#不懂,就不深究了,就已执行的部分,是符合要求了。
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Security.Cryptography;namespace testclass Class1static void Main(string[] args)Console.WriteLine( I am commingString source = Test StringString encryptData = Class1.Encrypt(source, 1234567812345678 , 1234567812345678Console.WriteLine( =1==Console.WriteLine(encryptData);Console.WriteLine( =2==String decryptData = Class1.Decrypt( 2fbwW9+8vPId2/foafZq6Q== , 1234567812345678 , 1234567812345678Console.WriteLine(decryptData);Console.WriteLine( =3==Console.WriteLine( I will go outpublic static string Encrypt(string toEncrypt, string key, string iv)byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key);byte[] ivArray = UTF8Encoding.UTF8.GetBytes(iv);byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);RijndaelManaged rDel = new RijndaelManaged();rDel.Key = keyArray;rDel.IV = ivArray;rDel.Mode = CipherMode.CBC;rDel.Padding = PaddingMode.Zeros;ICryptoTransform cTransform = rDel.CreateEncryptor();byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);return Convert.ToBase64String(resultArray, 0, resultArray.Length);public static string Decrypt(string toDecrypt, string key, string iv)byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key);byte[] ivArray = UTF8Encoding.UTF8.GetBytes(iv);byte[] toEncryptArray = Convert.FromBase64String(toDecrypt);RijndaelManaged rDel = new RijndaelManaged();rDel.Key = keyArray;rDel.IV = ivArray;rDel.Mode = CipherMode.CBC;rDel.Padding = PaddingMode.Zeros;ICryptoTransform cTransform = rDel.CreateDecryptor();byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);return UTF8Encoding.UTF8.GetString(resultArray);}php的AES加密解密php代码,php很多东西都是提供好的,直接用函数,但是php目前所知填充模式只有ZeroPadding,于是其他语言就只能跟着它来了:php$privateKey = 1234567812345678$iv = 1234567812345678$data = Test String$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $privateKey, $data, MCRYPT_MODE_CBC, $iv);echo($encrypted);echo ‘ br/echo(base64_encode($encrypted));echo ‘ br/$encryptedData = base64_decode( 2fbwW9+8vPId2/foafZq6Q==$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $privateKey, $encryptedData, MCRYPT_MODE_CBC, $iv);echo($decrypted);Javascript下aes加解密需要在https:///p/crypto-js/下载工具包script type= text/javascript src= aes.js /scriptscript type= text/javascript src= pad-zeropadding.js /script导入文件,aes.js需要导入crypto-js压缩包中rollups文件夹下的那个aes.js文件,如果引入的是components文件夹下的aes.j s是会报错的script type= text/javascriptvar data = Test Stringvar key = tin1.parse(‘1234567812345678’);var iv = tin1.parse(‘1234567812345678’);//加密var encrypted = CryptoJS.AES.encrypt(data,key,{iv:iv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.ZeroPad ding});document.write(encrypted.ciphertext);document.write(‘ br/document.write(encrypted.key);document.write(‘ br/document.write(encrypted.iv);document.write(‘ br/document.write(encrypted.salt);document.write(‘ br/document.write(encrypted);document.write(‘ br///解密var decrypted = CryptoJS.AES.decrypt(encrypted,key,{iv:iv,padding:CryptoJS.pad.ZeroPadding});console.log(decrypted.toString(CryptoJS.enc.Utf8));/scriptpython的AES加密解密最后加一个python下的aes,需要安装python Crypto:#!/usr/bin/env python# -*- coding: utf-8 -*-from Crypto.Cipher import AESimport base64PADDING = ‘\0’#PADDING = ‘ ‘pad_it = lambda s: s+(16 - len(s)%16)*PADDINGkey = ‘1234567812345678’iv = ‘1234567812345678’source = ‘Test String’generator = AES.new(key, AES.MODE_CBC, iv)crypt = generator.encrypt(pad_it(source))cryptedStr = base64.b64encode(crypt)print cryptedStrgenerator = AES.new(key, AES.MODE_CBC, iv)recovery = generator.decrypt(crypt)print recovery.rstrip(PADDING)注意python下需要用’\0’来填充,如果是空格来填充,python加密得到的字符串会跟其他语言不同。
1、深入理解AES加解密算法;2、用JAVA编程完成一个明文分组的加密和解密,其中密钥是十六进制,长度为128比特(32个16进制数),并且进行加密后,能够进行正确的解密。
二、实验条件1、熟悉JA V A开发环境,能熟练运用JA V A进行程序编写;2、掌握AES加解密算法知识,了解其算法原理;3、安装了JA V A环境的计算机。
三、实验背景随着对称密码的发展,3DES用软件实现速度相对较慢,它使用的64位分组长度显得不够高效和安全的缺点使得需要一种新的高级加密标准来替代它。
AES的全称是Advanced Encryption Standard,即高级加密标准。
该项目由美国国家标准技术研究所(NIST)于1997年开始启动并征集算法,在2000年确定采用Rijndael作为其最终算法,并于2001年被美国商务部部长批准为新的联邦信息加密标准(FIPS PUB 197),该标准的正式生效日期是2002年5月26日。
2000年10月2日,NIST对Rijndael做出了最终评估。
AES是一个迭代的、对称密钥分组的密码,它可以使用128、192和256位密钥,并且用128位(16字节)分组加密和解密数据。
与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。
通过分组密码返回的加密数据的位数与输入数据相同。
迭代加密使用一个循环结构,在该循环中重复置换(permutations)和替换(substitutions)输入数据。
1、AES加密模块字节替代:通过一个非线性的替换函数,用查找表的方式把每个字节替换成对应的字节;行移位:将矩阵中的每个横列进行循环式移位;列混合:为了充分混合矩阵中各个直行的操作,这个步骤使用线性转换来混合每行内的四个字节;轮密钥加:矩阵中的每一个自己都与该次循环的子密钥做XOR逻辑运算;每个子密钥有密钥生成方案产生;最后一个加密循环中省略列混合步骤,而以另一个轮密钥加取代。
2、AES解密模块:逆行移位:与行移位操作相反;逆字节替代:与字节替代一样,只是查表操作变为逆S盒;轮密钥加:与加密算法中一样;逆列混合:与列混合操作一样,只是多项式不同;最后一个解密循环中省略逆列混合步骤,以另一个轮密钥加取代。
3、AES密钥扩展模块首先初始密钥按照矩阵列进行分组,前4列初始密钥记为K0,K1,K2,K3,那么新的列Ki递归如下:1)如果Ki中,i不是4的倍数,那么i列由如下等式确定:Ki = K(i-4)XOR K(i-1)2)如果ki中,i是4的倍数,那么i列由如下等式确定:Ki = K(i-4)XOR T[K(i-1)]其中是4的倍数的转换形式,按以下方式实现:a 将K(i-1)循环左移位,每次一个字节,如abcd变成bcda;b 将这4个字节作为S盒的输入,输出新的4个字节efgh;c 计算一轮的常量r(i)=2(i-4)/4;d 这样生成转换后的列:[e XORr(i),f,g,h] 。
第i轮的轮密钥组成了列K4i,K(4i+1),K(4i+2),K(4i+3)。
五、程序设计1、程序开发平台及工具平台:windows xp软件版本:jdk1.6.0_212、源代码import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;public class AES{private final static String algorithm = "AES";private static String asHex(byte buf[]){StringBuffer strbuf = new StringBuffer(buf.length * 2);for (int 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 static byte[] asBin(String src){if(src.length()<1)return null;byte[] encrypted = new byte[src.length()/2];for(int i=0;i<src.length()/2;i++){int high = Integer.parseInt(src.substring(i * 2, i * 2 + 1 ), 16);int low = Integer.parseInt(src.substring(i * 2 + 1, i * 2 + 2), 16);encrypted[i] = (byte)(high * 16 + low);}return encrypted;}public static String getRawKey() {try{KeyGenerator kgen = KeyGenerator.getInstance(algorithm);kgen.init(128); // 192 and 256 bits may not be availableSecretKey skey = kgen.generateKey(); // Generate the secret key specs.byte[] raw = skey.getEncoded();return asHex(raw);}catch (Exception e) {return "";}}public static String getEncrypt(String message, String rawKey){byte[] key = asBin(rawKey);try{SecretKeySpec skeySpec = new SecretKeySpec(key, algorithm);Cipher cipher = Cipher.getInstance(algorithm);cipher.init(Cipher.ENCRYPT_MODE, skeySpec);byte[] encrypted = cipher.doFinal(message.getBytes());return asHex(encrypted);}catch (Exception e) {return "";}}public static String getDecrypt(String encrypted, String rawKey){byte[] tmp = asBin(encrypted);byte[] key = asBin(rawKey);try{SecretKeySpec skeySpec = new SecretKeySpec(key, algorithm);Cipher cipher = Cipher.getInstance(algorithm);cipher.init(Cipher.DECRYPT_MODE, skeySpec);byte[] decrypted = cipher.doFinal(tmp);return new String(decrypted);}catch (Exception e) {return "";}}public static void main(String[] args) throws Exception{String message = "what are you doing?";String rawKey = getRawKey();System.out.println("Key = " + rawKey);String encrypted = getEncrypt(message,rawKey);System.out.println("org text = " + message);System.out.println("encrypted = " + encrypted);String decrypted = getDecrypt(encrypted,rawKey);System.out.println("decrypted = " + decrypted);}}六、程序运行结果七、实验小结本实验的核心是AES的工作原理分析、基于AES加解密算法的编程实现。
重点是对AES算法的流程做一个详细的描述,应用JA V A语言实现AES的最基本的核心算法,从而对AES有更深的理解。
通过此次实验,不仅使自己对密码学有了更深入的了解,同时使自己对JA V A 编程也有了一定的提高。
基本掌握了JA V A面向对象程序设计。
基本掌握了密码学中一个重要的算法—AES密码算法。
受益匪浅。