api接口调用的时候,需要和java的进行加密通信,通信过程中用到DES加密,java那边DES的key为64位字符串,而之前c#的DES加密是key为8位

DESCryptoServiceProvider 中的密钥是8位;
RijndaelManaged 中的密钥是32位。

java中的的DES/CBC/PKCS5Padding对应c#中的DES/CBC/PKCS7

对应的javaDES加密函数:因为要网络传输,把+号全部转为%2B

    private static final String KEY ="xxxJE234D";//64个字符串
public static String encryptString(String plaintext) 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.substring(0, 8).getBytes("UTF-8"));
cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
byte[] bt = cipher.doFinal(plaintext.getBytes("UTF-8"));
String strs = new BASE64Encoder().encode(bt).replaceAll("[+]", "%2B");
return strs;
}

c#对应的DES加密函数:

    public static string ToEncrypt2(string str, string myKey)
{
string encryptKeyall = Convert.ToString(myKey); //定义密钥
if (encryptKeyall.Length < )
{
for (; ; )
{
if (encryptKeyall.Length < )
encryptKeyall += encryptKeyall;
else
break;
}
}
string encryptKey = encryptKeyall.Substring(, );
DESCryptoServiceProvider descsp = new DESCryptoServiceProvider(); //实例化加/解密类对象
descsp.Mode = CipherMode.CBC;
descsp.Padding = PaddingMode.PKCS7;
byte[] key = Encoding.UTF8.GetBytes(encryptKey); //定义字节数组,用来存储密钥
byte[] data = Encoding.UTF8.GetBytes(str);//定义字节数组,用来存储要加密的字符串
MemoryStream MStream = new MemoryStream(); //实例化内存流对象
//使用内存流实例化加密流对象
CryptoStream CStream = new CryptoStream(MStream, descsp.CreateEncryptor(key, key), CryptoStreamMode.Write);
CStream.Write(data, , data.Length); //向加密流中写入数据
CStream.FlushFinalBlock(); //释放加密流
return Convert.ToBase64String(MStream.ToArray()).Replace("+", "%2B");//返回加密后的字符串
}

c#中key为8位的情况:

  public static string Encrypt(string pToEncrypt, string sKey)
{
using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
{ byte[] inputByteArray = Encoding.UTF8.GetBytes(pToEncrypt);
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
System.IO.MemoryStream ms = new System.IO.MemoryStream();
using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(inputByteArray, , inputByteArray.Length);
cs.FlushFinalBlock();
cs.Close();
}
string str = Convert.ToBase64String(ms.ToArray());
ms.Close();
return str;
}
}
//解密
/// <summary>
/// 进行DES解密
/// </summary>
/// <param name="pToDecrypt">要解密的以Base64</param>
/// <param name="sKey">密钥,且必须为8位</param>
/// <returns>已解密的字符串</returns>
public static string Decrypt(string pToDecrypt, string sKey)
{
byte[] inputByteArray = Convert.FromBase64String(pToDecrypt);
using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
{ des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
System.IO.MemoryStream ms = new System.IO.MemoryStream();
using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(inputByteArray, , inputByteArray.Length);
cs.FlushFinalBlock();
cs.Close();
}
string str = Encoding.UTF8.GetString(ms.ToArray());
ms.Close();
return str;
}
}

最新文章

  1. 不重新编译php安装配置eAccelerator
  2. 减小ipa体积之删除frameWork中无用mach-O文件
  3. DD_belatedPNG.js解决透明PNG图片背景灰色问题
  4. SSH项目(struts+spring+hibernate)搭建_代码简化
  5. Codeforces Beta Round #35 (Div. 2) E. Parade(扫描线)
  6. Sightseeing tour
  7. 关于SQL语句优化的一个问题
  8. [MySql] - 解决部署的服务器没有安装MySql Connector
  9. WebView重定向新开界面问题-b
  10. Start-Process传递变量
  11. js的变量作用域
  12. ROS开发文档
  13. BZOJ 1355: [Baltic2009]Radio Transmission( kmp )
  14. java与javac的区别
  15. Spring知识点回顾(08)spring aware
  16. 配置phpstorm自动上传代码
  17. InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised.解决办法
  18. 老男孩Python九期全栈学习笔记4
  19. Javascript高级编程学习笔记(12)—— 引用类型(1)Object类型
  20. Spring MVC &amp; Boot &amp; Cloud 技术教程汇总(长期更新)

热门文章

  1. Spring Boot中自动执行sql脚本
  2. weiFenLuo.winFormsUI.Docking.dll学习
  3. redis的 list
  4. Jedis操作Redis--SortedSet类型 (会自然排序)
  5. 对Table_locks_immediate值的理解
  6. OpenLdap与BerkeleyDB安装过程
  7. linux 安装jdk 二进制版本,非安装版
  8. 04 Thread的方法(源代码) 和 线程的状态
  9. guava快速入门(三)
  10. php中的字符串常用函数(二) substr() 截取字符串