Java对称加密工作模式原理详解_java

来源:脚本之家  责任编辑:小易  

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加密,得到第二组密文C24、之后的数据以此类推,得到Cn5、按顺序连为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个方法:public override ICryptoTransform CreateDecryptor(byte[]rgbKey,byte[]rgbIV)public override ICryptoTransform CreateEncryptor(byte[]rgbKey,byte[]rgbIV)public override void GenerateIV()public override void GenerateKey()从.NET类库封装情况,加解密需要传入一个Key和IV向量。而且Key必须为8字节的数据,否则会直接抛异常出来,当使用ECB模式下,不管传入什么IV向量,加密结果都一样。示例代码如下:public static string EncryptWithJava(string key,string str){if(key.Length|string.IsNullOrEmpty(str)){throw new Exception("加密key小于8或者加密字符串为空!}byte[]bKey=Encoding.UTF8.GetBytes(key.Substring(0,8));byte[]bIV=IV;byte[]bStr=Encoding.UTF8.GetBytes(str);try{DESCryptoServiceProvider desc=new DESCryptoServiceProvider();desc.Padding=PaddingMode.PKCS7;补位desc.Mode=CipherMode.ECB;CipherMode.CBCusing(MemoryStream mStream=new MemoryStream()){using(CryptoStream cStream=new CryptoStream(mStream,desc.CreateEncryptor(bKey,bIV),CryptoStreamMode.Write)){cStream.Write(bStr,0,bStr.Length);cStream.FlushFinalBlock();StringBuilder ret=new StringBuilder();byte[]res=mStream.ToArray();foreach(byte b in res){ret.AppendFormat("{0:x2}",b);}return ret.ToString();}}}catch{return string.Empty;}}由于为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方法用来初始化加密对象,常见的有:public final void init(int opmode,Key key,AlgorithmParameterSpec params),public final void init(int opmode,Key key,SecureRandom random),用SecureRandom时,一般用于不需要IV的算法模式,示例代码如下:public static String encrypt2(String src)throws Exception {SecureRandom sr=new SecureRandom();DESKeySpec ks=new DESKeySpec(KEY.getBytes("UTF-8"));SecretKeyFactory skf=SecretKeyFactory.getInstance("DES");SecretKey sk=skf.generateSecret(ks);Cipher cip=Cipher.getInstance("DES/CBC/PKCS5Padding");Cipher.getInstance("DES");IvParameterSpec iv2=new IvParameterSpec(IV);cip.init(Cipher.ENCRYPT_MODE,sk,iv2);IV的方式cip.init(Cipher.ENCRYPT_MODE,sk,sr);没有传递IVString dest=byteToHex(cip.doFinal(src.getBytes("UTF-8")));return dest;}当默认用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向量,最后是填充模式。本文是经过自己翻阅资料和反复调试代码而出来的,如有问题,请指正www.zgxue.com防采集请勿采集本网。

这篇文章主要介绍了Java对称加密工作模式原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

对称加密算法用来对敏感数据等信息进行加密,常用的算法包括: DES(Data Encryption Standard):数据加密标准,zhidao速度较快,适内用于加密大量数据的场合。3DES(Triple DES):是基于DES,

对称加密又分为分组加密和序列密码。

你好: 刚刚帮你查了下,所有的帖子,项目例子表示: 目前了解的经典加密(如对称加密DES,AES,非对称加密RSA)虽然可逆,但结果长度都是不定的,除非是 固定长度字符串转固定长度密文

分组密码,也叫块加密(block cyphers),一次加密明文中的一个块。是将明文按一定的位长分组,明文组经过加密运算得到密文组,密文组经过解密运算(加密运算的逆运算),还原成明文组。

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

序列密码,也叫流加密(stream cyphers),一次加密明文中的一个位。是指利用少量的密钥(制乱元素)通过某种复杂的运算(密码算法)产生大量的伪随机位流,用于对明文位流的加密。

apache的commons-codec中各种字符转化,加密都有 例如md5和sha1加密 hex转换,base32,base64转换 附件是jar包

解密是指用同样的密钥和密码算法及与加密相同的伪随机位流,用以还原明文位流。

复杂的对称加密(DES、PBE)、非对称加密算法: DES(Data Encryption Standard,数据加密算法) PBE(Password-based encryption,基于密码验证) RSA(算法的名字以发明者的名字命名:Ron Rivest,AdiShamir

分组加密算法中,有ECB,CBC,CFB,OFB这几种算法模式。

1)ECB(Electronic Code Book)/电码本模式

ECB(电子密本方式)其实非常简单,就是将数据按照8/16节一段进行加密或解密得到一段8/16个字节的密文或者明文,最后一段不足8/16个字节,按照需求补足8/16个字节进行计算,之后按照顺序将计算所得的数据连在一起即可,各段数据之间互不影响。

优点:

1.简单,有利于并行计算,误差不会被传送

缺点:

1.不能隐藏明文的模式

2.可能对明文进行主动攻击

2)CBC(Cipher Block Chaining)/密文分组链接方式

CBC(密文分组链接方式)的实现机制使加密的各段数据之间有了联系。其实现的机理如下:

加密步骤如下:

1)首先将数据按照8/16个字节一组进行分组得到D1D2......Dn(若数据不是8的整数倍,用指定的PADDING数据补位)

2)第一组数据D1与初始化向量I异或后的结果进行加密得到第一组密文C1

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

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

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

解密是加密的逆过程,步骤如下:

1)首先将数据按照8/16个字节一组进行分组得到C1C2C3......Cn

2)将第一组数据进行解密后与初始化向量I进行异或得到第一组明文D1(注意:一定是先解密再异或)

3)将第二组数据C2进行解密后与第一组密文数据进行异或得到第二组数据D2

4)之后依此类推,得到Dn

5)按顺序连为D1D2D3......Dn即为解密结果。

这里注意一点,解密的结果并不一定是我们原来的加密数据,可能还含有你补得位,一定要把补位去掉才是你的原来的数据。

优点:

1. 不容易主动攻击,安全性好于ECB,适合传输长度长的报文,是SSL、IPSec的标准

缺点:

1. 发送方和接收方都需要知道初始化向量 IV

2.加密过程是串行的,无法被并行化(在解密时,从两个邻接的密文块中即可得到一个平文块。因此,解密过程可以被并行化)

3.误差传递

3)Cipher Feedback (CFB)/密文反馈模式

密文反馈(CFB,Cipher feedback)模式类似于CBC,可以将块密码变为自同步的流密码;工作过程亦非常相似,CFB的解密过程几乎就是颠倒的CBC的加密过程:

需要使用一个与块的大小相同的移位寄存器,并用IV将寄存器初始化。然后,将寄存器内容使用块密码加密,然后将结果的最高x位与平文的x进行异或,以产生密文的x位。下一步将生成的x位密文移入寄存器中,并对下面的x位平文重复这一过程。解密过程与加密过程相似,以IV开始,对寄存器加密,将结果的高x与密文异或,产生x位平文,再将密文的下面x位移入寄存器。

与CBC相似,平文的改变会影响接下来所有的密文,因此加密过程不能并行化;而同样的,与CBC类似,解密过程是可以并行化的。

优点:

1.隐藏了明文模式

2.分组密码转化为流模式

3.可以及时加密传送小于分组的数据

缺点:

1.不利于并行计算

2.误差传送:一个明文单元损坏影响多个单元

3.唯一的IV

4)Output Feedback (OFB)/输出反馈模式

输出反馈模式(Output feedback, OFB)可以将块密码变成同步的流密码。它产生密钥流的块,然后将其与平文块进行异或,得到密文。与其它流密码一样,密文中一个位的翻转会使平文中同样位置的位也产生翻转。这种特性使得许多错误校正码,例如奇偶校验位,即使在加密前计算而在加密后进行校验也可以得出正确结果。

每个使用OFB的输出块与其前面所有的输出块相关,因此不能并行化处理。然而,由于平文和密文只在最终的异或过程中使用,因此可以事先对IV进行加密,最后并行的将平文或密文进行并行的异或处理。

可以利用输入全0的CBC模式产生OFB模式的密钥流。这种方法十分实用,因为可以利用快速的CBC硬件实现来加速OFB模式的加密过程。

优点:

1.隐藏了明文模式

2.分组密码转化为流模式

3.可以及时加密传送小于分组的数据

缺点:

1.不利于并行计算

2.对明文的主动攻击是可能的

3.误差传送:一个明文单元损坏影响多个单元

非对称加密和对称加密在加密和解密过程、加密解密速度、传输的安全性上百都有所不同,具体介绍如下:1、加密和解密过程不同对称加密过程和解密过程使用的同一个密钥,加密过程相当于用原文+密钥可以传输出密文,同时解密过程用密文-密钥可以推度导出原文。但非对称加密采用了两个密钥,一般使用公钥进行加密,使用私钥进行解密。2、加密解密速度不同对称加密解密的速度比较快,适合数据知比较长时的使用。非对称加密和解密花费的时间长、速度相对较慢,只适合对少量数据的使用。3、传输的安道全性不同对称加密的过程中无法确保密钥被安全传递,密文在传输过程中是可能被第三方截获的,如果密码本也被第三方截获,则传输的密码信息将被第三方破获,安全性相对较低。非对称加密算法中私钥是基于不专同的算法生成不同的随机数,私钥通过一定的加密算法推导出公钥,但私钥到公钥的推导过程是单向的,也就是说公钥无法反推导出私钥。所以安全性较高。参考资料来源:百度百科-对称加密参考资料来源:百度百科-非对称加密内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • java对称加密算法des实例详解
  • java对称加密算法pbe定义与用法实例分析
  • java 非对称加密算法rsa实现详解
  • java结合keytool如何实现非对称加密与解密详解
  • java实现的对称加密算法3des定义与用法示例
  • java编程实现非对称加密的方法详解
  • java 对称加密几种算法分别实现
  • java中aes对称加密和解密过程
  • servletcontext中常用方法介绍
  • spring boot2.0中springwebcontext找不到无法使用的解决方法
  • java多线程下的单例模式参考
  • java通过stmp协议发送邮件
  • 初学者android studio安装图文详解
  • java判断是否空最简单的方法
  • java swing组件boxlayout布局用法示例
  • jsp页面传参出现中文乱码的解决方案
  • java swing 非常漂亮外观nimbus的使用方法实例
  • java9以后的垃圾回收的具体用法
  • 非对称加密和对称加密的区别
  • JAVA和.NET使用DES对称加密的区别
  • java 非对称加密算法有哪些
  • Java中RSA的方式如何实现非对称加密的示例
  • 常用的对称加密算法包括
  • java 对称加密,不固定长度加密成固定长度密文
  • JAVA和.NET使用DES对称加密的区别
  • java用于加密解密的所有jar包都有哪些?包括对称与非对称加解密
  • java加密的几种方式
  • JAVA和.NET使用DES对称加密的区别
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全c#教程vbvb.netc 语言java编程delphijavaandroidiosswiftscala易语言汇编语言其它相关首页javajava对称加密算法des实例详解java对称加密算法pbe定义与用法实例分析java 非对称加密算法rsa实现详解java结合keytool如何实现非对称加密与解密详解java实现的对称加密算法3des定义与用法示例java编程实现非对称加密的方法详解java 对称加密几种算法分别实现java中aes对称加密和解密过程servletcontext中常用方法介绍spring boot2.0中springwebcontext找不到无法使用的解决方法java多线程下的单例模式参考java通过stmp协议发送邮件初学者android studio安装图文详解java判断是否空最简单的方法java swing组件boxlayout布局用法示例jsp页面传参出现中文乱码的解决方案java swing 非常漂亮外观nimbus的使用方法实例java9以后的垃圾回收的具体用法java使double保留两位小数的多方java8 十大新特性详解java.net.socketexception: connjava写入文件的几种方法分享java环境变量的设置方法(图文教程java 十六进制与字符串的转换java list用法示例详解java中file类的使用方法javaweb实现文件上传下载功能实例java 字符串截取的三种方法(推荐spring cloud中各组件超时总结transactionattributes各属性意义及配置java 单例模式和工厂模式实例详解深入理解java运行时数据区_动力节点java学spring boot使用druid连接池的示例代码spring boot 验证码的生成和验证详解java中long数据类型转换为int类型scala+redis实现分布式锁的示例代码java之stringbuffer常见使用方法解析java排序算法总结之插入排序
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved