热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java安全架构____DES加密原理

转自李祥:http:blog.csdn.nethappylee6688articledetails44455407Java加解密技术系列之DES标签:加密解密技术de
转自李祥:http://blog.csdn.net/happylee6688/article/details/44455407

Java 加解密技术系列之 DES

标签: 加密解密技术des
5093人阅读 评论(1) 收藏 举报
本文章已收录于:
分类:
作者同类文章X

    目录(?)[-]

    1. 背景
    2. 概念
    3. 基本原理
    4. 主要流程
    5. 分组模式
    6. 代码实现
    7. 结束语



    前几篇文章讲的都是单向加密算法,其中涉及到了 BASE64、MD5、SHA、HMAC 等几个比较常见的加解密算法。这篇文章,以及后面几篇,打算介绍几个对称加密算法,比如:DES、3DES(TripleDES)、AES 等。那么,这篇文章主要是对 DES 大概讲一下。


    背景


    在讨论 DES 之前,首先了解一下什么是对称加密算法吧。对于对称加密算法,他应用的时间比较早,技术相对来说比较成熟,在对称加密算法中,数据发信方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。

    在CODE上查看代码片

    package com.sica.des;import com.google.common.base.Strings;
    import sun.misc.BASE64Decoder;
    import sun.misc.BASE64Encoder;import javax.crypto.Cipher;
    import javax.crypto.KeyGenerator;
    import javax.crypto.SecretKey;
    import javax.crypto.SecretKeyFactory;
    import javax.crypto.spec.DESKeySpec;
    import java.security.InvalidKeyException;
    import java.security.Key;
    import java.security.NoSuchAlgorithmException;
    import java.security.SecureRandom;
    import java.security.spec.InvalidKeySpecException;/*** Created by xiang.li on 2015/2/28.* DES 加解密工具类**

    * 支持 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* 
    */
    public class DES {/*** 定义加密方式*/private final static String KEY_DES = "DES";private final static String KEY_AES = "AES"; // 测试/*** 全局数组*/private final static String[] hexDigits = { "0", "1", "2", "3", "4", "5","6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };/*** 初始化密钥* @return*/public static String init() {return init(null);}/*** 初始化密钥* @param seed 初始化参数* @return*/public static String init(String seed) {SecureRandom secure = null;String str = "";try {if (null != secure) {// 带参数的初始化secure = new SecureRandom(decryptBase64(seed));} else {// 不带参数的初始化secure = new SecureRandom();}KeyGenerator generator = KeyGenerator.getInstance(KEY_DES);generator.init(secure);SecretKey key = generator.generateKey();str = encryptBase64(key.getEncoded());} catch (Exception e) {e.printStackTrace();}return str;}/*** 转换密钥* @param key 密钥的字节数组* @return*/private static Key byteToKey(byte[] key) {SecretKey secretKey = null;try {DESKeySpec dks = new DESKeySpec(key);SecretKeyFactory factory = SecretKeyFactory.getInstance(KEY_DES);secretKey = factory.generateSecret(dks);// 当使用其他对称加密算法时,如AES、Blowfish等算法时,用下述代码替换上述三行代码
    // secretKey &#61; new SecretKeySpec(key, KEY_DES);} catch (InvalidKeyException e) {e.printStackTrace();} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (InvalidKeySpecException e) {e.printStackTrace();}return secretKey;}/*** DES 解密* &#64;param data 需要解密的字符串* &#64;param key 密钥* &#64;return*/public static String decryptDES(String data, String key) {// 验证传入的字符串if (Strings.isNullOrEmpty(data)) {return "";}// 调用解密方法完成解密byte[] bytes &#61; decryptDES(hexString2Bytes(data), key);// 将得到的字节数组变成字符串返回return new String(bytes);}/*** DES 解密* &#64;param data 需要解密的字节数组* &#64;param key 密钥* &#64;return*/public static byte[] decryptDES(byte[] data, String key) {byte[] bytes &#61; null;try {Key k &#61; byteToKey(decryptBase64(key));Cipher cipher &#61; Cipher.getInstance(KEY_DES);cipher.init(Cipher.DECRYPT_MODE, k);bytes &#61; cipher.doFinal(data);} catch (Exception e) {e.printStackTrace();}return bytes;}/*** DES 加密* &#64;param data 需要加密的字符串* &#64;param key 密钥* &#64;return*/public static String encryptDES(String data, String key) {// 验证传入的字符串if (Strings.isNullOrEmpty(data)) {return "";}// 调用加密方法完成加密byte[] bytes &#61; encryptDES(data.getBytes(), key);// 将得到的字节数组变成字符串返回return byteArrayToHexString(bytes);}/*** DES 加密* &#64;param data 需要加密的字节数组* &#64;param key 密钥* &#64;return*/public static byte[] encryptDES(byte[] data, String key) {byte[] bytes &#61; null;try {Key k &#61; byteToKey(decryptBase64(key));Cipher cipher &#61; Cipher.getInstance(KEY_DES);cipher.init(Cipher.ENCRYPT_MODE, k);bytes &#61; cipher.doFinal(data);} catch (Exception e) {e.printStackTrace();}return bytes;}/*** BASE64 解密* &#64;param key 需要解密的字符串* &#64;return 字节数组* &#64;throws Exception*/public static byte[] decryptBase64(String key) throws Exception {return (new BASE64Decoder()).decodeBuffer(key);}/*** BASE64 加密* &#64;param key 需要加密的字节数组* &#64;return 字符串* &#64;throws Exception*/public static String encryptBase64(byte[] key) throws Exception {return (new BASE64Encoder()).encodeBuffer(key);}/*** 将一个字节转化成十六进制形式的字符串* &#64;param b 字节数组* &#64;return 字符串*/private static String byteToHexString(byte b) {int ret &#61; b;//System.out.println("ret &#61; " &#43; ret);if (ret <0) {ret &#43;&#61; 256;}int m &#61; ret / 16;int n &#61; ret % 16;return hexDigits[m] &#43; hexDigits[n];}/*** 转换字节数组为十六进制字符串* &#64;param bytes 字节数组* &#64;return 十六进制字符串*/private static String byteArrayToHexString(byte[] bytes) {StringBuffer sb &#61; new StringBuffer();for (int i &#61; 0; i &#61; &#39;a&#39;)return (c - &#39;a&#39; &#43; 10) & 0x0f;if (c >&#61; &#39;A&#39;)return (c - &#39;A&#39; &#43; 10) & 0x0f;return (c - &#39;0&#39;) & 0x0f;}/*** 测试方法* &#64;param args*/public static void main(String[] args) {String key &#61; DES.init();System.out.println("DES密钥:\n" &#43; key);String word &#61; "123";String encWord &#61; encryptDES(word, key);System.out.println(word &#43; "\n加密后&#xff1a;\n" &#43; encWord);System.out.println(word &#43; "\n解密后&#xff1a;\n" &#43; decryptDES(encWord, key));}
    }


    结束语


    到这里&#xff0c;这篇文章也就差不多要结束了&#xff0c;希望以上的内容对各位看官有稍许的帮助&#xff0c;哪怕一点也好。其实&#xff0c;在日常的开发中&#xff0c;如果不是进度控制的特别严格&#xff0c;对于这些原理性的东西&#xff0c;我们还是需要知道的&#xff0c;对于那些细节的东西&#xff0c;可以不用死记硬背&#xff0c;有网的话&#xff0c;随用随查就可以了。但这个前提是&#xff0c;原理性的东西必须要懂&#xff0c;知道了原理&#xff0c;就会有解决思路&#xff0c;有了思路&#xff0c;解决问题是迟早的事&#xff0c;细节嘛&#xff0c;不用那么纠结&#xff0c;做的时候考虑到就行了&#xff0c;毕竟时间是有限的。


    4
    0

    我的同类文章

    http://blog.csdn.net
    • Java 加解密技术系列之 总结2015-04-27
    • Java 加解密技术系列之 RSA2015-04-23
    • Java 加解密技术系列之 AES2015-03-20
    • Java 加解密技术系列之 HMAC2015-02-27
    • Java 加解密技术系列之 MD52015-02-26
    • Java 加解密技术系列之 DH2015-04-24
    • Java 加解密技术系列之 PBE2015-03-26
    • Java 加解密技术系列之 3DES2015-03-19
    • Java 加解密技术系列之 SHA2015-02-27
    • Java 加解密技术系列之 BASE642015-02-26


    推荐阅读
    author-avatar
    etqq
    这个家伙很懒,什么也没留下!
    Tags | 热门标签
    RankList | 热门文章
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有