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. Cent OS (二)常用的命令介绍

    1. 常用的Linux命令   序号 命令 对应英文 作用 01 ls list 查看当前文件夹下的内容 02 pwd print work directory 查看当前所在的文件夹 03 cd [目 ...

  2. IDEA默认快捷键

    idea常用快捷键大全   Idea常用快捷键大全,拿小本本记下来,忘记了可以方便查找.编写代码Ctrl+Shift + Enter,语句完成“!”,否定完成,输入表达式时按 “!”键Ctrl+E,最 ...

  3. xml解析用正则解决没有标签的文本的解析不出异常

    如  <q>sasas<w>eqwe</w>ddas</q> package com.people.xmlToSql; import java.io.F ...

  4. 记录MNIST采用卷积方式实现与理解

    从时间上来说,这篇文章写的完了,因为这个实验早就做完了:但从能力上来说,这篇文章出现的早了,因为很多地方我都还没有理解.如果不现在写,不知道什么时候会有时间是其一,另外一个原因是怕自己过段时间忘记. ...

  5. Yahoo34条军规——雅虎WEB前端网站优化

    雅虎给出了优化网站加载速度的34条法则(包括Yslow规则22条) 详细说明,下载转发 ponytail 的译文(来自帕兰映像). 1.Minimize HTTP Requests 减少HTTP请求 ...

  6. C语言博客作业12

    一.我学到的内容 二.我的收获 * https://www.cnblogs.com/asd123456/ * 我的收获:通过这一个学期的学习,我一共完成了11次作业,由最开始的第一次作业https:/ ...

  7. C语言|博客作业4

    一.本周教学内容:用C语言编写程序-循环结构 2.4 输出华氏-摄氏温度转换表.要求学生掌握使用for循环语句实现指定次数的循环程序设计. 二.本周作业头 问题 答案 这个作业属于哪个内容 C语言程序 ...

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

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

  9. 安装vue开发环境→安装淘宝镜像的时候报错

    问题: npm WARN deprecated socks@1.1.10: If using 2.x branch, please upgrade to at least 2.1.6 to avoid ...

  10. 在controller的action内, 得到用户发过来的请求地址和参数url

    class PController extends Controller{ public function Log() { echo $_SERVER["HTTP_HOST"] . ...