前段时间做了DES加密解密,采用的是javax下的DES算法,在windows下写的倒挺快,现在部署到linux上测试的时候,组长一脸严肃的找到我,声色俱厉地问我为毛测试数据都不能解密了!你写的什么JB毛算法!马上就要测试了!你给我搞神马!
天地良心,我测的很棒的,还拉出来那个小class放到服务器上跑了啊!扶扶眼镜,赶紧下手改,找了半天发现原因如下:
1. windows下写的的DES算法写起来很飘逸,然而在linux这个严肃的大叔面前,一切都是浮云,生成随机数的
SecureRandom secureRandom = SecureRandom.getInstance();需要加个限制,改成
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG" );
2.上面仅仅是第一步,提上去还是不行,于是我就把密钥的生成由KeyGenerator换成了SecretKeyFactory,然而一切都是浮云,linux仍然一张臭脸告诉我Given final block not properly padded。一转脸,组长的脸快拉长到东京了,赶紧继续排查
3.第三步我想到,难道是DES补位导致的?于是把补位规则改成了"DES/ECB/PKCS5Padding",搞定了,组长啥也没说,走了。
总结起来,DES算法对位数不足8位倍数的字符串进行加密的时候是本身是不补位的,填补方式由程序员自己定,我在windows下任性地写成了NoPadding模式,即填补方式为补充\0或者空格,然后trim;之前的测试数据是在windows下生成的,linux拿过来解密的时候一看,我擦,这是什么玩意儿,随手给扔了,报错;改成了填补方式为"DES/ECB/PKCS5Padding"也就是PKCS5Padding模式之后,windows和linux都遵循同一套填补方式,加密前对数据字节长度对8取余,余数大于0,则差几个字节就补几个字节,字节数值即为补充的字节数,若为0则补充8个字节的8 ,解密后就取最后一个字节,值为m,则从数据尾部删除m个字节,剩余数据即为加密前的原文。
至于
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG" );为啥要加"SHA1PRNG" 的问题,因为对于直接用
SecureRandom secureRandom = SecureRandom.getInstance();在java文档中写的是Constructs a secure random number generator (RNG) implementing the default random number algorithm. 这样linux和windows的默认伪随机数生成算法是有区别的。linux中采用的是/dev/random生成伪随机数,当然还有/dev/urandom这个二逼低强度的副本;windows中则不然,使用的是CryptGenRandom和RtlGenRandom这两个算法来生成。估计这就是为何跨平台的时候需要使用"SHA1PRNG" 强随机种子算法的原因了吧!然而即便如此,java文档中提到还有一个制定伪随机数算法提供者的玩意儿,例如写成
SecureRandom secureRandom =SecureRandom.getInstance("SHA1PRNG","SUN");意思是告诉系统使用SUN提供的强随机种子算法,然而SUN的实现和Apache是不同的,搞不好就乱了,所以一般不用提供provider,希望系统之间不出问题就好。
好,还有第二步的问题,使用KeyGenerator还是SecretKeyFactory的问题。讲真,这俩在解决这次问题中基本上没起作用,但有必要讲一下。密钥的生成在ORACLE的Standard Algorithm Name Documentation 中是有说明的,先说四个吧,KeyGenerator、SecretKeyFactory、KeyFactory、KeyPairGenerator。其中KeyGenerator和SecretKeyFactory都是javax.crypto包下的,主要提供给对称和非可逆加密算法,其中KeyGenerator主要提供给非可逆算法,SecretKeyFactory主要提供给对称加密算法;KeyFactory和KeyPairGenerator是在java.security包中的,主要提供给非对称加密算法的。
OK,搞清楚了这回
相关推荐
这个DESEncrypt工具类是针对Windows和Linux系统设计的,确保在不同操作系统下都能进行一致的加密和解密操作,避免因环境差异导致的解密失败问题。主要关注点在于如何在不同系统中生成一致的随机数种子,以确保加密...
在Java中,我们通常使用`javax.crypto`包下的类来实现DES加密和解密。 核心步骤如下: 1. **密钥生成**:DES需要一个64位的密钥,但如前所述,实际有效部分是56位。Java中的`DESKeySpec`类用于创建DES密钥,我们...
java的DES加密解密:用于密码在数据库的加密,解码类
下面将详细阐述DES加密解密的基本原理、Java和JavaScript的实现方式以及如何在两者之间进行互操作。 1. **DES加密算法**: DES是一种分组密码,使用64位的数据块和56位的密钥进行操作。它通过一系列复杂的数学变换...
本话题主要探讨如何在Linux环境下,使用C语言和Java实现DES加密和解密。 一、DES算法概述 DES是一种块密码,它将64位的数据块作为输入,通过一系列复杂的变换,将其转化为另一64位的密文。DES使用56位的密钥,但...
在Java中实现DES加密和解密是一项常见的任务,通常涉及到`javax.crypto`包中的类和接口。本篇文章将详细阐述DES加密解密的Java实现过程。 首先,我们需要了解DES算法的基本原理。DES是一种块密码,它将明文数据分成...
在Java中,DES加密解密主要通过`javax.crypto`包中的类来实现。首先,我们需要一个密钥,通常是8字节的字节数组。然后,使用`KeyGenerator`生成一个DES密钥。接下来,创建`Cipher`对象并初始化它,根据需要进行加密...
DES加密解密程序的主程序在 FileDES类中 运行时使用的例子是本目录下的111.doc文件,运行后自动生成222.doc文件和333.doc文件。 其中111.doc文件加密后的文件是222.doc文件,222.doc文件解密后文件是333.doc文件。...
Java实现des加密解密算法,des加密解密算法
本文将详细介绍如何在Java中实现DES加解密和MAC算法,并探讨其应用。 首先,DES是一种对称加密算法,由IBM公司开发,后被美国国家标准局采纳为标准。它使用64位的密钥对数据进行加密和解密,但实际有效密钥长度只有...
标题中的“java和C#通用des3加解密”指的是在Java和C#这两种不同的编程语言中实现DES(Data Encryption Standard)的加强版——3DES(Triple DES)加解密算法。3DES是一种广泛使用的对称加密算法,通过三次应用DES的...
在JAVA中实现DES加解密,主要涉及以下几个步骤: 1. 导入相关库:JAVA提供了javax.crypto包,其中包含用于加密操作的类和接口。例如,Cipher类用于执行加解密操作,KeyGenerator类用于生成密钥,SecretKeySpec类...
des加密解密算法,通过DES加密解密实现一个String字符串的加密和解密.
标签"des.java des加密 java_des_128bit java_des 加密解密"进一步强调了这些源代码与Java实现的DES加密和解密有关,其中可能包括了类如`Des.java`,`SubKey.java`,`FileDES.java`等,它们可能分别对应DES的核心...
标题中的“3DES加密解密工具”指的是一个用于执行三重数据加密标准(3DES,Triple DES)的软件工具,这种工具通常用于保护敏感数据的安全,确保信息在传输过程中的机密性。3DES是DES(Data Encryption Standard,...
在IT领域,尤其是在网络安全和数据保护方面,加解密技术起着至关重要的作用。本教程主要探讨了如何使用Java编程语言实现DES(Data Encryption Standard)、3DES(Triple DES)和AES(Advanced Encryption Standard)...
DES加密解密算法的C语言实现 DES(Data Encryption Standard)是一种对称密钥 BLOCK 加密算法,使用 56 ...DES 加密解密算法的 C 语言实现需要理解字节与二进制转换、密钥处理、加密和解密操作以及基本操作等知识点。
然而,DES仍然在某些场景下作为基础加密技术使用,例如在一些旧系统的兼容性问题或简单的加密需求中。 这篇博客文章“java DES 加密解密算法(内有测试)”可能详细介绍了如何在Java中实现DES加密和解密的过程。...
本话题主要关注如何在C#和Java之间通过RSA和DES加密算法实现数据的安全互通。RSA是一种非对称加密算法,适用于小量数据加密,如密钥交换;而DES是对称加密算法,适合大量数据的快速加密,但安全性相对较低。 首先,...
然而,对于兼容性或历史原因,3DES仍然在某些场景下被使用。 总的来说,通过Java实现3DES加密解密,我们需要理解加密算法的基本原理,熟悉Java的相关加密库,并掌握如何生成和使用密钥。在实际开发中,确保数据的...