3、AES加密算法
来源:互联网 发布:知乎 男人 爆菊很爽 编辑:程序博客网 时间:2024/06/14 21:56
AES加密算法是密码学中的高级加密标准,该加密算法采用对称分组密码体制,密钥长度的最少支持为128、192、256,分组长度128位,算法应易于各种硬件和软件实现。这种加密算法是美国联邦政府采用的区块加密标准,这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。
过多原理不做解释,可以参考(AES加密算法原理http://www.jiamisoft.com/blog/858-aesjiamisuanfa.html)
java中的具体使用如下:
public class SecurityAESUtils { private static Logger logger = LogManager.getLogger(SecurityAESUtils.class); private static final String ENCODEING = "UTF-8"; private static final String ALGORITHM = "AES";//加密算法 private static final String CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";//算法/工作模式/填充方式 /** * 加密 * @param plaintext 明文 * @param secureKey 16位长度的密钥 * @return */ public static String encrypt(String plaintext, String secureKey) throws Exception{ SecretKeySpec sks = getSecretKeySpec(secureKey); Cipher encryptCipher = getCipher(Cipher.ENCRYPT_MODE, sks); byte[] result = encryptCipher.doFinal(plaintext.getBytes(ENCODEING)); return Base64.encodeBase64String(result); } /** * 加密 * @param bytes * @param secureKey 16位长度的密钥 * @return */ public static String encryptBytes(byte[] bytes, String secureKey) throws Exception{ SecretKeySpec sks = getSecretKeySpec(secureKey); Cipher encryptCipher = getCipher(Cipher.ENCRYPT_MODE, sks); byte[] result = encryptCipher.doFinal(bytes); return Base64.encodeBase64String(result); } /** * 解密 * @param ciphertext 密文 * @return secureKey 16位长度的密钥 * @throws Exception */ public static String decrypt(String ciphertext, String secureKey) throws Exception { SecretKeySpec sks = getSecretKeySpec(secureKey); Cipher decryptCiphe = getCipher(Cipher.DECRYPT_MODE, sks);//initDecryptCipher(secureKey); byte[] result = decryptCiphe.doFinal(Base64.decodeBase64(ciphertext)); return new String(result, ENCODEING); } private static Cipher getCipher(int cipherMode, SecretKeySpec sks) throws Exception{ Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); cipher.init(cipherMode, sks); return cipher; } private static SecretKeySpec getSecretKeySpec(String secureKey) throws Exception{ if(secureKey == null || secureKey.trim().equals("") || secureKey.length() != 16){ throw new Exception("密钥不能为空或密钥长度不对"); } byte[] raw = secureKey.getBytes(ENCODEING); SecretKeySpec skeySpec = new SecretKeySpec(raw, ALGORITHM); return skeySpec; } /** * @Comment 加密不限制密码长度 * @Author Ron * @Date 2017年9月12日 下午3:21:59 * @return */ public static String encryptNotLimit(String plaintext, String secureKey) throws Exception{ SecretKeySpec sks = getSecretKeySpecByRandomSeed(secureKey); Cipher encryptCipher = getCipher(Cipher.ENCRYPT_MODE, sks); byte[] result = encryptCipher.doFinal(plaintext.getBytes(ENCODEING)); return Hex.encodeHexString(result); } /** * @Comment 解密不限制密码长度 * @Author Ron * @Date 2017年9月12日 下午3:22:30 * @return */ public static String decryptNotLimit(String ciphertext, String secureKey) throws Exception { SecretKeySpec sks = getSecretKeySpecByRandomSeed(secureKey); Cipher decryptCiphe = getCipher(Cipher.DECRYPT_MODE, sks); byte[] result = decryptCiphe.doFinal(Hex.decodeHex(ciphertext.toCharArray())); return new String(result, ENCODEING); } /** * @Comment 构造私钥 * @Author Ron * @Date 2017年9月12日 下午3:22:59 * @return */ private static SecretKeySpec getSecretKeySpecByRandomSeed(String secureKey){ SecretKeySpec sks = null; try { KeyGenerator kgen = KeyGenerator.getInstance(ALGORITHM); //安全随机数生成器 SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");//使用默认的SHA1PRNG算法 secureRandom.setSeed(secureKey.getBytes(ENCODEING)); kgen.init(128, secureRandom); SecretKey secretKey = kgen.generateKey(); byte[] secretKeyEncoded = secretKey.getEncoded(); sks = new SecretKeySpec(secretKeyEncoded, ALGORITHM); } catch (Exception e) { logger.error("",e); } return sks; } public static void main(String[] args) throws Exception { String key = "ron.zheng@tfscha"; String src = "我是Ron"; String enString = encrypt(src,key); System.out.println("加密后的数据:"+enString); System.out.println("解密后的数据:"+decrypt(enString,key)); //不限制密钥长度 String nkey = "ron.zheng@tfschang.com"; enString = encryptNotLimit(src, nkey); System.out.println("加密后的数据:"+enString); System.out.println("解密后的数据:"+decryptNotLimit(enString,nkey)); }}
阅读全文
0 0
- 对称加密算法(3):AES
- 3、AES加密算法
- AES加密算法
- AES加密算法
- AES加密算法
- AES加密算法
- AES加密算法
- AES 加密算法
- aes加密算法
- AES加密算法
- AES加密算法
- AES加密算法
- aes加密算法
- AES加密算法
- AES 加密算法
- AES加密算法
- AES加密算法
- aes 加密算法。
- 学习总结:git命令
- RecyclerView多样式Item布局设计
- 阶乘
- laydate.render is not a function
- 图像质量评估(PSNR+SSIM)-C++
- 3、AES加密算法
- LeetCode26. Remove Duplicates from Sorted Array
- Kafka介绍及升级经验分享
- 7592:求最大公约数问题(2.2基本算法之递归和自调用函数)
- leetcode 96. Unique Binary Search Trees 卡特兰数
- Android-WiFi开发之 WiFi广播监听
- HTML CSS 基础之二
- rk3288 按键rk_key.c
- python操作mongodb 简单Demo-mongodb -version 3.4.0