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. cortable 使用方法

    星期一到星期六,早上六点到晚上六点.每隔两个小时 执行语句 0 6-18/2  * * 1-6 commond

  2. nginx 虚拟主机+反向代理+负载均衡

    nginx是一款免费.开源的http服务器,它是由俄罗斯程序设计师开发的,官方测试,nginx能支撑5万的并发量,主要功能有虚拟主机.反向代理和负载均衡等. nginx配置 # 全局块 ... # e ...

  3. laravel 简单应用 redis

    1.连接配置 database.php 中 测试用 都没做修改 2.创建测试路由及控制器 //添加路由 Route::get('testRedis','RedisController@testRedi ...

  4. Python笔记(五)_内置函数BIF

    查看所有的内置函数:dir(__builtins__) abs()   获取绝对值 max()   返回给定元素中的最大值 min()   返回给定元素中的最小值 sum()   求和 reverse ...

  5. Java +selenium Navigation接口介绍

    Navigation接口主要实现对浏览器的前进.后退.打开网址.刷新当前页面等操作的. void back():就是操作当前页面后退,相当于网页的后退按钮. void forward():就是操作当前 ...

  6. ubuntu snap 包管理器

    基本使用 snap find $package snap install $package [--channel=beta] snap list snap refresh $package [--ch ...

  7. Cocos2d-x之定时器

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. 每一个游戏程序都有一个循环在不断运行,它是由导演对象来管理与维护.如果需要场景中的精灵运动起来,可以在游戏循环中使用定时器对精灵等对象进行 ...

  8. Oracle 11g Compound Trigger

    Original Link In Oracle 11g, the concept of compound trigger was introduced. A compound trigger is a ...

  9. Apache Shiro 认证+授权(一)

    1.核心依赖 <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-co ...

  10. BZOJ 2122 [分块+单调栈+二分](有详解)

    题面 传送门 给定序列d和lim.假设有一个初始价值\(x_0\),则经历第i天后价值变为\(min(x_0+d[i],lim[i])\),记\(f(i,j,x_0)\)表示以初始代价x0依次经过第i ...