DES算法

算法概要

在DES.java当中创立两个方法分别用作加密和解密

通过


`public static byte[] encrypt(byte[] data, String sKey)

创建方法进行加密

通过


public static byte[] decrypt(byte[] src, String sKey) throws Exception

创建方法来进行解密。

加密过程中首先通过将一个String类型的字符串中包含的字符转换成byte类型并且用

keyinit 命令为每个用户建立一个 skey 客户并存入一个byte[]数组中

即: byte[] key = sKey.getBytes();来初始化数组。

通过类IvParameterSpec指定了个初始化向量,将Key带入新建立的IvParameterSpec对象当中。再通过DESKeySpec指定des键


IvParameterSpec iv = new IvParameterSpec(key); DESKeySpec desKey = new DESKeySpec(key);

创建一个keyFactory,然后把DESKeySpec转换成securekey


SecretKeyFactory  keyFactory=SecretKeyFactory.getInstance("DES"); SecretKey securekey=keyFactory.generateSecret(desKey);

Cipher对象通过参数DESede/CBC/PKCS5Padding实现DES的实际对称加密操作。

参数也可以用DESede代替,它与DESede/ECB/PKCS5Padding等价。

这个参数分为三段。第一段是加密算法的名称 ,第二段是分组加密的模式,第三段是指最后一个分组的填充方式。


Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");

补充一点,虽然DES的有效密钥长度是56位,但要求密钥长度是64位(8字节)。3DES则要求24字节。

用密匙初始化Cipher对象,获取数据并加密,正式执行加密操作。Cipher类为加密和解密提供密码功能,它需要通过getInstance()工厂方法来实例化对象,之前已经将对象实例化完成此时只需要获取数据并加密。


cipher.init(Cipher.ENCRYPT_MODE, securekey, iv);  return cipher.doFinal(data);

如果系统出现错误通过e.printStackTrace()命令行打印异常信息在程序中出错的位置及原因

这就是DES加密部分的算法概要。

加密代码


  public static byte[] encrypt(byte[] data, String sKey) {         try {             byte[] key = sKey.getBytes();             // 初始化向量             IvParameterSpec iv = new IvParameterSpec(key);             DESKeySpec desKey = new DESKeySpec(key);             // 创建一个密匙工厂,然后用它把DESKeySpec转换成securekey             SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");             SecretKey securekey = keyFactory.generateSecret(desKey);             // Cipher对象实际完成加密操作             Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");             // 用密匙初始化Cipher对象             cipher.init(Cipher.ENCRYPT_MODE, securekey, iv);             // 现在,获取数据并加密             // 正式执行加密操作             return cipher.doFinal(data);         } catch (Throwable e) {             e.printStackTrace();         }         return null;     }

解密与加密在结构上大体相同便不再做过多赘述。

解密代码:


 public static byte[] decrypt(byte[] src, String sKey) throws Exception {         byte[] key = sKey.getBytes();         // 初始化向量         IvParameterSpec iv = new IvParameterSpec(key);         // 创建一个DESKeySpec对象         DESKeySpec desKey = new DESKeySpec(key);         // 创建一个密匙工厂         SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");         // 将DESKeySpec对象转换成SecretKey对象         SecretKey securekey = keyFactory.generateSecret(desKey);         // Cipher对象实际完成解密操作         Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");         // 用密匙初始化Cipher对象         cipher.init(Cipher.DECRYPT_MODE, securekey, iv);         // 真正开始解密操作         return cipher.doFinal(src);     }

在DES加解密过程当中需要进行十六轮迭代置换操作,初始置换过程前需要将二进制转换成16进制

关键代码解析:

首先StringBuffer sb = new StringBuffer();初始化一个新的StringBuffer对象

之后通过for循环进行转换

String hex = Integer.toHexString(buf[i] & 0xFF);这里b[ i ] & 0xFF将一个byte和 0xFF进行了与运算,然后使用Integer.toHexString取得了十六进制字符串

补充:如果直接 Integer.toHexString(b[ i ]);,将byte强转为int可以吗?

答案是不行

因为

1.byte的大小为8bits而int的大小为32bits

2.java的二进制采用的是补码形式

转换代码:


  public static String parseByte2HexStr(byte buf[]) {         StringBuffer sb = new StringBuffer();         for (int i = 0; i < buf.length; i++) {             String hex = Integer.toHexString(buf[i] & 0xFF);             if (hex.length() == 1) {                 hex = '0' + hex;             }             sb.append(hex.toUpperCase());         }         return sb.toString();     }

将十六进制转换成二进制:

关键代码解析:


int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);            int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);

result[i] = (byte) (high * 16 + low);

很常见的转二进制代码

转换代码:


public static byte[] parseHexStr2Byte(String hexStr) {         if (hexStr.length() < 1) return null;         byte[] result = new byte[hexStr.length() / 2];         for (int i = 0; i < hexStr.length() / 2; i++) {             int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);             int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);             result[i] = (byte) (high * 16 + low);         }         return result;     } }

总代码链接:

DEStest.java

Destest是用来测试Des加密算法的程序。

通过将待加密内容加解密来进行测试

代码:


import java.nio.charset.Charset; public class Destest {     private static final String  SKEY    = "abcdefgh";     private static final Charset CHARSET = Charset.forName("gb2312");     public static void main(String[] args) {         // 待加密内容         String str = "nihao";         String encryptResult = DesUtil.encrypt(str, CHARSET, SKEY);         System.out.println(encryptResult);         // 直接将如上内容解密         String decryResult = "";         try {             decryResult = DesUtil.decrypt(encryptResult, CHARSET, SKEY);         } catch (Exception e1) {             e1.printStackTrace();         }         System.out.println(decryResult);     } }

娄老师在他的博客之中引用过林语堂先生在《 深入浅出MFC 2e(电子版)》的一句话

只用一样东西,不明白它的道理,实在不高明

本次我们团队项目的题目是客户端-服务器安全信息传递系统在这之中我们的基本要求中需要对所有通信内容用分组密码进行加密。在之前密码学的课上袁甄老师给我们讲了关于DES算法的计算原理,但是却没有正真在代码上实现它,这次项目让我们在实践中学习了密码学的加密算法。

团队冲刺DAY4的更多相关文章

  1. Alpha冲刺Day4

    Alpha冲刺Day4 一:站立式会议 今日安排: 我们把项目大体分为四个模块:数据管理员.企业人员.第三方机构.政府人员.完成了数据库管理员模块.因企业人员与第三方人员模块存在大量的一致性,故我们团 ...

  2. Alpha冲刺——day4

    Alpha冲刺--day4 作业链接 Alpha冲刺随笔集 github地址 团队成员 031602636 许舒玲(队长) 031602237 吴杰婷 031602220 雷博浩 031602634 ...

  3. Beta冲刺——day4

    Beta冲刺--day4 作业链接 Beta冲刺随笔集 github地址 团队成员 031602636 许舒玲(队长) 031602237 吴杰婷 031602220 雷博浩 031602134 王龙 ...

  4. 团队冲刺DAY1

    团队冲刺DAY1 今天的内容是对未来6天的突击有一个大致的规划. 我们小组的选题是客户端-服务器安全信息传递系统,通过讨论,我们认为大概有四个难题. 第一个是服务器和客户端,我们打算用第二天来完成. ...

  5. 【团队冲刺总结】一个编码人员的反(tu)思(cao)

    消失了半个多月了啊,算算时间,好像确实有近个把月没有好好的写博客来了.我一直很想写博客的,之前有老师问过写博客的动力是什么.我想了想,我觉得可能是我比较喜欢看书吧,不管是专业书还是小说(好吧,我承认, ...

  6. 团队冲刺the second day

    今天是我们的团队冲刺的第二天,由于我的电脑出现了一点问题,系统还原了,我有重新配置了一下环境变量和一些eclipse的问题,导致时间浪费了很多,但是我还是做了一些简单的任务,例如编写节日的页面的布局, ...

  7. 团队作业八——第二次团队冲刺(Beta版本)第7天&项目汇总

    项目汇总 第一天:http://www.cnblogs.com/newteam6/p/6879383.html 第二天:http://www.cnblogs.com/newteam6/p/688078 ...

  8. 团队作业八——第二次团队冲刺(Beta版本)第6天

    团队作业八--第二次团队冲刺(Beta版本)第6天 一.每个人的工作 (1) 昨天已完成的工作 简单模式逻辑代码涉及与相关功能的具体实现 (2) 今天计划完成的工作 修改完善注册登录内容界面,编辑错题 ...

  9. 团队作业八——第二次团队冲刺(Beta版本)第5天

    团队作业八--第二次团队冲刺(Beta版本)第5天 一.每个人的工作 (1) 昨天已完成的工作 完成界面跳转界面. (2) 今天计划完成的工作 简单模式逻辑代码涉及与相关功能的具体实现 (3) 工作中 ...

随机推荐

  1. python中nonlocal 的作用域

    ''' nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量. ''' def work(): x = 0 def new_work(): nonlocal x x=x+3 retur ...

  2. 【原】git命令行查看全部分支与远程分支不同步问题

    git branch -a 查看全部分支 git fetch 重新拉一下分支

  3. VSphere随笔 - vCenter6.5安装配置手册

    一.前期准备: 1.物理机准备 一台已安装了ESXI虚拟化系统的机器: 2.DNS服务器准备 新建一台DNS服务器,添加vcenter的双向解析. (1)安装一台win2008的机器 (2)开启DNS ...

  4. AtCoder ABC 140E Second Sum

    题目链接:https://atcoder.jp/contests/abc140/tasks/abc140_e 题目大意 给定一个 1~N 的排列 P. 定义$X_{L, R}$的值为$P_L, P_{ ...

  5. Mycat+Pxc的配置

    1 schema.xml配置文件 Balance属性 负载均称类型 0:不开启读写分离机制,所有读操作都发送到当前可用的writeHost上 1:全部的readHost与stand by writeH ...

  6. Apache Shiro 集成Spring(二)

    1.依赖: <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-cor ...

  7. 50-python基础-python3-列表-函数sorted() 对列表进行临时排序

    sorted()函数对列表进行临时排序,返回排序后的列表: 区别列表方法sort()原地修改,无返回值. 1-要保留列表元素原来的排列顺序,同时以特定的顺序呈现它们,可使用函数sorted() . 2 ...

  8. redis缓存架构-02-两种持久化机制(RDB和AOF)

    1.两种持久化机制的介绍 1.1 RDB 周期性的生成redis内存数据的一份完整的快照 1)根据配置的检查点,生产rdb快照文件,fork一个子线程,将数据dump到rdb快照文件中,完成rdb文件 ...

  9. Python之随机选择 random

    随机选择:random import random # 从一个序列中随机的抽取一个元素 values=[1,2,3,4,56] # 指定取出N个不同元素 print(random.sample(val ...

  10. 八、hibernate的查询(HQL)

    HQL:Hibernate Query Language 提供更加丰富灵活.更为强大的查询能力 HQL更接近SQL语句查询语法 面向对象的查询 "from Children where ci ...