一、对称加密算法
1.DES
可以存在获取秘钥算法和加解密算法不同情况
创建秘钥:
注入BouncyCastle
要添加Security.addProvider(new BouncyCastleProvider());下面的"BC"才会生效
KeyGenerator keyGenerator= KeyGenerator.getInstance("DES","BC");
初始化设置64位的,java7是56位
keyGenerator.init(64);
生成秘钥(还原的时候就是还原成这个来解密)
SecretKey key= keyGenerator.generateKey();
转为二进制形式
byte[] keys=key.getEncoded();
用Base64对秘钥转换为可见字符串存储
转换秘钥
获取秘钥二进制形式
创建秘钥材料
DESKeySpec desKeySpec=new DESKeySpec(keys);
实例化秘钥工厂
SecretKeyFactory skf=SecretKeyFactory.getInstance("DES");
生成秘钥
SecretKey key2=skf.generateSecret(desKeySpec);
加解密
加密解密步骤一样,只是在初始化参数的时候类型参数(Cipher.ENCRYPT_MODE和Cipher.DECRYPT_MODE)不同
获取加解密实例
Cipher cipher=Cipher.getInstance("DES");
初始化数据 加密、解密 秘钥
cipher.init(Cipher.ENCRYPT_MODE, key);加密
cipher2.init(Cipher.DECRYPT_MODE, key);解密
执行加密解密操作
byte[] res2=cipher2.doFinal(data);
2.AES
Security.addProvider(new BouncyCastleProvider());
String string="Java加密与解密的艺术";
byte[] str=string.getBytes("utf-8");
//生成密钥
KeyGenerator keyGenerator= null;
try {
keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(256);
SecretKey secretKey=keyGenerator.generateKey();
byte[] keys=secretKey.getEncoded();
System.out.println(Base64Utils.encodeToString(keys));
//还原密钥
SecretKey secretKey1=new SecretKeySpec(keys,"AES");
//加密
Cipher cipher=Cipher.getInstance("AES","BC");
cipher.init(Cipher.ENCRYPT_MODE,secretKey);
byte[]encodeStr=cipher.doFinal(str);
System.out.println(Base64Utils.encodeToString(encodeStr));
//解密
Cipher cipher1=Cipher.getInstance("AES");
cipher1.init(Cipher.DECRYPT_MODE,secretKey1);
byte[]decodeStr=cipher1.doFinal(encodeStr);
System.out.println(new String(decodeStr,"utf-8"));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (NoSuchProviderException e) {
e.printStackTrace();
}
二、非对称加密算法
三、这些不知道怎么分
Base64:
1 获取加密二进制数组
2 将原数组3个8位转为4个6位并在高位补0(两个0)
3 对照Base64加密表获取对应加密字母并转为10进制的二进制数组(底层强转为byte)
提供的工具类:spring有提供、 jdk1.8有提供、BouncyCastle有提供(依赖包 bcprov-jdk15on),commons-codec提供的
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.61</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.13</version>
</dependency>
Md5
commons-code提供DigestUtils工具类