java加密解密初探-DES

来源:互联网 发布:鬼脚七为什么离开淘宝 编辑:程序博客网 时间:2024/06/05 17:05

DES为对称加密算法。
KeyGenerator 秘钥生成器。

一、
首先说生成秘钥:
看下文代码字符串变量srandom 为我们生成SecureRandom时候传递的参数,此参数决定了接下来SecretKey 的值 keyGenerator.init的方法有多种 其中不传递SecureRandom时候会随机生成SecretKey,如果固定传递一个SecureRandom的话SecretKey也不会变,运行下面两段代码便知:

KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");String srandom = "此字符串为我们生成秘钥时候给的一种随机"; SecureRandom sr = new SecureRandom(srandom .getBytes()); keyGenerator.init(56,sr); SecretKey secretKey = keyGenerator.generateKey(); System.out.println(new BASE64Encoder().encode(secretKey.getEncoded()) );

KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");keyGenerator.init(56); SecretKey secretKey = keyGenerator.generateKey(); System.out.println(new BASE64Encoder().encode(secretKey.getEncoded()) );

二、
secretKey 就是我们所说的秘钥,加密和解密都用它。 我们常常把秘钥转换成字节数组便于传递。 或者有字节数组转成字符串便于我们能直接看到。 我们使用 sun.misc.BASE64Encoder 把字节数组转换成字符串。所以必须使用对应的类sun.misc.BASE64Decoder来逆转字符串为数组。
接下来看加密:

Cipher c = Cipher.getInstance(“DES”);
//Cipher.ENCRYPT_MODE 这个表示加密
c.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] b = c.doFinal(“我们需要加密的内容”.getBytes());
String text = new BASE64Encoder().encode(b);
System.out.println(“我们加密后的内容:”+text );

再看解密:

c.init(Cipher.DECRYPT_MODE, secretKey);
//text先由BASE64Decoder转成数组
byte[] cb = c.doFinal(new BASE64Decoder().decodeBuffer(text));
System.out.println(“解密后的字符串” + new String(cb));

加密解密结束。下面看下关联的一些类的使用:
每次加密和每次解密不会永远在一个方法里面,所以要求我们把解密的秘钥存储下来。秘钥是无法直接存储,我们往往会把秘钥转化为字节数组。然后可能(我说的是可能)再转化成字符串。这时候就会出现一个问题:怎么把字符串转换成SecretKey。我初接触java加密的时候看到网上很多地方都把加密解密写到一起(包括我上述的代码也是)不符合实际情况。这里要讲一下如果我们把秘钥转换成字符串后怎么再转回秘钥。

首先我们先把秘钥转成了字符串:

String mykey = new BASE64Encoder().encode(secretKey.getEncoded()) ;

然后利用DESKeySpec类和SecretKeyFactory 类还原SecretKey

DESKeySpec dsk = new DESKeySpec(new
BASE64Decoder().decodeBuffer(mykey));
SecretKeyFactory skf = SecretKeyFactory.getInstance(“DES”);
SecretKey mysecretKey = skf.generateSecret(dsk);
c.init(Cipher.DECRYPT_MODE, mysecretKey);
//text先由BASE64Decoder转成数组
byte[] cb = c.doFinal(new BASE64Decoder().decodeBuffer(text));
System.out.println(“解密后的字符串” + new String(cb));

结束。

1 0
原创粉丝点击