跪求!急,在线等!!.netDES加密与javaDES加密出的字符串不同

问题描述

跪求!急,在线等!!.netDES加密与javaDES加密出的字符串不同

这是.net的DES加密 .net我不懂

这是java的 我敲的 但是二者加密出来的字符串不同


java解析出来的加密字符串是 e0pOfMet1ZnYMUAaIjk6lg==
.net解析出来的是 esUrgcoeel8amhhplZX2MQ==
我java的那个步骤错了吗? 为什么俩者解析出来的字符串不同!谢谢大神!! 囧

解决方案

.net你用的是asiic编码,你确认java使用asiic编码吗

解决方案二:

来自 http://zhidao.baidu.com/question/1447483656421960300.html?device=mobile&ssid=0&from=2001a&uid=0&pu=usm@0,sz@1320_1003,ta@iphone_2_6.0_1_10.9&bd_page_type=1&baiduid=07B756001CCD21CDD33ABE8E3AFD5E13&tj=www_zhidao_normal_2_0_10_title

最近需要对数据进行加密/解密, 因此选用了CryptoJS库, 对数据做DES算法的加密/解密

首选查看官方示例, 将密文进行Base64编码, 掉进一个大坑

var encrypted = CryptoJS.DES.encrypt("Message", "Secret Passphrase");
// ciphertext changed every time you run it
// 加密的结果不应该每次都是一样的吗?
console.log(encrypted.toString(), encrypted.ciphertext.toString(CryptoJS.enc.Base64));
var decrypted = CryptoJS.DES.decrypt(encrypted, "Secret Passphrase");
console.log(decrypted.toString(CryptoJS.enc.Utf8));

对这些加密算法不了解, 只能求助Google
des encrypion: js encrypted value does not match the java encrypted value
In cryptoJS you have to convert the key to hex and useit as word just like above (otherwise it will be considered as passphrase)
For the key, when you pass a string, it's treated as a passphrase and used to derive an actual key and IV. Or you can pass a WordArray that represents the actual key.

原来是我指定key的方式不对, 直接将字符串做为参数, 想当然的以为这就是key, 其实不然, CryptoJS会根据这个字符串算出真正的key和IV(各种新鲜名词不解释, 问我也没用, 我也不懂 -_-")

那么我们只需要将key和iv对应的字符串转成CryptoJS的WordArray类型, 在DES加密时做为参数传入即可, 这样对Message这个字符串加密, 每次得到的密文都是YOa3le0I+dI=
var keyHex = CryptoJS.enc.Utf8.parse('abcd1234');
var ivHex = CryptoJS.enc.Utf8.parse('inputvec');
var encrypted = CryptoJS.DES.encrypt('Message', keyHex, { iv: ivHex });

这样是不是就万事OK了? 哪有, 谁知道这坑是一个接一个啊.
我们再试试Java这边的DES 加密是不是和这个结果一样, 具体实现请参考Simple Java Class to DES Encrypt Strings

果真掉坑里了, Java通过DES加密Message这个字符串得到的结果是8dKft9vkZ4I=和CryptoJS算出来的不一样啊...亲

继续求助Google
C# and Java DES Encryption value are not identical
SunJCE provider uses ECB as the default mode, and PKCS5Padding as the default padding scheme for DES.(JCA Doc)
This means that in the case of the SunJCE provider,
Cipher c1 = Cipher.getInstance("DES/ECB/PKCS5Padding");
and
Cipher c1 = Cipher.getInstance("DES");
are equivalent statements.

原来是CryptoJS进行DES加密时, 默认的模式和padding方式和Java默认的不一样造成的, 必须使用ECB mode和PKCS5Padding, 但是CryptoJS中只有Pkcs7, 不管了, 试试看...

var keyHex = CryptoJS.enc.Utf8.parse('abcd1234');
var encrypted = CryptoJS.DES.encrypt('Message', keyHex, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
console.log(encrypted.toString(), encrypted.ciphertext.toString(CryptoJS.enc.Base64));

咦...使用Pkcs7能得到和Java DES一样的结果了, 哇塞...好神奇
那我们试试统一Java也改成Cipher.getInstance("DES/ECB/PKCS7Padding")试试, 结果得到一个大大的错误
Error:java.security.NoSuchAlgorithmException: Cannot find any provider supporting DES/ECB/PKCS7Padding

没办法, 继续Google
java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/ECB/PKCS7PADDING
I will point out that PKCS#5 and PKCS#7 actually specify exactly the same type of padding (they are the same!), but it's called #5 when used in this context. :)

这位大侠给出的解释是: PKCS#5和PKCS#7是一样的padding方式, 对加密算法一知半解, 我也只能暂且认可这个解释了.

忙完了DES的加密, 接下来就是使用CryptoJS来解密了. 我们需要直接解密DES加密后的base64密文字符串. CryptoJS好像没有提供直接解密DES密文字符串的方法啊, 他的整个加密/解密过程都是内部自己在玩, 解密时需要用到加密的结果对象, 这不是坑我吗?

只好研究下CryptoJS DES加密后返回的对象, 发现有一个属性ciphertext, 就是密文的WordArray, 那么解密的时候, 我们是不是只要提供这个就行了呢?
var keyHex = CryptoJS.enc.Utf8.parse('abcd1234');
// direct decrypt ciphertext
var decrypted = CryptoJS.DES.decrypt({
ciphertext: CryptoJS.enc.Base64.parse('8dKft9vkZ4I=')
}, keyHex, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
console.log(decrypted.toString(CryptoJS.enc.Utf8));

果不其然, 到此为止, 问题全部解决, 豁然开朗...

完整代码请参考CryptoJS-DES.html
Use CryptoJS encrypt message by DES and direct decrypt ciphertext, compatible with Java Cipher.getInstance("DES")

解决方案三:

传入的数据类型是否一致,是否一个是字符串,一个是字节数组等

时间: 2024-08-01 09:27:07

跪求!急,在线等!!.netDES加密与javaDES加密出的字符串不同的相关文章

mysql-菜鸟跪求大神解答,myqsl存储过程在什么位置编写啊···写在哪里啊··跪求,在线跪等

问题描述 菜鸟跪求大神解答,myqsl存储过程在什么位置编写啊···写在哪里啊··跪求,在线跪等 请问各位大神存储过程应该写在哪里啊,我去哪里编写啊···找了好久都毫无头绪···我用的是mysql 解决方案 在控制台用CREATE PROCEDURE创建,如果你不会,参考http://database.51cto.com/art/201012/238261.htm下载一个图形管理界面,那么鼠标点点就能写了,如果你什么都不会的话.

aspx页面怎么判断数据库的值然后根据判断值觉得是否弹出右下角窗口???跪求~急急急~

问题描述 就是数据库表里有个字段是记录时间,datetime类型,怎么判断这个字段和当前时间相差三天的话页面就弹出消息窗口,消息窗口目前能在页面显示,可就是还没有加条件判断数据库字段,跪求大侠指导~ 解决方案 解决方案二:这个好说,首先在.cs文件里面声明一个bool的变量,bool变量就是用来放是否差三天的这个判断值,然后前台去获取就行咯.解决方案三:sql有diff......解决方案四:.cs文件里加判断,结果返给前台或者直接前台ajax请求一般处理程序给到返回解决方案五:cs程序里这样写

跪求大神破解一下这个天狼星的加密视频

问题描述 我机器码是5678014260161584322714666446866430405317下面是要输入用户名和注册码据说是天狼星的,跪求大神用算码器算一下...........

maven SSH 基本配置,雪地跪求,在线等

问题描述 服务器是tomcat,在启动的时候报如下错,使用的是注解的方式org.springframework.beans.factory.BeanCreationException:Errorcreatingbeanwithname'adContentDao':Invocationofinitmethodfailed;nestedexceptionisjava.lang.IllegalArgumentException:'sessionFactory'or'hibernateTemplate'

引用SVC(添加Service References), 总是报错,跪求帮助在线等待...

问题描述 报错信息:URIhttp://192.168.0.115/portal/services/UFIDA.U9.ISV.RCV.ICreateRCVSRV.svc处的文档未被识别为已知的文档类型.来自各已知类型的错误信息可能有助于修复该问题:-来自"http://192.168.0.155/portal/services/UFIDA.U9.ISV.RCV.ICreateRCVSRV.svc"的报告是"无法识别此文档格式(内容类型为"text/html;char

跪求快捷登录源码~~

问题描述 大神们有没有快捷登录的源码啊????.net的谢谢啦.跪求啊在线等.... 解决方案 解决方案二:登陆啥????解决方案三:自己百度找呗

跪求大神解答-c++实现优先队列的各项基本功能

问题描述 c++实现优先队列的各项基本功能 跪求如何用c++实现优先队列的入队,出队,打印操作? 解决方案 http://www.cnblogs.com/heqinghui/archive/2013/07/30/3225407.html 解决方案二: 优先队列的操作基本上和栈一样.push,top,pop,等等

数据-多表关联按照一个地区插入到一张新表中。在线跪求各位大神,急急急!!!

问题描述 多表关联按照一个地区插入到一张新表中.在线跪求各位大神,急急急!!! 多表关联,我现有多张表,想将数据提取出来,按照一个地区插入到一张新表中,但是这些多张表,有的比如有西安,但是有的有没有西安,所以会造成数据的丢失,有什么好的方法可以解决?在线跪求各位大神,急急急!!! 解决方案 刚开始的的第一张表是没有西安的,informix库 解决方案二: 按照你说的要求,我觉得应该有张表的地区应该最为全面,就是说有一条主线可以将所有表都联立起来,然后可以以这张表为主表进行左联即可.. 解决方案三

mariadb循环重启-Mariadb 循环重启。求大神。急在线等

问题描述 Mariadb 循环重启.求大神.急在线等 ![日志截图 数据库好好的,就这样了.也没有做什么加密操作,数据库一直循环重启 解决方案 是不是数据库本身有问题了,重新安装呢 解决方案二: 已经重新安装过几次了,但是这种事件是偶然发生的..... 数据库是mariadb 10.1.12