问题描述
9999:谁有c++版des加密源代码可以跟java版des加密库匹配可以互相加解密急需:万分感谢!本人在网上已经找了很多个版本,都无法跟java版des库加密出来的结果一致。最好的一个版本是:(40字节的明文(如:100@05963010591062666@013001791717991233)8位的密钥)c++加密出来密文是40个字节。java加密出来的密文是48个字节。前40个字节都是一致的。java加密调用代码如下:【DESKeySpecdks=newDESKeySpec(rawKey);SecretKeyFactorykeyFactory=SecretKeyFactory.getInstance("DES");SecretKeysecretKey=keyFactory.generateSecret(dks);javax.crypto.Ciphercipher=Cipher.getInstance("DES");cipher.init(Cipher.ENCRYPT_MODE,secretKey,sr);bytedata[]=str.getBytes("UTF8");byteencryptedData[]=cipher.doFinal(data);】这几天来从网上搜到的相关信息如下:【在linux下用openssl库的des算法加密 与 在windows下用java自带库的des算法加密,得到的密文最后8个字节不一样.DES算法是8字节对齐的,也就是说当明文不是8字节的倍数时,算法会自动补齐. 大家有谁知道c与java中的des算法补齐的原则吗?已经解决了,是双方调用的时候使用的策略不一样.加密算法一般是根据块加密的,比如8字节,16,32字节对齐。好久没接触了,DES好像是56有效位+8位吧。当加密的最后一个分片大小不够对齐的时候,则会采用一个默认字符来补齐。比如使用“空格”来补齐。而不同的库可能使用的补齐字符不相同,有些可能使用空格,有些可能使用0,这样一来,相当于加密的字符串已经不同了,所以最后的加密结果也会不同。所以你需要先确定两个库使用的补齐字符是相同的另外解密的时候,因为加密后的结果都是按块对齐的,所以不需要再次对齐,但是解密后的结果有可能是加了补齐字符的,你可以通过计算md5看看是否存在这个情况,如果存在的话,则你还需要将后面补齐的字符去掉。是padding的方式不同,两边约定一种即可。现在想在java和C++之间通信,通信的数据用DES算法加密,java用的是JCE,C++端用的是openssl库的des算法遇到的问题问题是,如果加密数据的位数不是8的倍数的话用Cipherc1=Cipher.getInstance("DES/ECB/PKCS5Padding");加密出来的数据和C++端加密出来的数据不一致,但不会报错用Cipherc1=Cipher.getInstance("DES/ECB/NOPADDING");的时候如果加密数据的位数不是8的倍数的话会报错,是8的倍数的话,加密出来的数据就和C++端的一致了。请问有什么方法,加密数据的位数可以不是8的倍数,而且加密出来的数据能和C++一致呢?Java写DES一般用现成的类库,而C++来完成加密算法工作都是用openssl库来实现的。openssl库调用不算很难,编译网上也有操作流程。当不同语言实现加密解密操作的时候,注意一下反馈模式和填充模式就行。常用的反馈模式是ECB和CBC,你这套代码是用的ECB就是无反馈模式,这个就可以不用考虑了。而填充模式标准的填充方法是pkcs#5标准,如果按照这种标准填充的,那什么语言只要数据对应,都没问题,因为算法的实现是相同的。JAVA的DES算法可以指定加密的模式和填充方式,如果不指定,则默认的就是ECB加密模式和PKCS#5填充方式】
解决方案
解决方案二:
该回复于2011-04-02 10:57:40被版主删除
解决方案三:
在Java中的DES默认是DES/ECB/PKCS5Padding的。因此Cipher.getInstance("DES");与Cipher.getInstance("DES/ECB/PKCS5Padding");是一样的。由于DES是块加密对称算法,因此,在NoPadding模式下明文的字节长度必须是8的倍数,否则会报错。如果有填充模式的话,会自动将明文填充到8的倍数。根据规范在填充模式下,DES密文的长度为:(N/8)*8+8N为原文字节长度/为整除