转自 microAllen
 
最近需要使用C#的DES解密工具类解密字符串,但是要解密的字符串是使用java进行DES加密的,去网上查了关于C#和java关于DES加密解密的资料,发现可以相互加密解密的时候,java进行DES加密一般都会写成如下:
public static byte[] encrypt(String message, String key) throws Exception {   
  Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");

DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");   
  // 密钥
  SecretKey secretKey = keyFactory.generateSecret(desKeySpec);   
  // 偏移量
  IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));   
  cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);

return cipher.doFinal(message.getBytes("UTF-8"));   
}

因为初始化Cipher的时候设置了密钥和偏移量,所以C#的DESCryptoServiceProvider类可以很容易的进行解密。C#解密代码如下:
  public static string Decode(string str, string key)
  {
  try
  {

DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
  // 密钥
  provider.Key = Encoding.ASCII.GetBytes(key.Substring(0, 8));
  // 偏移量
  provider.IV = Encoding.ASCII.GetBytes(key.Substring(0, 8));
  byte[] buffer = new byte[str.Length / 2];
  for (int i = 0; i < (str.Length / 2); i++)
  {
  int num2 = Convert.ToInt32(str.Substring(i * 2, 2), 0x10);
  buffer[i] = (byte)num2;
  }
  MemoryStream stream = new MemoryStream();
  CryptoStream stream2 = new CryptoStream(stream, provider.CreateDecryptor(),CryptoStreamMode.Write);
  stream2.Write(buffer, 0, buffer.Length);
  stream2.FlushFinalBlock();
  stream.Close();
  return Encoding.GetEncoding("GB2312").GetString(stream.ToArray());
  }
  catch (Exception) { return ""; }
  }

现在的问题是java的DES加密不仅仅有上面一种写法,我需要解密的字符串是使用如下java代码进行加密的:
public static byte[] encrypt(String message, String key) throws Exception {
  SecureRandom sr = new SecureRandom();
  Cipher cipher = Cipher.getInstance("DES");

DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");   
  SecretKey secretKey = keyFactory.generateSecret(desKeySpec);   
  // 这里使用的是另一个init方法
  cipher.init(Cipher.ENCRYPT_MODE, secretKey, sr);

return cipher.doFinal(message.getBytes("UTF-8"));   
}
这样的话,java加密的偏移量没有设置,而且通过测试发现就算上面设置了偏移量,Cipher cipher = Cipher.getInstance("DES");和Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); 加密之后的结果也不一样,
所以这样的话使用C#解密的时候就不知道相应的偏移量应该怎么设置,麻烦各位高手指导一下,谢谢

问题补充:

DES加密解密结果一般要注意的地方:密钥、偏移量、块密码模式、填充模式
java DES加密的时候:
如果使用这种方式,Cipher cipher = Cipher.getInstance("DES"); 此时块密码模式用ECB模式,C#DES类默认模式是CBC模式,所以如果java使用上面的方式进行初始化的时候,使用C#解密的时候要记得设置Mode属性为ECB,另外,如果没有设置偏移量,C#解密的时候Key和IV设置成一样的就可以进行正常解密了。
所以对于上面java的第2种DES加密方法,使用C#解密的时候只需要在解密之前加上
provider.Mode = CipherMode.ECB;
就可以了

使用C# DES解密java DES加密的字符串的更多相关文章

  1. 记录新项目中遇到的技术及自己忘记的技术点【DES加密解密,MD5加密,字符串压缩、解压,字符串截取等操作】

    一.DES加密.解密 #region DES加密解密 /// <summary> /// 进行DES加密 /// </summary> /// <param name=& ...

  2. Java代码加密与反编译(二):用加密算法DES修改classLoader实现对.class文件加密

    Java代码加密与反编译(二):用加密算法DES修改classLoader实现对.class文件加密 二.利用加密算法DES实现java代码加密 传统的C/C++自动带有保护机制,但java不同,只要 ...

  3. des加密解密——java加密,php解密

    最近在做项目中,遇到des加密解密的问题. 场景是安卓app端用des加密,php这边需要解密.之前没有接触过des这种加密解密算法,但想着肯定会有demo.因此百度,搜了代码来用.网上代码也是鱼龙混 ...

  4. 【知识积累】DES算法之C#加密&Java解密

    一.前言 在项目需要添加安全模块,客户端调用服务端发布的service必须要经过验证,加密算法采用DES,客户端采用C#进行加密,服务端使用Java进行解密.废话不多说,直接上代码. 二.客户端 客户 ...

  5. C#用DES加密JAVA用DES解密,JAVA用DES加密C#用DES解密的实现

    这里贴出来的是可通用的C#与jav的DES加密类,希望对大家管用直接复制即可用 C#DES加密解密类 ///<summary><![CDATA[加密解密帮助类]]></s ...

  6. C# Java DES加密解密

    转自http://www.cnblogs.com/zhuiyi/archive/2013/04/01/2993201.html 最近被DES加解密弄得超级郁闷,我用C#的方法加密得到的密文老是跟客户给 ...

  7. Java DES 加密和解密源码(转)

    原文地址:http://www.oschina.net/code/snippet_727646_18383 Java密码学结构设计遵循两个原则: 1) 算法的独立性和可靠性. 2) 实现的独立性和相互 ...

  8. 加密解密工具类(Java,DES)

    一个Java版的DES加密工具类,能够用来进行网络传输数据加密,保存password的时候进行加密. import java.security.Key; import java.security.sp ...

  9. Java Des加解密方法(c#加密Java解密)

    最近我们用Java把一个用.net编写的老系统重新做了翻版,但是登录还是用.net的登录.这样就会遇到一个比较棘手的问题,我们登录用的cookie信息都是.net用des加密的,但我们不得不用Java ...

随机推荐

  1. Android使用百度地图定位

    下面事例是使用Android平台的部分代码.对于这个平台百度的开放人员已经写了完整的demo,把工程导入到eclipse中之后一般没有错误,如果报错的话,eclipse也会给出提示.一般可以通过将pr ...

  2. Android项目的图标

    项目的图标就是在AndroidManifest.xml中通过android:icon="@drawable/ic_launcher"来指定的,ic_launcher这张图片可以放在 ...

  3. vector,list和deque区别

    stl提供了三个最基本的容器:vector,list,deque. vector和built-in数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此它能非常好的支持随即存取,即[]操作符,但由 ...

  4. mac ssd开启trim

    输入以下指令: 为了安全,此步为备份驱动 (可能需要输入密码) sudo cp -r /System/Library/Extensions/IOAHCIFamily.kext/Contents/Plu ...

  5. Java多线程中变量的可见性

    之所以写这篇博客, 是因为在csdn上看到一个帖子问的就是这个问题. 废话不多说, 我们先看看他的代码(为了减少代码量, 我将创建线程并启动的部分修改为使用方法引用). 1 2 3 4 5 6 7 8 ...

  6. java笔记4之比较运算符

    /*    比较运算符:        ==,!=,>,>=,<,<=            特点:        无论你的操作是简单还是复杂,结果是boolean类型.   ...

  7. js时间基本操作

    js 获取前一天的时 var today=new Date(); var yesterday_milliseconds=today.getTime()-1000*60*60*24; var yeste ...

  8. 我的SD卡乱码解决方案

    转载请注明出处.chendesheng1988是原作者. 问题描述:射频模块读取证件信息后,串口读取的信息存到SD卡,存进去发现汉字是乱码. 解决方案:使用函数WideCharToMultiByte搞 ...

  9. lession2:使用HTTP Cookie 管理器来传递cookies值

    在实际进行压力测试的时候,经常会出现使用cookie传递值的情况,此时就需要使用[HTTP Cookie 管理器]来传递cookie值. 1.参照lession1中,创建线程组.sampler及聚合报 ...

  10. c#中从string数组转换到int数组

    以前一直有一个数组之间转换的东西,可是忘记了,今天也是找了好久也没有解决,最后用这种方法解决了,分享给大家. " }; int[] output = Array.ConvertAll< ...