当前位置: 首页 > 编程日记 > 正文

Java和.NET使用DES对称加密的区别

Java和.NET的系统类库里都有封装DES对称加密的实现方式,但是对外暴露的接口却各不相同,甚至有时会让自己难以解决其中的问题,比如Java加密后的结果在.NET中解密不出来等,由于最近项目有跨Java和.NET的加解密,经过我的分析调试,终于让它们可以互相加密解密了。

  DES加密

DES是一种对称加密(Data Encryption Standard)算法,以前我写过一篇文章:.NET中加密解密相关知识,有过简单描述。

DES算法一般有两个关键点,第一个是加密算法,第二个是数据补位。

加密算法常见的有ECB模式和CBC模式:

ECB模式:电子密本方式,这是JAVA封装的DES算法的默认模式,就是将数据按照8个字节一段进行DES加密或解密得到一段8个字节的密文或者明文,最后一段不足8个字节,则补足8个字节(注意:这里就涉及到数据补位了)进行计算,之后按照顺序将计算所得的数据连在一起即可,各段数据之间互不影响。

CBC模式:密文分组链接方式,这是.NET封装的DES算法的默认模式,它比较麻烦,加密步骤如下:

1、首先将数据按照8个字节一组进行分组得到D1D2......Dn(若数据不是8的整数倍,就涉及到数据补位了)

2、第一组数据D1与向量I异或后的结果进行DES加密得到第一组密文C1(注意:这里有向量I的说法,ECB模式下没有使用向量I)

3、第二组数据D2与第一组的加密结果C1异或以后的结果进行DES加密,得到第二组密文C2

4、之后的数据以此类推,得到Cn

5、按顺序连为C1C2C3......Cn即为加密结果。

数据补位一般有NoPadding和PKCS7Padding(JAVA中是PKCS5Padding)填充方式,PKCS7Padding和PKCS5Padding实际只是协议不一样,根据相关资料说明:PKCS5Padding明确定义了加密块是8字节,PKCS7Padding加密快可以是1-255之间。但是封装的DES算法默认都是8字节,所以可以认为他们一样。数据补位实际是在数据不满8字节的倍数,才补充到8字节的倍数的填充过程。

NoPadding填充方式:算法本身不填充,比如.NET的padding提供了有None,Zeros方式,分别为不填充和填充0的方式。

PKCS7Padding(PKCS5Padding)填充方式:为.NET和JAVA的默认填充方式,对加密数据字节长度对8取余为r,如r大于0,则补8-r个字节,字节为8-r的值;如果r等于0,则补8个字节8。比如:

加密字符串为为AAA,则补位为AAA55555;加密字符串为BBBBBB,则补位为BBBBBB22;加密字符串为CCCCCCCC,则补位为CCCCCCCC88888888。

  .NET中的DES加密

对于.NET,框架在System.Security.Cryptography命名空间下提供了DESCryptoServiceProvider作为System.Security.Cryptography.DES加密解密的包装接口,它提供了如下的4个方法:

  1. public override ICryptoTransform CreateDecryptor(byte[] rgbKey, byte[] rgbIV)
  2. public override ICryptoTransform CreateEncryptor(byte[] rgbKey, byte[] rgbIV)
  3. public override void GenerateIV()
  4. public override void GenerateKey()

从.NET类库封装情况,加解密需要传入一个Key和IV向量。而且Key必须为8字节的数据,否则会直接抛异常出来,当使用ECB模式下,不管传入什么IV向量,加密结果都一样。示例代码如下:

  1. public static string EncryptWithJava(string key, string str)
  2. {
  3. if (key.Length < 8 || string.IsNullOrEmpty(str))
  4. {
  5. throw new Exception("加密key小于8或者加密字符串为空!");
  6. }
  7. byte[] bKey = Encoding.UTF8.GetBytes(key.Substring(0, 8));
  8. byte[] bIV = IV;
  9. byte[] bStr = Encoding.UTF8.GetBytes(str);
  10. try
  11. {
  12. DESCryptoServiceProvider desc = new DESCryptoServiceProvider();
  13. desc.Padding = PaddingMode.PKCS7;//补位
  14. desc.Mode = CipherMode.ECB;//CipherMode.CBC
  15. using (MemoryStream mStream = new MemoryStream())
  16. {
  17. using (CryptoStream cStream = new CryptoStream(mStream, desc.CreateEncryptor(bKey, bIV), CryptoStreamMode.Write))
  18. {
  19. cStream.Write(bStr, 0, bStr.Length);
  20. cStream.FlushFinalBlock();
  21. StringBuilder ret = new StringBuilder();
  22. byte[] res = mStream.ToArray();
  23. foreach (byte b in res)
  24. {
  25. ret.AppendFormat("{0:x2}", b);
  26. }
  27. return ret.ToString();
  28. }
  29. }
  30. }
  31. catch
  32. {
  33. return string.Empty;
  34. }
  35. }





由于为ECB模式,因此IV这里设置什么值都是可以的,当为CBC模式下,则需要设置为其他值,比如:public static byte[] IV = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 },才能正常加密解密。

JAVA中的DES加密

JAVA的javax.crypto.Cipher包下,提供了加密解密的功能,它的静态getInstance方法,可以返回一个Cipher对象,一般有public static final Cipher getInstance(String transformation)方法,transformation为:algorithm/mode/padding,分别表示算法名称,比如DES,也可以在后面包含算法模式和填充方式,但也可以只是算法名称,如为:"DES/CBC/PKCS5Padding","DES"等。JAVA中默认的算法为ECB,默认填充方式为PKCS5Padding。Cipher的Init方法用来初始化加密对象,常见的有:

  1. public final void init(int opmode, Key key, AlgorithmParameterSpec params)
  2. public final void init(int opmode,Key key, SecureRandom random)

用SecureRandom时,一般用于不需要IV的算法模式,示例代码如下:

  1. public static String encrypt2(String src) throws Exception {
  2. SecureRandom sr = new SecureRandom();
  3. DESKeySpec ks = new DESKeySpec(KEY.getBytes("UTF-8"));
  4. SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
  5. SecretKey sk = skf.generateSecret(ks);
  6. Cipher cip = Cipher.getInstance("DES/CBC/PKCS5Padding");//Cipher.getInstance("DES");
  7. IvParameterSpec iv2 = new IvParameterSpec(IV);
  8. cip.init(Cipher.ENCRYPT_MODE, sk, iv2);//IV的方式
  9. //cip.init(Cipher.ENCRYPT_MODE, sk, sr);//没有传递IV
  10. String dest = byteToHex(cip.doFinal(src.getBytes("UTF-8")));
  11. return dest;
  12. }

当默认用DES,JAVA会用ECB模式,因此这里IV向量没有作用,这里,但当用CBC模式下,如果还是用SecureRandom,则每次加密的结果都会不一样,因为JAVA内部会用随机的IV来初始化Cipher对象,如示例代码,由于Cipher.getInstance("DES/CBC/PKCS5Padding")使用了CBC,因此我这里用的javax.crypto.spec.IvParameterSpec包下的IvParameterSpec来初始化向量IV:

Private final static byte[] IV = new byte[] {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};

  总结

对于.NET和JAVA在使用DES对称加密时,需要大家指定一样的算法和填充模式,并且JAVA在写DES加解密算法时,还需要根据创建Cipher对象的不同,正确使用IV向量。在不同系统需要互相数据时,必须要明确的是加密算法,Key和算法模式,再根据不同模式是否需要IV向量,最后是填充模式。

本文是经过自己翻阅资料和反复调试代码而出来的,如有问题,请指正。

转载自 :http://www.blogjava.net/qileilove/archive/2012/05/23/378898.html

转载于:https://www.cnblogs.com/LinQianXun/p/5016991.html

相关文章:

web.config配置

在config中配置自己项目中的用户控件&#xff1a; <pages> <controls> <add tagPrefix"fish" tagName"MainMenu" src"~/Controls/MainMenu.ascx" /> <add tagPrefix"fish" tagName"PageHeader" src&qu…

字符串最易犯的错误 总是和 那个\0 有关

下面程序有一处错误导致 多错误&#xff1a; View Code 1 #include <stdio.h>2 #include <string.h>3 #include <stdlib.h>4 #include <assert.h>5 typedef struct{6 int l, c; // lines, cols7 } pos_t;8 9 typedef struct {10 char *str;1…

12月3号条件控制语句和循环语句

if条件语句 非零即真 0即假 if&#xff08;表达式&#xff09;{ //成立之后要处理的事情 } 以atm小程序为例 //判断用户选择的操作 if &#xff08;operation 1&#xff09;{ //输入密码 printf("输入密码\n"); } if (operation 2){ //取款 printf("取款\n…

获取交换机OID值

附&#xff1a;之前的文章直接给出交换机cpu和内存的OID&#xff0c;下面我叙述下怎么具体去获得OID。下面以H3C内存及cpu部分OID值&#xff1a;&#xff08;可打400电话询问部分值&#xff09;400电话告诉我以下&#xff08;当然万能的网友也行了&#xff09;&#xff0c;缺少…

矩阵变化和坐标

原文地址&#xff1a;http://www.cnblogs.com/winter-cn/archive/2010/12/29/1919266.htmlhttp://www.useragentman.com/blog/2011/01/07/css3-matrix-transform-for-the-mathematically-challenged/在开始之前&#xff0c;首先来复习下一个简单的线性代数知识&#xff1a;矩阵…

Eclipse+SVN搭建开发环境

目前我们开发环境为&#xff1a;windows service 2008 r2 x64 现在开始记录一下eclipseSVN环境搭建过程&#xff1a; 1&#xff0c;&#xff09;下载 VisualSVN-Server-3.4.2-x64:https://www.visualsvn.com/server/download/ 2,)下载与安装&#xff1a;tortoisesvnhttp://tort…

牛客网练习赛44-B(快速幂+模拟)

题目链接&#xff1a;https://ac.nowcoder.com/acm/contest/548/B 题意&#xff1a;计算m/n小数点后k1位到k2位&#xff0c;1≤m≤n≤109&#xff0c;1<k1<k2<109,0<k2-k1<105,T<20。 思路&#xff1a;计算小数可以模拟除法一位一位地算&#xff0c;但需要把…

古剑奇谭网络版服务器位置,《古剑奇谭网络版》服务器数据互通调研公告

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼各位仙家弟子&#xff1a;为了给大家提供更好的游戏环境、形成更加稳定的游戏生态&#xff0c;小龙人计划在春节前&#xff0c;在充分参考服务器具体情况、充分尊重大家意愿的基础上&#xff0c;对部分服务器开启数据互通&#xff…

git克隆 不带目录_Git 系统学习笔记

公众号内发送Git获取Git官方PDF教程版本控制 版本控制是一种记录一个或若干个文件内容变化、以便将来查阅特定版本修订情况的系统。本地版本控制系统很久以前就开发了许多本地版本控制系统、大多都是采用某种简单的数据库来记录文件的历次更新差异。其中最流行的一种叫做 RCS、…

Android库so文件及skia函数的调用

为了实现android的二次开发&#xff0c;希望通过编制动态链接库&#xff08;.so&#xff09;的方式实现android native C程序的调用。更为实际的情况则是&#xff1a;编制新库&#xff08;new.so&#xff09;调用android的老库&#xff08;如libskia.so libskiagl.so&#xff0…

关于参数类型的转换问题

有时候遇见方法之间的参数会有冲突&#xff0c;这个时候又不想修改方法的时候&#xff0c;可以考虑一些类型转换的一些技巧&#xff0c;如.toString( ) .toDate( ) .parseInt( ) .valueOf( )等等 转载于:https://www.cnblogs.com/2027437606qq/p/5018710.html

c++框架有哪些_Java Mybatis框架入门教程_v20200726

MyBatis 的前身是 Apache 的开源项目 iBatis。MyBatis 几乎可以代替 JDBC&#xff0c;是一个支持普通 SQL 查询&#xff0c;存储过程和高级映射的基于 Java 的优秀持久层框架。MyBatis 与 JDBC 相比&#xff0c;减少了 50% 以上的代码量。并且满足高并发和高响应的要求&#xf…

logstash写入到kafka和从kafka读取日志

收集nginx日志放到kafka 修改nginx日志格式&#xff1a;[nginx日志格式修改](https://blog.51cto.com/9025736/2373483) input {file {type > "nginx-access"path > "/data/wwwlogs/access_nginx.log"start_position > "beginning"code…

Linux cp命令如何拷贝整个目录下所有文件

复制不包含隐藏文件&#xff1a; cp -R /home/usera/* /mnt/temp 复制包含隐藏文件 &#xff1a; cp -R /home/usera/. /mnt/temp 转载于:https://www.cnblogs.com/appinn/p/5019533.html

Windows Phone开发(7):当好总舵主 转:http://blog.csdn.net/tcjiaan/article/details/7281421...

吹完了页面有关的话题&#xff0c;今天我们来聊一下页面之间是如何导航的&#xff0c;在更多情况下&#xff0c;我们的应用程序不会只有一个页面的&#xff0c;应该会有N个&#xff0c;就像我们做桌面应 用开发那样&#xff0c;我们一个应用程序中可能不止一个窗体&#xff08;…

POJ 1966 Cable TV Network【无向图点连通度 最小割 E-K算法求最大流】

题目描述&#xff1a; 给你一个无向图&#xff0c;问你最少删掉几个点&#xff0c;使这个图成不连通。 解题报告&#xff1a; 概念 (1)一个具有 N 个顶点的图&#xff0c;在去掉任意 k-1 个顶点后 (1<K<N) 所得的子图仍连通&#xff0c; 而去掉 K 个顶点后的图不连通则称…

C++ STL:stack和queue

http://blog.csdn.net/wallwind/article/details/6858634 http://blog.csdn.net/chao_xun/article/details/8037420 http://blog.163.com/jackie_howe/blog/static/19949134720111144714342/ 1、stackstack 模板类的定义在<stack>头文件中。stack 模板类需要两个模板参数…

Day03 - Ruby比一比:Module的include与extend

前情提要在第一天里&#xff0c;我们很激昂地用Ruby的类别、物件、方法&#xff0c;写了开赛宣言&#xff01;在第二天里&#xff0c;我们比较了方法与模块&#xff0c;比的过程中&#xff0c;发现模块多了包含&#xff08;inclusion&#xff09;与延伸&#xff08;extension&a…

5 zabbix 添加host_运维监控实战篇,zabbix自动发现和自动注册图文详解

一、介绍自动发现Zabbix自动发现就是为了解决批量监控而设计的功能之一&#xff0c;什么是自动发现呢&#xff0c;简单来说就是Zabbix Server端可以基于设定的规则&#xff0c;自动批量的去发现局域网若干服务器&#xff0c;并自动把服务器添加至Zabbix监控平台&#xff0c;省去…

PHP面向对象编程(imooc)代码合集(四)

class10 多态 多态简单说就是用不同的类去实现同一个接口的方法&#xff0c;以实现不同类自己的方法 <?php date_default_timezone_set("PRC"); /*** 多态* 1. 只要某个对象实现了接口&#xff08;instanceof&#xff09;&#xff0c;就可以直接在对象上调用接口…

云解析DNS产品优势与应用场景

什么是阿里云解析&#xff1a;阿里云解析是面向全网域名开放的域名智能解析服务。阿里云解析做为云计算服务的入口&#xff0c;将逐步与阿里云已有云产品融合打通&#xff0c;成为云产品大家庭中不可或缺的一份子。ECS、RDS、CDN、SLB 等产品为用户提供高效可靠的计算、存储、网…

字节跳动 录屏功能_一周盘点:Instagram打通视频购物功能 公开叫板TikTok;字节跳动要大力布局跨境出口电商?...

周末刚结束&#xff0c;预祝各位小伙伴们在接下来的每一天都能大卖&#xff01;大师兄先带你盘点这一周都有哪一些跨境电商热点事件&#xff1a;每周要点Instagram打通视频购物功能 公开叫板TikTok据外媒报道&#xff0c;Instagram于美国当地时间12月10日宣布&#xff0c;将把应…

postgresql scws zhparser安装

2019独角兽企业重金招聘Python工程师标准>>> 基于postgresql9.6 scws 1.23 postgresql9.6安装参看本博客相关教程 zhparser安装 1、export PATH"$PATH:/usr/pgsql-9.6/bin" 2、SCWS_HOME/usr/local make && make install 转载于:https://my.oschi…

Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法

原文地址:http://www.cnblogs.com/hoojo/p/Spring_Hibernate_MyBatis_MultipleDataSource_switchDataSource.html#2836713 转载于:https://www.cnblogs.com/longshiyVip/p/5024040.html

graphpad做折线图后怎么保存_农村的干豆角怎么做的?农村妹子教你两个窍门,保存2年都不会坏...

农村经常制作的干豆角怎么做的&#xff1f;农村妹子教你两个窍门&#xff0c;保存到冬天炖肉吃夏季&#xff0c;这个时节正是豆角生长最旺盛的时候&#xff0c;在农村&#xff0c;只要种一小块地的豆角&#xff0c;都是吃不完的&#xff0c;如果不摘下来&#xff0c;就只能看着…

PCL—低层次视觉—点云分割(基于凹凸性)

1.图像分割的两条思路 场景分割时机器视觉中的重要任务&#xff0c;尤其对家庭机器人而言&#xff0c;优秀的场景分割算法是实现复杂功能的基础。但是大家搞了几十年也还没搞定——不是我说的&#xff0c;是接下来要介绍的这篇论文说的。图像分割的搞法大概有两种&#xff1a;剑…

wireshark-wincap安装问题

winpcap关键模块 32位系统&#xff1a; C:\Windows\system32\wpcap.dll C:\Windows\system32\Packet.dll C:\Windows\system32\WanPacket.dll C:\Windows\system32\pthreadVC.dll C:\Windows\system32\drivers\npf.sys 64位系统&#xff1a; C:\Windows\SysWOW64\wpcap.dll C:\…

liunx学习笔记(一:常用命令)

linux:在学习linux之前我们应该多少了解windows的一些相关操作&#xff0c;linux也就是类似windows的另一种操作系统&#xff0c;用来管理软硬件的一种应用。在windows下你可以通过鼠标点击相关的图标进行对应的操作&#xff0c;而在Linux中却是需要使用者输入一行行的命令&…

aspose.cells 无法读取公式值_隐藏 Excel表格、公式的9种方法

Excel&#xff0c;站在你面前&#xff0c;你却看不见.....1、给Excel文件穿上隐身衣在win10系统中&#xff0c;隐藏文件变得如此容易&#xff0c;选取文件点“隐藏所选项目”&#xff0c;再去掉“隐藏的项目”勾选 "&#xff08;想彻底隐藏需要修改注册表&#xff0c;新手…

12-09关于几种排序方式

一.选择排序 #include <stdio.h> //选择排序 //记录最小的那个数的索引值 //下面这个循环就是去寻找最小的那个数的index //有比k对应的值更小的 //判断是否需要交换 //k和i对应的值交换 void selectsort(int array[],int counttimes){ int k 0; for (int i 0; i < …