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中模块介绍

    一,模块概念 在计算机程序开发的过程当中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护.为了编码更加容易维护,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码 ...

  2. Linux 下 VIM 的操作

    其实VI 和vim本质上没有多大区别,,但是VIM 可以高亮关键字,使得更受青睐 vim里面有3种模式:命令模式,编辑模式,末行模式 1. vim--->:set number VIM 打开文档 ...

  3. 专家揭秘:STM32启动过程全解

    电子发烧友网核心提示:本文主要阐述了STM32启动过程全面解析,包括启动过程的介绍.启动代码的陈列以及深入解析. 相对于ARM上一代的主流ARM7/ARM9内核架构,新一代Cortex内核架构的启动方 ...

  4. HttpServletRequest 对文件上传的支持

    此前,对于处理上传文件的操作一直是让开发者头疼的问题,因为 Servlet 本身没有对此提供直接的支持,需要使用第三方框架来实现,而且使用起来也不够简单.Servlet 3.0 已经提供了这个功能,而 ...

  5. 更新python的依赖包,亲测!

    输入pip install --upgrade pandas 无需卸载,让它自己更新就好 pandas可以改成别的包

  6. 嵌入式C语言4.1 C语言内存空间的使用-指针

    指针:就是内存资源的地址.门牌号的代名词 假如你所在的城市是一个内存(存储器),如果找到你家,就是通过你的家庭住址(指针)寻找,而你家里的摆设面积之类的就是内存的内容(指针指向的内容). 指针变量:存 ...

  7. 转 LoadRunner错误处理函数

    在脚本的Run-time Settings中,可以设置在脚本运行过程中发生错误的处理方式.进入到Run-time Settings中,切换到Miscellaneous标签页,可以看到Error Han ...

  8. Spring IOC DI AOP 的简单理解及应用

    Spring两大特性:IOC 和AOP.IOC 控制反转,AOP 面向切面编程 spring 核心容器的主要组件时Bean工厂(BeanFactory) ,Bean 工厂使用控制反转模式来降低程序代码 ...

  9. C++中的静态成员函数

    1,问完成的需求: 1,统计在程序运行期间某个类的对象数目: 1,静态成员变量满足了这个需求: 2,保证程序的安全性(不能使用全局变量): 3,随时可以获取当前对象的数目: 1,有没有什么特别的地方或 ...

  10. [fw]Linux 的 time 指令

    Linux 的 time 指令   Linux 有個很有意思的 time 指令,可以用來查看另一個指令的執行時間,例如執行 time helloworld 會顯示 helloworld 這支程式的執行 ...