搜索
查看: 3572|回复: 3

DES在不同语言间的加密和解密

[复制链接]

1

主题

4

帖子

37

积分

新手入门

Rank: 1

积分
37
发表于 2013-12-17 16:02:12 | 显示全部楼层 |阅读模式
服务端用C#进行DES加密,返回客户端需要通过 aardio 解密,一直不成功。参考过其他相关文章,没办法解决。求助!

服务端C#加密函数:

  1. public static string Encrypt4Base64(string pToEncrypt, string sKey)
  2. {
  3.     DESCryptoServiceProvider des = new DESCryptoServiceProvider();
  4.     byte[] inputByteArray = Encoding.UTF8.GetBytes(pToEncrypt);
  5.     des.Key = Encoding.UTF8.GetBytes(sKey);
  6.     des.IV = Encoding.UTF8.GetBytes(sKey);
  7.     MemoryStream ms = new MemoryStream();
  8.     CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
  9.     cs.Write(inputByteArray, 0, inputByteArray.Length);
  10.     cs.FlushFinalBlock();

  11.     return Convert.ToBase64String(ms.ToArray());
  12. }
复制代码


客户端我尝试这样解密:

  1. csp.decrypt(crypt.bin.decodeBase64(html))
复制代码


但是得出的结果不对,是不是跟c#里面用的那个Encoding有关?
回复

使用道具 举报

30

主题

695

帖子

4178

积分

超级版主

Rank: 8Rank: 8

积分
4178
发表于 2013-12-18 11:35:50 | 显示全部楼层

不同语言间DES加密结果要一致,注意两个要点 1、加密向量要一致,另外注意向量最好不要与密钥相同。 2、编码要一致,例如C#里使用 Encoding.UTF

不同语言间DES加密结果要一致,注意两个要点
1、加密向量要一致,另外注意向量最好不要与密钥相同。
2、编码要一致,例如C#里使用 Encoding.UTF8.GetBytes(str),在aardio中等价的写法是tring.fromto(str,0,65001) , 65001即UTF8内码

下面是使用C#、aardio对比DES加密结果的示例:
des.jpg

  1. import console
  2. import crypt.bin;
  3. import crypt.des;
  4. import dotNet;

  5. var des = crypt.des();
  6. des.setPassword("密钥八位" )
  7. var s = des.encrypt("加密字符串")
  8. console.log( "aardio DES 加密结果:", crypt.bin.encodeBase64(s)  )

  9. console.log( "请稍候,正在使用C# DES计算加密结果:" )

  10. //创建.Net虚拟机
  11. var clr;
  12. try{ clr = dotNet.clr( "v2.0" );  }
  13. catch(e){  clr = dotNet.clr( "v4.0" ); }

  14. //编译C#程序集
  15. var appDomain = clr.createAppDomain();
  16. var compile = appDomain.createCompiler("C#");
  17. compile.Reference("System.dll")
  18. compile.Source = /******
  19. using System;
  20. using System.Collections.Generic;
  21. using System.Text;
  22. using System.Security.Cryptography;
  23. using System.IO;

  24. namespace CSharpLibrary  
  25. {  
  26.     public class CSharpObject  
  27.     {
  28.         private static byte[] DES_IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
  29.         public static string Encrypt4Base64(string pToEncrypt, string sKey)
  30.         {
  31.             DESCryptoServiceProvider des = new DESCryptoServiceProvider();
  32.             des.Key = Encoding.GetEncoding("GBK").GetBytes(sKey);
  33.             des.IV = DES_IV;
  34.         
  35.             MemoryStream ms = new MemoryStream();
  36.             CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
  37.         
  38.             byte[] inputByteArray = Encoding.GetEncoding("GBK").GetBytes(pToEncrypt);
  39.             cs.Write(inputByteArray, 0, inputByteArray.Length);
  40.             cs.FlushFinalBlock();
  41.         
  42.             return Convert.ToBase64String(ms.ToArray());
  43.         }
  44.     }   
  45. }
  46. ******/

  47. //编译C#程序集
  48. var assembly = compile.Compile()   
  49. if(!assembly){  console.log( compile.getLastError() ); return; };

  50. //调用C#函数
  51. var s = assembly.invokeStaticMember("CSharpLibrary.CSharpObject","Encrypt4Base64","加密字符串","密钥八位" )
  52. console.log("C# DES加密结果",s)
复制代码


DES的密钥注意是 8位长度,2DES 16位, 3DES 24位,在aardio中密钥长度没有严格要求,会自动转换为对应的DES加密算法。

点评

真棒: 5.0
真棒: 5
厉害!!佩服  发表于 2013-12-19 09:32

评分

参与人数 1银币 +60 收起 理由
aaucn + 60 很给力!

查看全部评分

回复

使用道具 举报

1

主题

4

帖子

37

积分

新手入门

Rank: 1

积分
37
 楼主| 发表于 2013-12-20 13:07:57 | 显示全部楼层

感谢版主的详尽回答,问题已经解决,主要原因应该是我的向量设置问题!另外版主的代码也间接提供了另外一种解决方法,就是直接嵌入c#代码在aardio中进行解密!

感谢版主的详尽回答,问题已经解决,主要原因应该是我的向量设置问题!另外版主的代码也间接提供了另外一种解决方法,就是直接嵌入c#代码在aardio中进行解密!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2019-11-18 15:09 , Processed in 0.171875 second(s), 26 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表