JAVA中AES对称加密和解密过程
程序员文章站
2024-03-13 18:41:21
aes对称加密和解密代码详细介绍,供大家参考,具体内容如下
package demo.security;
import java.io.ioex...
aes对称加密和解密代码详细介绍,供大家参考,具体内容如下
package demo.security; import java.io.ioexception; import java.io.unsupportedencodingexception; import java.security.invalidkeyexception; import java.security.nosuchalgorithmexception; import java.security.securerandom; import java.util.base64; import java.util.scanner; 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 sun.misc.base64decoder; import sun.misc.base64encoder; /* * aes对称加密和解密 */ public class symmetricencoder { /* * 加密 * 1.构造密钥生成器 * 2.根据ecnoderules规则初始化密钥生成器 * 3.产生密钥 * 4.创建和初始化密码器 * 5.内容加密 * 6.返回字符串 */ public static string aesencode(string encoderules,string content){ try { //1.构造密钥生成器,指定为aes算法,不区分大小写 keygenerator keygen=keygenerator.getinstance("aes"); //2.根据ecnoderules规则初始化密钥生成器 //生成一个128位的随机源,根据传入的字节数组 keygen.init(128, new securerandom(encoderules.getbytes())); //3.产生原始对称密钥 secretkey original_key=keygen.generatekey(); //4.获得原始对称密钥的字节数组 byte [] raw=original_key.getencoded(); //5.根据字节数组生成aes密钥 secretkey key=new secretkeyspec(raw, "aes"); //6.根据指定算法aes自成密码器 cipher cipher=cipher.getinstance("aes"); //7.初始化密码器,第一个参数为加密(encrypt_mode)或者解密解密(decrypt_mode)操作,第二个参数为使用的key cipher.init(cipher.encrypt_mode, key); //8.获取加密内容的字节数组(这里要设置为utf-8)不然内容中如果有中文和英文混合中文就会解密为乱码 byte [] byte_encode=content.getbytes("utf-8"); //9.根据密码器的初始化方式--加密:将数据加密 byte [] byte_aes=cipher.dofinal(byte_encode); //10.将加密后的数据转换为字符串 //这里用base64encoder中会找不到包 //解决办法: //在项目的build path中先移除jre system library,再添加库jre system library,重新编译后就一切正常了。 string aes_encode=new string(new base64encoder().encode(byte_aes)); //11.将字符串返回 return aes_encode; } 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(); } catch (unsupportedencodingexception e) { e.printstacktrace(); } //如果有错就返加nulll return null; } /* * 解密 * 解密过程: * 1.同加密1-4步 * 2.将加密后的字符串反纺成byte[]数组 * 3.将加密内容解密 */ public static string aesdncode(string encoderules,string content){ try { //1.构造密钥生成器,指定为aes算法,不区分大小写 keygenerator keygen=keygenerator.getinstance("aes"); //2.根据ecnoderules规则初始化密钥生成器 //生成一个128位的随机源,根据传入的字节数组 keygen.init(128, new securerandom(encoderules.getbytes())); //3.产生原始对称密钥 secretkey original_key=keygen.generatekey(); //4.获得原始对称密钥的字节数组 byte [] raw=original_key.getencoded(); //5.根据字节数组生成aes密钥 secretkey key=new secretkeyspec(raw, "aes"); //6.根据指定算法aes自成密码器 cipher cipher=cipher.getinstance("aes"); //7.初始化密码器,第一个参数为加密(encrypt_mode)或者解密(decrypt_mode)操作,第二个参数为使用的key cipher.init(cipher.decrypt_mode, key); //8.将加密并编码后的内容解码成字节数组 byte [] byte_content= new base64decoder().decodebuffer(content); /* * 解密 */ byte [] byte_decode=cipher.dofinal(byte_content); string aes_decode=new string(byte_decode,"utf-8"); return aes_decode; } catch (nosuchalgorithmexception e) { e.printstacktrace(); } catch (nosuchpaddingexception e) { e.printstacktrace(); } catch (invalidkeyexception e) { e.printstacktrace(); } catch (ioexception e) { e.printstacktrace(); } catch (illegalblocksizeexception e) { e.printstacktrace(); } catch (badpaddingexception e) { e.printstacktrace(); } //如果有错就返加nulll return null; } public static void main(string[] args) { symmetricencoder se=new symmetricencoder(); scanner scanner=new scanner(system.in); /* * 加密 */ system.out.println("使用aes对称加密,请输入加密的规则"); string encoderules=scanner.next(); system.out.println("请输入要加密的内容:"); string content = scanner.next(); system.out.println("根据输入的规则"+encoderules+"加密后的密文是:"+se.aesencode(encoderules, content)); /* * 解密 */ system.out.println("使用aes对称解密,请输入加密的规则:(须与加密相同)"); encoderules=scanner.next(); system.out.println("请输入要解密的内容(密文):"); content = scanner.next(); system.out.println("根据输入的规则"+encoderules+"解密后的明文是:"+se.aesdncode(encoderules, content)); } }
测试结果:
使用aes对称加密,请输入加密的规则
使用aes对称加密
请输入要加密的内容:
使用aes对称加密
根据输入的规则使用aes对称加密加密后的密文是:z0nwrnphghgxhn0cqjls58ycjhmcbfer33rws7lw+ay=
使用aes对称解密,请输入加密的规则:(须与加密相同)
使用aes对称加密
请输入要解密的内容(密文):
z0nwrnphghgxhn0cqjls58ycjhmcbfer33rws7lw+ay=
根据输入的规则使用aes对称加密解密后的明文是:使用aes对称加密
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。