SecretKeySpec key = new SecretKeySpec(Arrays.copyOf(password.getBytes( "utf-8" ), 16 ), "AES" );
Cipher cipher = Cipher.getInstance( "AES/ECB/PKCS5Padding" );
byte [] byteContent = content.getBytes( "utf-8" );
cipher.init(Cipher.ENCRYPT_MODE, key);
byte [] result = cipher.doFinal(byteContent);
return result;
用Base64处理字节数组,得到加密字符串
CSDN很多加密代码的key生成的很复杂,而且和在线加密不一样,主要区别在于: 1. SecretKeySpec key = new SecretKeySpec(encodeKey, "AES"); 2. SecretKeySpec key = new SecretKeySpec(password.getBytes( ) , "AES" );
加密网站用的是第2个,直接用key字符串的字节数组(一般取前16个字节,可用Arrays.copyOf(bytes,16))。
第1个是先给key进行了一番加密操作,再把它的字节数组给 SecretKeySpec
KeyGenerator kgen = KeyGenerator.getInstance("AES"); kgen.init(128, new SecureRandom(password.getBytes())); SecretKey secretKey = kgen.generateKey(); byte[] encodeKey = secretKey.getEncoded(); SecretKeySpec key = new SecretKeySpec(encodeKey, "AES");
Cipher cipher = Cipher.getInstance("AES");//默认ECB模式 byte[] byteContent = content.getBytes("utf-8"); cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化 byte[] result = cipher.doFinal(byteContent);
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; }
password就是秘钥,有的用key,有的用encodeRules 网站只是截取我们字符串字节的前16位字节数组作为秘钥进行加密
128位密钥,用jdk自带库实现 [参考1](https://blog.csdn.net/u013871100/article/details/80100992) [参考2](https://blog.csdn.net/qq_18870023/article/details/52183755) AES涉及几个参数:加密模式、补码方式、偏移量 经验证jdk默认的是ECB模式,并不是参考中所说的CBC 因为,ECB模式是不需要偏移的,默认情况下插入偏移,从jdk报错信息提示来看,默认确定是ECB 代码在下,加密和解密都没问题。可是加密结果和在线加密工具出的结果不一致 很费解为什么不一致,参数设置都已经一样了,只能先这样了 CBC需要IV,即秘钥偏移量
|