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. wsl中加载git之后,发现文件是修改状态

    查看git status,发现所有文件都被修改. git diff文件查看,发现是行尾的问题导致的. https://github.com/Microsoft/WSL/issues/184 在wsl里 ...

  2. idea中git stash--解决pull冲突或切换分支问题

    场景1:pull代码时提示冲突,本地代码和远程代码有冲突 场景2:当切换分支时,当前分支的代码又不想commit 这两种场景可以使用git stash来解决,将当前未commit的代码暂存起来. 操作 ...

  3. MVC和WebApi 使用get和post 传递参数。 转载https://blog.csdn.net/qq373591361/article/details/51508806

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq373591361/article/details/51508806我们总结一下用js请求服务器的 ...

  4. 在线常用库 + API手册

    以下链接经过本人测试,均可正常访问 jQuery: http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js bootsrap: http://app ...

  5. Makefile之自动化变量

    makefile自动化变量在大型项目的Makefile使用的太普遍了,如果你看不懂自动化变量,开源项目的makefile你是看不下去的. 以往总是看到一些项目的makefile,总是要翻gnu的Mak ...

  6. HDU 1028 Ignatius and the Princess III (生成函数/母函数)

    题目链接:HDU 1028 Problem Description "Well, it seems the first problem is too easy. I will let you ...

  7. HDU 5183 Negative and Positive (NP) (手写哈希)

    题目链接:HDU 5183 Problem Description When given an array \((a_0,a_1,a_2,⋯a_{n−1})\) and an integer \(K\ ...

  8. git提交时,仓库是空的,本地有源码。

    应该打开cmd   归到项目路径 然后输入git push -u origin master -f 是把本地的项目强制推送到空的仓库 git init (在当前文件夹下初始化一个git仓库) git ...

  9. 深度学习大规模MIMO中的功率分配

    摘要-本文使用深度学习的方法在大规模MIMO网络的下行链路中执行max-min和max-prod功率分配.更确切地说,与传统的面向优化的方法相比,训练深度神经网络来学习用户设备(UE)的位置和最优功率 ...

  10. IE兼容模式下样式分离错乱,求CSS高手

    IE正常模式下访问正常 兼容模式右边图片切换区域样式错乱,求CSS高手! 详细参考网址:www.javams.com