对称加密之AES加密
2016-04-03 11:52
267 查看
加密和解密过程中,我们一般使用byte,因为这样不容易产生乱码,如果直接是String类型,被加密解密后的String,对中文来说,前后的Unicode是否一致,就很难保证了。
之前说了使用异或运算符加密。在Java中,有API提供,让我们实现AES对称加密。
和之前的简单加密相比,AES加密对密钥是有要求的,所以,需要设计算法,使得密钥符合要求
下面在一个类中实现AES对称加密
之前说了使用异或运算符加密。在Java中,有API提供,让我们实现AES对称加密。
和之前的简单加密相比,AES加密对密钥是有要求的,所以,需要设计算法,使得密钥符合要求
下面在一个类中实现AES对称加密
import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; //引用下面的sun.misc.BASE64Decoder和BASE64Encoder包会有限制,不喜欢的,就加入xstream-1.4.3.jar包 import com.thoughtworks.xstream.core.util.Base64Encoder; //import sun.misc.BASE64Decoder; //import sun.misc.BASE64Encoder; /** * @author Administrator, 2016年4月2日 下午4:56:27 * AES加密对长度有限制 */ public class AESEncryption { private static String charset = "utf-8"; public static String encrypt(String src, String key) { try { //创建密钥 byte[] buf_key = key.getBytes(charset); //创建一个空的16位字节数组,默认0 byte[] buf = new byte[16]; //过短,补零;过长丢弃 for (int i = 0; i < buf_key.length && i < buf.length; i++) { buf[i] = buf_key[i]; } SecretKeySpec secretKey = new SecretKeySpec(buf,"AES"); //加密 Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE, secretKey); byte[] out = cipher.doFinal(src.getBytes(charset)); //转为串 return new Base64Encoder().encode(out); } catch (Exception e) { e.printStackTrace(); } return null; } public static String decrypt(String src, String key) { try { // 处理密钥 byte[] buf_key = key.getBytes(charset); // 创建一个空的16位字节数组,默认0 byte[] buf = new byte[16]; // 过短,补零;过长丢弃 for (int i = 0; i < buf_key.length && i < buf.length; i++) { buf[i] = buf_key[i]; } SecretKeySpec secretKey = new SecretKeySpec(buf, "AES"); //密码还原 buf = new BASE64Decoder().decodeBuffer(src); //解密 Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.DECRYPT_MODE, secretKey); byte[] out = cipher.doFinal(buf); //转为串 return new String(out,charset); } catch (Exception e) { e.printStackTrace(); } return null; } public static void main(String[] args) { String str = "eqwi&434p"; String key = AESEncryption.encrypt(str, "Eng"); System.out.println(key); String de = AESEncryption.decrypt(key, "Eng"); System.out.println(de); } }
相关文章推荐
- 支持向量机SVM(五)
- 2016年网易春招软件测试实习生面试
- [转] 记住这14条 关键时刻可以救命!学着保护好自己!
- memset函数
- web进修之—Hibernate 继承映射(5)
- 支持向量机SVM(四)
- Python Discuz 7.2 faq.php 注入漏洞全自动利用工具
- jquery uploadify在IE上传报406HttpError
- NumPy学习笔记
- sublime中输入法输入框只能在一个位置
- Otto使用记录
- 支持向量机SVM(三)
- 解析XML:DOM,SAX,PULL
- iOS开发总结之项目开发中使用UITableView几百行代码搞定级联表格
- pandas学习笔记
- c语言下的通用数据库接口(之sqlite消化,模拟c#,java的反射)
- 输入字符,输出字符时加行号
- HDU 1024 Max Sum Plus Plus【DP,最大m子段和】
- HDU 1024 Max Sum Plus Plus【DP,最大m子段和】
- NumPy学习笔记