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个方法:
|
从.NET类库封装情况,加解密需要传入一个Key和IV向量。而且Key必须为8字节的数据,否则会直接抛异常出来,当使用ECB模式下,不管传入什么IV向量,加密结果都一样。示例代码如下:
|
由于为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方法用来初始化加密对象,常见的有:
|
用SecureRandom时,一般用于不需要IV的算法模式,示例代码如下:
|
当默认用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
Java和.NET使用DES对称加密的区别相关推荐
- 古典密码学、DES对称加密、3DES对称加密知识总结和实验
实验三.古典密码学.DES对称加密.3DES对称加密 一.古典密码学:当铺密码.培根密码.摩斯密码.键盘密码.与佛论禅 1.当铺密码: 解密"由人俱一口中"和"大中口由人 ...
- java des对称加密_JAVA加密解密DES对称加密算法
1 下面用DES对称加密算法(设定一个密钥,然后对所有的数据进行加密)来简单举个例子.2 3 首先,生成一个密钥KEY.4 我把它保存到key.txt中.这个文件就象是一把钥匙.谁拥有它,谁就能解开我 ...
- pyDes 实现 Python 版的 DES 对称加密/解密--转
https://my.oschina.net/leejun2005/blog/586451 手头有个 Java 版的 DES 加密/解密程序,最近想着将其 Python 重构下,方便后续脚本解析,捣鼓 ...
- .NET中的DES对称加密
DES是一种对称加密(Data Encryption Standard)算法,于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法.一般密码长度为8个字节,其中56位加密密钥, ...
- DES对称加密(1)算法说明
DES数据加密标准(Data Encryption Standard) 又称作DEA(Data Encryption Algorithm) , 它由霍斯特·费斯妥Horst Feistel设计,又名 ...
- 密码学课程设计之DES对称加密
前言 最近在进行密码学课程设计, 感觉拿python进行设计会显得比较简洁易懂,本人python比较渣渣,所以就拿出来练一练.用零零碎碎的时间写了五六天才把主干部分写完,真是菜哭我自己了.在此还需要感 ...
- 非对称加密和对称加密的区别
一 :概述 在现代密码学诞生以前,就已经有很多的加密方法了.例如,最古老的斯巴达加密棒,广泛应用于公元前7世纪的古希腊.16世纪意大利数学家卡尔达诺发明的栅格密码,基于单表代换的凯撒密码.猪圈密码,基 ...
- 细数非对称加密与对称加密的区别
2019独角兽企业重金招聘Python工程师标准>>> 有两种加密方法常常在SSL生态系统中被提及--非对称加密与对称加密. SSL握手期间的非对称加密 当你浏览一个使用SSL证书的 ...
- des加密 ios 和java_三重Des对称加密在Android、Ios 和Java 平台的实现
// // CommonFunc.m // PRJ_base64 // // Created by wangzhipeng on 12-11-29. // Copyright (c) 2012 ...
最新文章
- 文件处理命令:sed
- SpringBoot之前端文件管理
- oracle同步复制清理,Oracle数据库同步——高级复制
- vim 编写python代码_用Vim编写Python代码
- Oracle VM VirtualBox上安装windows server2008R2做SharePointServer2010开发(中)
- [转]UTF-8 GBK UTF8 GB2312 之间的区别和关系
- 使用Jenkins来实现内部的持续集成流程(下)
- 数据分析-书籍整理(一)
- 【jeecg Docker安装】使用 Docker 搭建 Java Web 运行环境
- 2011——我的HelloWorld
- element-ui中table表格表头和表格内容都水平居中
- mysql使用已有的数据库_使用SQL操作MySQL数据库
- WebRtc搭建 coturn
- 和商简智能CEO关于APS的聊后感
- Unix操作系统的原理、优点与缺点
- java sftp 读取文件_Java代码获取SFTP服务器文件
- RK987A键盘说明书(自用)
- 2020.7-8月份暑假培训总结
- nuxt实现服务端渲染查看源代码显示动态接口数据
- Linux 下man 命令的使用
热门文章
- yii2 模型中set_Day184:人脸识别中open-set与close-set
- docker 退出mysql_Docker mysql即时退出
- abaqus高性能服务器怎么用,高性能计算平台ABAQUS任务调度使用说明作者陈林E-Mailchenlin.PDF...
- yolov4源码_YOLOv4特征提取网络——CSPDarkNet结构解析及PyTorch实现
- 使用OpenCV和Imutils构建图像的蒙太奇效果
- PyTorch框架:(4)如何去构建数据
- 力扣(LeetCode)刷题,简单题(第2期)
- 1. 编程规范和编程安全指南--python
- POJ - 3417 Network LCA+树上差分
- OpenCV(项目)车牌识别1 -- 车牌提取(形态学)