美文网首页Android 学习
JAVA加解密11-对称加密算法-DES以及DESede算法

JAVA加解密11-对称加密算法-DES以及DESede算法

作者: K1024 | 来源:发表于2016-04-11 22:18 被阅读326次

一、简述
对称加密算法就是能将数据加解密。加密的时候用密钥对数据进行加密,解密的时候使用同样的密钥对数据进行解密。
DES是美国国家标准研究所提出的算法。因为加解密的数据安全性和密钥长度成正比。des的56位的密钥已经形成安全隐患,在1998年之后就很少被采用。但是一些老旧的系统还在使用。因为这个des算法并没有被美国标准委员会公布全部算法,大家一致怀疑被留了后门。所以慢慢就被淘汰掉了。
后来针对des算法进行了改进,有了三重des算法(DESede)。针对des算法的密钥长度较短以及迭代次数偏少问题做了相应改进,提高了安全强度。不过desede算法处理速度较慢,密钥计算时间较长,加密效率不高问题使得对称加密算法的发展不容乐观。
二、交互模型
1.消息传递双方约定密钥,通常由消息发送方(甲方)构建密钥通知消息接收方(乙方)
2.甲方使用密钥对数据记性加密,然后将加密后的数据通过网络传送给乙方
3.乙方接收到数据,然后使用约定的密钥对数据进行解密

整个模型很像hmac的数据交互过程,都是一个密钥的概念,而且密钥都是双方知道的。但是hmac算法是信息摘要的获取。这边是对数据进行加解密

三、java6和bouncycastle针对des算法的数据加密支持还是不同的。体现在密钥长度,工作模式以及填充方式上。这里bouncycastle的密钥长度是64位。不过在DESede算法上bouncy castle也是密钥长度比java6的密钥长度要长。
不过所有的对称加密算法的实现还是类似的。可以参看如下的代码:
1.des算法

package com.ca.test;
import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import org.apache.commons.codec.binary.Base64;
/**
 * DES对称加密算法
 * @author kongqz
 * */
public class DESCoder {
    /**
     * 密钥算法
     * java支持56位密钥,bouncycastle支持64位
     * */
    public static final String KEY_ALGORITHM="DES";
    
    /**
     * 加密/解密算法/工作模式/填充方式
     * */
    public static final String CIPHER_ALGORITHM="DES/ECB/PKCS5Padding";
    
    /**
     * 
     * 生成密钥,java6只支持56位密钥,bouncycastle支持64位密钥
     * @return byte[] 二进制密钥
     * */
    public static byte[] initkey() throws Exception{
        
        //实例化密钥生成器
        KeyGenerator kg=KeyGenerator.getInstance(KEY_ALGORITHM);
        //初始化密钥生成器
        kg.init(56);
        //生成密钥
        SecretKey secretKey=kg.generateKey();
        //获取二进制密钥编码形式
        return secretKey.getEncoded();
    }
    /**
     * 转换密钥
     * @param key 二进制密钥
     * @return Key 密钥
     * */
    public static Key toKey(byte[] key) throws Exception{
        //实例化Des密钥
        DESKeySpec dks=new DESKeySpec(key);
        //实例化密钥工厂
        SecretKeyFactory keyFactory=SecretKeyFactory.getInstance(KEY_ALGORITHM);
        //生成密钥
        SecretKey secretKey=keyFactory.generateSecret(dks);
        return secretKey;
    }
    
    /**
     * 加密数据
     * @param data 待加密数据
     * @param key 密钥
     * @return byte[] 加密后的数据
     * */
    public static byte[] encrypt(byte[] data,byte[] key) throws Exception{
        //还原密钥
        Key k=toKey(key);
        //实例化
        Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);
        //初始化,设置为加密模式
        cipher.init(Cipher.ENCRYPT_MODE, k);
        //执行操作
        return cipher.doFinal(data);
    }
    /**
     * 解密数据
     * @param data 待解密数据
     * @param key 密钥
     * @return byte[] 解密后的数据
     * */
    public static byte[] decrypt(byte[] data,byte[] key) throws Exception{
        //欢迎密钥
        Key k =toKey(key);
        //实例化
        Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);
        //初始化,设置为解密模式
        cipher.init(Cipher.DECRYPT_MODE, k);
        //执行操作
        return cipher.doFinal(data);
    }
    /**
     * @param args
     * @throws Exception 
     */
    public static void main(String[] args) throws Exception {
        String str="DES";
        System.out.println("原文:"+str);
        //初始化密钥
        byte[] key=DESCoder.initkey();
        System.out.println("密钥:"+Base64.encodeBase64String(key));
        //加密数据
        byte[] data=DESCoder.encrypt(str.getBytes(), key);
        System.out.println("加密后:"+Base64.encodeBase64String(data));
        //解密数据
        data=DESCoder.decrypt(data, key);
        System.out.println("解密后:"+new String(data));
    }
}
控制台输出结果:
原文:DES
密钥:ocewbYVbtmE=
加密后:w6KsVSkLV3Q=
解密后:DES

2.desede算法演示

package com.ca.test;
import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import org.apache.commons.codec.binary.Base64;
/**
 * DESede对称加密算法演示
 * @author kongqz
 * */
public class DESedeCoder {
    /**
     * 密钥算法
     * */
    public static final String KEY_ALGORITHM="DESede";
    
    /**
     * 加密/解密算法/工作模式/填充方式
     * */
    public static final String CIPHER_ALGORITHM="DESede/ECB/PKCS5Padding";
    
    /**
     * 
     * 生成密钥
     * @return byte[] 二进制密钥
     * */
    public static byte[] initkey() throws Exception{
        
        //实例化密钥生成器
        KeyGenerator kg=KeyGenerator.getInstance(KEY_ALGORITHM);
        //初始化密钥生成器
        kg.init(168);
        //生成密钥
        SecretKey secretKey=kg.generateKey();
        //获取二进制密钥编码形式
        return secretKey.getEncoded();
    }
    /**
     * 转换密钥
     * @param key 二进制密钥
     * @return Key 密钥
     * */
    public static Key toKey(byte[] key) throws Exception{
        //实例化Des密钥
        DESedeKeySpec dks=new DESedeKeySpec(key);
        //实例化密钥工厂
        SecretKeyFactory keyFactory=SecretKeyFactory.getInstance(KEY_ALGORITHM);
        //生成密钥
        SecretKey secretKey=keyFactory.generateSecret(dks);
        return secretKey;
    }
    
    /**
     * 加密数据
     * @param data 待加密数据
     * @param key 密钥
     * @return byte[] 加密后的数据
     * */
    public static byte[] encrypt(byte[] data,byte[] key) throws Exception{
        //还原密钥
        Key k=toKey(key);
        //实例化
        Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);
        //初始化,设置为加密模式
        cipher.init(Cipher.ENCRYPT_MODE, k);
        //执行操作
        return cipher.doFinal(data);
    }
    /**
     * 解密数据
     * @param data 待解密数据
     * @param key 密钥
     * @return byte[] 解密后的数据
     * */
    public static byte[] decrypt(byte[] data,byte[] key) throws Exception{
        //欢迎密钥
        Key k =toKey(key);
        //实例化
        Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);
        //初始化,设置为解密模式
        cipher.init(Cipher.DECRYPT_MODE, k);
        //执行操作
        return cipher.doFinal(data);
    }
    /**
     * 进行加解密的测试
     * @throws Exception 
     */
    public static void main(String[] args) throws Exception {
        String str="DESede";
        System.out.println("原文:/t"+str);
        //初始化密钥
        byte[] key=DESedeCoder.initkey();
        System.out.println("密钥:/t"+Base64.encodeBase64String(key));
        //加密数据
        byte[] data=DESedeCoder.encrypt(str.getBytes(), key);
        System.out.println("加密后:/t"+Base64.encodeBase64String(data));
        //解密数据
        data=DESedeCoder.decrypt(data, key);
        System.out.println("解密后:/t"+new String(data));
    }
}
控制台输出结果:
原文: DESede
密钥: BBDmwTjBsF7IwTIyGWt1bmFntRyUgMQL
加密后:    FM/DsEv3KgM=
解密后:    DESede

四、总结
1.主要看设定密钥的长度的变化。同时,bouncycastle支持更多的填充模式,在相同算法上比java6实现的版本的密钥长度要长
2.java的api中仅仅提供了DES,DESede和PBE 3三种对称加密算法密钥材料实现类

相关文章

  • JAVA加解密11-对称加密算法-DES以及DESede算法

    一、简述对称加密算法就是能将数据加解密。加密的时候用密钥对数据进行加密,解密的时候使用同样的密钥对数据进行解密。D...

  • 基于Java API的DESede(Triple-DES)加密解

    DESede又称Triple-DES即三重DES加密算法,加强了DES的安全性,但速度稍慢,它是一种对称加密算法,...

  • 区块链之加解密算法

    常用的加解密算法  常用的加解密算法有三类:对称加密算法、非对称加密算法以及hash加密算法。 在比特币中用到了非...

  • Java 常用加密算法(二)---对称加密(DES/3DES(T

    Java 常用加密算法(二)---对称加密(DES/3DES(TripleDES)/AES) 基于“对称密钥”的加...

  • Des

    常用加密算法的Java实现总结 对称加密算法DES、3DES和AES 算法原理DES算法把64位的明文输入块变为6...

  • Java中的加密算法(二)

    1.对称加密算法1.1对称加密算法-DES 在Java中的加密算法(一)中主要讲解了密码中常用的术语,Java安全...

  • iOS常用加密算法

    本篇主要介绍笔者在iOS开发工作中用到的加解密算法的使用,主要包括:1)对称加密算法:AES、DES、3DES2)...

  • PHP对称加密-AES

    对称加解密算法中,当前最为安全的是 AES 加密算法(以前应该是是 DES 加密算法),PHP 提供了两个可以用于...

  • 数字签名、数字证书以及双向认证的理解

    AES DES等对称加密算法,只有一个密匙,加解密速度优于非对称加密算法,弊端是,传输信息过程中,一旦密匙被盗,加...

  • ios 加密

    1、常见加密算法 : 对称加密:AES、DES、3DES、RC4 优点:加解密速度快 没有长度限制 缺点:密钥容易...

网友评论

    本文标题:JAVA加解密11-对称加密算法-DES以及DESede算法

    本文链接:https://www.haomeiwen.com/subject/haablttx.html