上一篇文章说明了秘钥生成器与秘钥工厂的功能与区别,本篇内容带大家做一个对称性加密的详细理解
步骤1,使用对称性加密生成器,生成java内部格式的秘钥(非秘钥规范格式,既不透明秘钥格式)。透明介质/透明格式的意思是遵循特定标准,大家都知道,可以按标准解析使用的意思,不准确,但是可以先这么理解。
KeyGenerator keyGenerator = KeyGenerator.getInstance(“DESede”);
keyGenerator.init(new SecureRandom());
SecretKey secretKey= keyGenerator.generateKey();
步骤2,使用不透明密码格式的secretKey秘钥编码值,初始化一个特定秘钥规范的秘钥描述对象,并通过SecretKeyFactory秘钥工厂产生特定格式的秘钥(理解为转为为特定格式的秘钥也行)。
DESedeKeySpec deSedeKeySpec=new DESedeKeySpec(secretKey.getEncoded());
SecretKeyFactory secretKeyFactory=SecretKeyFactory.getInstance(“DESede”);
Key key= secretKeyFactory.generateSecret(deSedeKeySpec);
步骤3,可以将特定格式的秘钥 编码 值进行保存,用于传输给别人使用,使用方读取编码后按特定格式的秘钥描述对象重构秘钥对象.Hex是commons-codec-1.10. jar 包里提供的工具类
String keyCode= Hex.encodeHexString(key.getEncoded());
OutputStream outputStream=new FileOutputStream(new File(“D:\\keyCode.txt”));
outputStream.write(keyencode.get byte s());
outputStream. close ();
步骤4、用密码类使用秘钥来加密内容
Cipher cipher=Cipher.getInstance(“DESede/ECB/PKCS5Padding”);
cipher.init(Cipher.ENCRYPT_MODE, key);//特别说明,这个key就是秘钥,如果这个秘钥是特定规范格式的秘钥,则解密时也许使用特定秘钥格式的秘钥进行解密,比如:如果直接用SecretKey secretKey= keyGenerator.generateKey();的秘钥,解密也需要此秘钥,就不能是使用SecretKeyFactory转换过的秘钥了。此处例子使用转换过的秘钥,既Key key= secretKeyFactory.generateSecret(deSedeKeySpec);这个秘钥。//ENCRYPT_MODE加密模式
String secretContent= Hex.encodeHexString(cipher.doFinal(“我是内容”.getBytes()));//加密的内容怎么存储或传输就不说了
步骤5、读取秘钥文件D:\\keyCode.txt,取出秘钥编码(文件输入流的过程省略),使用秘钥编码重构秘钥对象,进行解密
String keystr = “keyCode.txt里的内容”;
String secretContent=”加密后的内容,怎么得到,自己悟”;
byte[] keybyte= Hex.decodeHex(keystr .toCharArray());
DESedeKeySpec deSedeKeySpec=new DESedeKeySpec(keybyte);
SecretKeyFactory secretKeyFactory=SecretKeyFactory.getInstance(“DESede”);
Key key= secretKeyFactory.generateSecret(deSedeKeySpec);//得到特定格式规范的秘钥,这里的透明密码格式是DES-EDE (“triple-DES”)
//使用密码工具类用秘钥进行解密
Cipher cipher=Cipher.getInstance(“DESede/ECB/PKCS5Padding”);
cipher.init(Cipher.DECRYPT_MODE, key);//DECRYPT_MODE解密模式
String rs= new String(cipher.doFinal(secretContent));
备注:如果是不想用透明规范,也可以直接使用SecretKey非透明秘钥和secretKey.getEncoded非透明秘钥编码,不过,这在异构系统和非同一系统内,以及不同项目之间的通信加解密,需要约定好,不如使用透明规范更便于对接。