desdesedejavaaes

    接下来我们介绍对称加密算法,最常用的莫过于DES数据加密算法。

DES

DES-Data Encryption Standard,即数据加密算法。是IBM公司于1975年研究成功并公开发表的。DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。

  DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位。







通过java代码实现如下:Coder类见 Java加密技术(一)

Java代码  收藏代码

import java.security.Key; 

import java.security.SecureRandom; 

 

import javax.crypto.Cipher; 

import javax.crypto.KeyGenerator; 

import javax.crypto.SecretKey; 

import javax.crypto.SecretKeyFactory; 

import javax.crypto.spec.DESKeySpec; 

 

 

/**

* DES安全编码组件



* <pre>

* 支持 DES、DESede(TripleDES,就是3DES)、AES、Blowfish、RC2、RC4(ARCFOUR)

* DES                  key size must be equal to 56

* DESede(TripleDES)    key size must be equal to 112 or 168

* AES                  key size must be equal to 128, 192 or 256,but 192 and 256 bits may not be available

* Blowfish             key size must be multiple of 8, and can only range from 32 to 448 (inclusive)

* RC2                  key size must be between 40 and 1024 bits

* RC4(ARCFOUR)         key size must be between 40 and 1024 bits

* 具体内容 需要关注 JDK Document http://.../docs/technotes/guides/security/SunProviders.html

* </pre>



* @author 梁栋

* @version 1.0

* @since 1.0

*/ 

public abstract class DESCoder extends Coder { 

    /**

     * ALGORITHM 算法 <br>

     * 可替换为以下任意一种算法,同时key值的size相应改变。

     * 

     * <pre>

     * DES                  key size must be equal to 56

     * DESede(TripleDES)    key size must be equal to 112 or 168

     * AES                  key size must be equal to 128, 192 or 256,but 192 and 256 bits may not be available

     * Blowfish             key size must be multiple of 8, and can only range from 32 to 448 (inclusive)

     * RC2                  key size must be between 40 and 1024 bits

     * RC4(ARCFOUR)         key size must be between 40 and 1024 bits

     * </pre>

     * 

     * 在Key toKey(byte[] key)方法中使用下述代码

     * <code>SecretKey secretKey = new SecretKeySpec(key, ALGORITHM);</code> 替换

     * <code>

     * DESKeySpec dks = new DESKeySpec(key);

     * SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);

     * SecretKey secretKey = keyFactory.generateSecret(dks);

     * </code>

     */ 

    public static final String ALGORITHM = "DES"; 

 

    /**

     * 转换密钥<br>

     * 

     * @param key

     * @return

     * @throws Exception

     */ 

    private static Key toKey(byte[] key) throws Exception { 

        DESKeySpec dks = new DESKeySpec(key); 

        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM); 

        SecretKey secretKey = keyFactory.generateSecret(dks); 

 

        // 当使用其他对称加密算法时,如AES、Blowfish等算法时,用下述代码替换上述三行代码 

        // SecretKey secretKey = new SecretKeySpec(key, ALGORITHM); 

 

        return secretKey; 

    } 

 

    /**

     * 解密

     * 

     * @param data

     * @param key

     * @return

     * @throws Exception

     */ 

    public static byte[] decrypt(byte[] data, String key) throws Exception { 

        Key k = toKey(decryptBASE64(key)); 

 

        Cipher cipher = Cipher.getInstance(ALGORITHM); 

        cipher.init(Cipher.DECRYPT_MODE, k); 

 

        return cipher.doFinal(data); 

    } 

 

    /**

     * 加密

     * 

     * @param data

     * @param key

     * @return

     * @throws Exception

     */ 

    public static byte[] encrypt(byte[] data, String key) throws Exception { 

        Key k = toKey(decryptBASE64(key)); 

        Cipher cipher = Cipher.getInstance(ALGORITHM); 

        cipher.init(Cipher.ENCRYPT_MODE, k); 

 

        return cipher.doFinal(data); 

    } 

 

    /**

     * 生成密钥

     * 

     * @return

     * @throws Exception

     */ 

    public static String initKey() throws Exception { 

        return initKey(null); 

    } 

 

    /**

     * 生成密钥

     * 

     * @param seed

     * @return

     * @throws Exception

     */ 

    public static String initKey(String seed) throws Exception { 

        SecureRandom secureRandom = null; 

 

        if (seed != null) { 

            secureRandom = new SecureRandom(decryptBASE64(seed)); 

        } else { 

            secureRandom = new SecureRandom(); 

        } 

 

        KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM); 

        kg.init(secureRandom); 

 

        SecretKey secretKey = kg.generateKey(); 

 

        return encryptBASE64(secretKey.getEncoded()); 

    } 





延续上一个类的实现,我们通过MD5以及SHA对字符串加密生成密钥,这是比较常见的密钥生成方式。

再给出一个测试类:

Java代码  收藏代码

import static org.junit.Assert.*; 

 

 

import org.junit.Test; 

 

/**



* @author 梁栋

* @version 1.0

* @since 1.0

*/ 

public class DESCoderTest { 

 

    @Test 

    public void test() throws Exception { 

        String inputStr = "DES"; 

        String key = DESCoder.initKey(); 

        System.err.println("原文:\t" + inputStr); 

 

        System.err.println("密钥:\t" + key); 

 

        byte[] inputData = inputStr.getBytes(); 

        inputData = DESCoder.encrypt(inputData, key); 

 

        System.err.println("加密后:\t" + DESCoder.encryptBASE64(inputData)); 

 

        byte[] outputData = DESCoder.decrypt(inputData, key); 

        String outputStr = new String(outputData); 

 

        System.err.println("解密后:\t" + outputStr); 

 

        assertEquals(inputStr, outputStr); 

    } 





得到的输出内容如下:

Console代码  收藏代码

原文: DES 

密钥: f3wEtRrV6q0= 

 

加密后:    C6qe9oNIzRY= 

 

解密后:    DES 



    由控制台得到的输出,我们能够比对加密、解密后结果一致。这是一种简单的加密解密方式,只有一个密钥。

    其实DES有很多同胞兄弟,如DESede(TripleDES)、AES、Blowfish、RC2、RC4(ARCFOUR)。这里就不过多阐述了,大同小异,只要换掉ALGORITHM换成对应的值,同时做一个代码替换SecretKey secretKey = new SecretKeySpec(key, ALGORITHM);就可以了,此外就是密钥长度不同了。



Java代码  收藏代码

/**

* DES          key size must be equal to 56

* DESede(TripleDES) key size must be equal to 112 or 168

* AES          key size must be equal to 128, 192 or 256,but 192 and 256 bits may not be available

* Blowfish     key size must be multiple of 8, and can only range from 32 to 448 (inclusive)

* RC2          key size must be between 40 and 1024 bits

* RC4(ARCFOUR) key size must be between 40 and 1024 bits

**/

Java加密技术(二)——对称加密算法DES&AES的更多相关文章

  1. 常用加密算法的Java实现总结(二) ——对称加密算法DES、3DES和AES

    1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发 ...

  2. Java进阶(七)Java加密技术之非对称加密算法RSA

    Java加密技术(四)--非对称加密算法RSA 非对称加密算法--RSA 基本概念 非对称加密算法是一种密钥的保密方法. 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(priv ...

  3. Java进阶(八)Java加密技术之对称加密 非对称加密 不可逆加密算法

    对称加密 非对称加密 不可逆加密算法 根据密钥类型不同可以将现代密码技术分为两类:对称加密算法(私钥密码体系)和非对称加密算法(公钥密码体系). 1 对称加密算法 原理 对称加密算法中,数据加密和解密 ...

  4. 对称加密算法DES,3重DES,TDEA,Blowfish,RC5,IDEA,AES。

    对称加密算法:DES,3重DES,TDEA,Blowfish,RC5,IDEA,AES. 1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文 ...

  5. Atitit.加密算法 des  aes 各个语言不同的原理与解决方案java php c#

    Atitit.加密算法 des  aes 各个语言不同的原理与解决方案java php c# 1. 加密算法的参数::算法/模式/填充 1 2. 标准加密api使用流程1 2.1. Md5——16bi ...

  6. 对称加密算法DES、3DES和AES 原理总结(转载)

    1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发 ...

  7. Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC

    Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC 博客分类: Java/Security Javabase64macmd5sha     加密解密,曾经是我一 ...

  8. Java加密技术

    相关链接: Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC Java加密技术(二)——对称加密DES&AES Java加密技术(三)——PBE算法  ...

  9. Java加密技术(八)——数字证书

    原文:http://snowolf.iteye.com/blog/391931 请大家在阅读本篇内容时先阅读 Java加密技术(四),预先了解RSA加密算法. 在构建Java代码实现前,我们需要完成证 ...

  10. [转] 对称加密算法DES、3DES

    转自:http://www.blogjava.net/amigoxie/archive/2014/07/06/415503.html 1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法, ...

随机推荐

  1. 【内存操作】C语言内存函数介绍以及部分模拟实现【初学者保姆级福利】超详细的解释和注释

    C语言 内存函数的使用以及部分模拟实现 求个赞求个赞求个赞求个赞 谢谢 先赞后看好习惯 打字不容易,这都是很用心做的,希望得到支持你 大家的点赞和支持对于我来说是一种非常重要的动力 看完之后别忘记关注 ...

  2. 教你用JavaScript实现进度条

    案例介绍 欢迎来到我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用JavaScript编程实战案例,做一个进度条.进度条数字自动增加,条状图片动画演示进度完成度.通过实战我们将学会函数fun ...

  3. JAVA入门学习之GUI编程思想——day01

    GUI编程 什么是GUI???图形化编程 组件 窗口 弹窗 按钮 文本框 图片 事件 ..... GUI的核心:AWT Swing GUI编程的缺陷: ​ 1.界面不美观 ​ 2.需要jre环境 虽然 ...

  4. 内存泄漏定位工具之 mtrace(一)

    1 前言 mtrace(memory trace),是 GNU Glibc 自带的内存问题检测工具,它可以用来协助定位内存泄露问题.它的实现源码在glibc源码的malloc目录下,其基本设计原理为设 ...

  5. 21.2 静态TLS--《Windows核心编程》

    部分笔记来自于:https://blog.csdn.net/Steven_programe_life/article/details/103358251?utm_medium=distribute.p ...

  6. 用superxmlparser.pas的XMLParseString----XML转Json注意

    了解XML转成Json时候用的时候多了个#号: ---------------------------------------------------------------------------- ...

  7. 从零开始的 dbt 入门教程 (dbt core 开发进阶篇)

    引 在上一篇文章中,我们花了专门的篇幅介绍了 dbt 更多实用的命令,那么我们继续按照之前的约定来聊 dbt 中你可能会遇到的疑惑以及有用的概念,如果你是 dbt 初学者,我相信如下知识点一定会对你有 ...

  8. NC15976 小C的周末

    题目链接 题目 题目描述 愉快的周末到了,小C和他的N-1个朋友买了M个游戏,游戏编号从1~M.每个游戏都是多人游戏,他们打算周末一起打游戏. 小C的每个朋友都决定好了要玩哪一款游戏(会有一组人打同一 ...

  9. 【Unity3D】半球卷屏特效

    1 原理 ​ 凸镜贴图 和 渐变凸镜贴图 中介绍了使用 OpenGL 实现凸镜贴图及其原理,通过顶点坐标映射到纹理坐标,并构造三角形网格,构建了真正的三维凸镜模型.本文通过 Shader 实现半球卷屏 ...

  10. 解决ufw下pptp客户端连接问题

    解决ufw下pptp客户端连接问题 解决ubuntu在启动ufw的情况下pptp客户端无法链接的问题. 修改/etc/ufw/before.rules 在COMMIT之前添加如下内容: -A ufw- ...