3DES算法分享

首先认识一下3DES加密中(也是其他加密)主要涉及到的类
导入java中封装java算法的包:sunjce_provider.jar
注意通常导入这个包是会报编译错误,因此需要对myeclipse做如下配置
参考链接
http://jameszhao1987.iteye.com/blog/1468673
然后认识一下涉及的类
KeyGenerator类主要是用于生成密钥的(SecretKey 或是 Key)。
通过deskey = keygen.generateKey();但是这种是依靠类自己去创建密钥,而现实开发中都需要传入自己的私钥然后进行加密和解密。
因此这里选择的是使用
SecretKeyFactory类生成带有自定义私钥的Key类。
注意在使用前需要Security.addProvider(new SunJCE());即将加密包中的class注册到虚拟机当中。
通过SecretKeyFactory实例的generateSecret(KeySpec keySpec)来生产密钥。这里的keySpec我们传入DESedeKeySpec KeySpec = new DESedeKeySpec(input);input就是我们私钥对应的Hex.decode(KeyStr) (使用Hex需要使用bcprov-jdk14-116.jar)返回的数组.KeyStr就是我们的私钥字符串
SecretKeyFactory实例通过SecretKeyFactory.getInstance("DESede")获得。
得到密钥后就可以进行加密操作了,加密操作使用的是
Cipher类,
通过Cipher.getInstance(“DESede/CBC/PKCS5Padding”);获得cipher实例。
调用cipher.init(mode,secretKey,AlgorithmParameterSpec)进行初始化,之后就可以调用c.doFinal(input);来完成加密了。
mode是对应的加密和机密模式,对应的值为1和2,secretKey对应的是上面返回的密钥。
AlgorithmParameterSpec为对应的算法参数。如果为空jdk会默认生产一个对应值。
但是通常返回的是一个加密字符串,所以可以对doFinal方法返回的加密字节数组进行new String(Base64Encode(output), CodingType),即进行base64加密后转换成所需要的编码的字符串。
对加密字符串进行解密和上面比较相似,就是首先对机密串进行base64解密,然后获取密钥,将Cipher.init方法第一个参数设置成机密模式,最后对返回的解密字节数组进行new String(output, CodingType);字符串拼装。

然后讲一下密钥是如何获取的。密钥是长度是48的十六进制。所以获取时
使用下面的方法
StringBuffer key = new StringBuffer();
     Random random = new Random();
     for (int i = 0; i < 48; ++i) {
       int cursor = Math.abs(random.nextInt()) % 16;
       key.append(keyChars[cursor]);
     }
     return key.toString();
keyChars为0到F的字符数组。
即随机生成48个int数字。然后让生成的每个数字对16取余数。最后通过余数找到对应的16进制数。

你可能感兴趣的:(3DES算法分享)