电信IOT平台编解码插件,JAVA实现AES128-ECB-PKCS7Padding加解密代码
【摘要】 package com.thrid.party.codec.demo;import java.io.UnsupportedEncodingException;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;import java.security.SecureRand...
package com.thrid.party.codec.demo; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.Security; 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; /** * AES 加密 ECB 模式 PKCS7Padding 填充模式 * * @author * */ public class AESECBPKCS7Padding{ static String ENCRYPT_CHARSET = "UTF-8"; // static String mode = "AES/ECB/PKCS7Padding"; /* public static void main(String[] args) throws Exception { String content = "hello World"; String password = "151"; System.out.println("原内容:\n"+content); String tempContent = encrypt(content,password,mode); System.err.println("加密后:\n"+tempContent); tempContent = decrypt(tempContent, password,mode ); System.out.println("解密后:\n"+tempContent); } */ public static String encrypt(String content, String password, String mode) throws Exception{ try { SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); KeyGenerator kgen = KeyGenerator.getInstance("AES"); secureRandom.setSeed(password.getBytes()); kgen.init(128, secureRandom); SecretKey secretKey = kgen.generateKey(); byte[] enCodeFormat = secretKey.getEncoded(); SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES"); Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); Cipher cipher = Cipher.getInstance(mode);// 创建密码器 byte[] byteContent = content.getBytes(ENCRYPT_CHARSET); cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化 byte[] result = cipher.doFinal(byteContent); if (result != null && result.length > 0) { /* * 注意: return new String(result,ENCRYPT_CHARSET); * 会出现javax.crypto.IllegalBlockSizeException: Input length must be multiple of * 16 when decrypting with padded cipher 加密后的byte数组是不能强制转换成字符串的, * 字符串和byte数组在这种情况下不是互逆的; 需要将二进制数据转换成十六进制表示 */ return parseByte2HexStr(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; } /** * 解密 * * @param content 待解密内容 * @param password 解密密钥 * @return */ public static String decrypt(String content, String password, String mode) throws Exception { try { if (content == null) { return null; } byte[] newContent = parseHexStr2Byte(content);// 将16进制转换为二进制 SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); KeyGenerator kgen = KeyGenerator.getInstance("AES"); secureRandom.setSeed(password.getBytes()); kgen.init(128, secureRandom); // 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(mode);// 创建密码器 cipher.init(Cipher.DECRYPT_MODE, key);// 初始化 byte[] result = cipher.doFinal(newContent); if (result != null && result.length > 0) { return new String(result, "UTF-8"); } } 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; } /** * 将二进制转换成16进制 * * @param buf * @return */ 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进制转换为二进制 * * @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; } }
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)