最近一个项目中,因为服务端是用的java开发的,客户端是用的C#,由于通信部分采用到了3DES加密,所以做个记录,以备以后需要的时候直接用。

  这是对方(java)的加密算法,和网上流传的代码也差不多(主密钥直接写死了,方便测试)

 package org.zwork.market.mina.msg;

 import java.security.spec.KeySpec;

 import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.DESedeKeySpec; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.zwork.market.MktContants; public class ThreeEncryptDecrypt { private static final Logger LOGGER = LoggerFactory.getLogger(ThreeEncryptDecrypt.class); // 定义 加密算法,可用 DES,DESede,Blowfish
public static final String Algorithm = "DESede";
public static String DES = "DES/ECB/NoPadding";
public static String TriDes = "DESede/ECB/NoPadding"; // des加密
public static byte[] des_crypt(byte key[], byte data[]) {
try {
KeySpec ks = new DESKeySpec(key);
SecretKeyFactory kf = SecretKeyFactory.getInstance("DES");
SecretKey ky = kf.generateSecret(ks); Cipher c = Cipher.getInstance(DES);
c.init(Cipher.ENCRYPT_MODE, ky);
return c.doFinal(data);
} catch (Exception e) {
LOGGER.error("des_crypt error:", e);
return null;
}
} // des解密
public static byte[] des_decrypt(byte key[], byte data[]) { try {
KeySpec ks = new DESKeySpec(key);
SecretKeyFactory kf = SecretKeyFactory.getInstance("DES");
SecretKey ky = kf.generateSecret(ks); Cipher c = Cipher.getInstance(DES);
c.init(Cipher.DECRYPT_MODE, ky);
return c.doFinal(data);
} catch (Exception e) {
LOGGER.error("des_decrypt error:", e);
return null;
}
} // 3DES加密
public static byte[] trides_crypt(byte key[], byte data[]) {
try {
byte[] k = new byte[]; int len = data.length;
if (data.length % != ) {
len = data.length - data.length % + ;
}
byte[] needData = null;
if (len != )
needData = new byte[len]; for (int i = ; i < len; i++) {
needData[i] = 0x00;
} System.arraycopy(data, , needData, , data.length); if (key.length == ) {
System.arraycopy(key, , k, , key.length);
System.arraycopy(key, , k, , );
} else {
System.arraycopy(key, , k, , );
} KeySpec ks = new DESedeKeySpec(k);
SecretKeyFactory kf = SecretKeyFactory.getInstance("DESede");
SecretKey ky = kf.generateSecret(ks); Cipher c = Cipher.getInstance(TriDes);
c.init(Cipher.ENCRYPT_MODE, ky);
return c.doFinal(needData);
} catch (Exception e) {
LOGGER.error("trides_crypt error:", e);
return null;
} } // 3DES解密
public static byte[] trides_decrypt(byte key[], byte data[]) {
try {
byte[] k = new byte[]; int len = data.length;
if (data.length % != ) {
len = data.length - data.length % + ;
}
byte[] needData = null;
if (len != )
needData = new byte[len]; for (int i = ; i < len; i++) {
needData[i] = 0x00;
} System.arraycopy(data, , needData, , data.length); if (key.length == ) {
System.arraycopy(key, , k, , key.length);
System.arraycopy(key, , k, , );
} else {
System.arraycopy(key, , k, , );
}
KeySpec ks = new DESedeKeySpec(k);
SecretKeyFactory kf = SecretKeyFactory.getInstance("DESede");
SecretKey ky = kf.generateSecret(ks); Cipher c = Cipher.getInstance(TriDes);
c.init(Cipher.DECRYPT_MODE, ky);
return c.doFinal(needData);
} catch (Exception e) {
LOGGER.error("trides_decrypt error:", e);
return null;
}
} public static String getPass(String source) {
byte[] data= hexToBytes(source);
byte[] key ="111111111111111111111111111a1.1.".getBytes();
String result = byte2hex(trides_decrypt(key, data)).toUpperCase();
return result.substring(, );
} public static String byte2hex(byte[] data) {
StringBuffer sb = new StringBuffer();
for (int i = ; i < data.length; i++) {
String temp = Integer.toHexString(((int) data[i]) & 0xFF);
for (int t = temp.length(); t < ; t++) {
sb.append("");
}
sb.append(temp);
}
return sb.toString();
} public static byte[] hexToBytes(String str) {
if (str == null) {
return null;
} else if (str.length() < ) {
return null;
} else {
int len = str.length() / ;
byte[] buffer = new byte[len];
for (int i = ; i < len; i++) {
buffer[i] = (byte) Integer.parseInt(str.substring(i * , i * + ), );
}
return buffer;
}
}
}

  因为客户端只负责数据加密,所以我这里只写了加密的部分。由于java和C#语言很相似,所以我就仿这他们给的java代码改成C#的,当然也在网上参考了一些代码,不过中间还是出现了些问题,比如C#不支持弱密钥(把密钥弄复杂点),因为没注意大小写造成加密结果不一致等等。编程这东西一个点都能让整个系统崩溃,所以小细节很重要!!!

     public class DESHelper
{
/// <summary>
/// 将密码转成直接数组
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static byte[] HexToBytes(String str)
{
if (str == null)
{
return null;
}
else if (str.Length < )
{
return null;
}
else
{
int len = str.Length / ;
byte[] buffer = new byte[len];
for (int i = ; i < len; i++)
{
var temp = str.Substring(i * , );
buffer[i] = (byte)Convert.ToInt32(temp, );
}
return buffer;
}
}
/// <summary>
/// 3DES加密
/// </summary>
/// <param name="key"></param>
/// <param name="data"></param>
/// <returns></returns>
public static byte[] GetDes3EncryptedText(byte[] key, byte[] data)
{
byte[] k = new byte[];
int len = data.Length;
if (data.Length % != )
{
len = data.Length - data.Length % + ;
}
byte[] needData = null;
if (len != )
needData = new byte[len]; for (int i = ; i < len; i++)
{
needData[i] = 0x00;
} Buffer.BlockCopy(data, , needData, , data.Length); if (key.Length == )
{
Buffer.BlockCopy(key, , k, , key.Length);
Buffer.BlockCopy(key, , k, , );
}
else
{
Buffer.BlockCopy(key, , k, , );
} var des3 = new TripleDESCryptoServiceProvider();
des3.Key = k;
des3.Mode = CipherMode.ECB;
des3.Padding = PaddingMode.Zeros; using (MemoryStream ms = new MemoryStream())
using (CryptoStream cs = new CryptoStream(ms, des3.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(data, , data.Length);
cs.FlushFinalBlock();
return ms.ToArray();
}
} /// <summary>
/// 将加密结果转成字符串
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static String GetByte2Hex(byte[] data)
{
StringBuilder sb = new StringBuilder();
for (int i = ; i < data.Length; i++)
{
String temp = string.Format("{0:X}", ((int)data[i]) & 0xFF);
for (int t = temp.Length; t < ; t++)
{
sb.Append("");
}
sb.Append(temp);
}
return sb.ToString();
}
}

C# 3DES加密的更多相关文章

  1. Des与3Des加密解密

    /// <summary> /// Des和3Des算法 /// </summary> public class Des { /// <summary> /// D ...

  2. iOS 3DES加密解密(一行代码搞定)

    3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计 ...

  3. 简进祥==iOS 3DES加密解密

    3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计 ...

  4. JAVA和C# 3DES加密解密

    最近 一个项目.net 要调用JAVA的WEB SERVICE,数据采用3DES加密,涉及到两种语言3DES一致性的问题, 下面分享一下, 这里的KEY采用Base64编码,便用分发,因为Java的B ...

  5. C# Java 3DES加密解密 扩展及修正\0 问题

    注: C#已亲测及做扩展, Java 部分未做验证 /// <summary> /// 3DES加密解密 /// ------------------------------------- ...

  6. JAVA安卓和C# 3DES加密解密的兼容性问题(2013年8月修改版)

    近 一个项目.net 要调用JAVA的WEB SERVICE,数据采用3DES加密,涉及到两种语言3DES一致性的问题, 下面分享一下, 这里的KEY采用Base64编码,便用分发,因为Java的By ...

  7. 使用openssl库实现des,3des加密

    原文地址: 使用openssl库实现des,3des加密 主要是调整了一下格式,以及一些变量的类型,以解决在VC2008下无法编译通过的问题. #include <stdio.h> #in ...

  8. Java中3DES加密解密与其他语言(如C/C++)通信

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  9. 【推荐】JAVA基础◆浅谈3DES加密解密

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

随机推荐

  1. Java多线程9:ThreadLocal源码剖析

    ThreadLocal源码剖析 ThreadLocal其实比较简单,因为类里就三个public方法:set(T value).get().remove().先剖析源码清楚地知道ThreadLocal是 ...

  2. Facebook 发布「流程」

    时不时就会在面试过程中碰到有候选人问 Facebook 是否采用 Scrum 之类的敏捷方法,偶尔也会有中国的朋友问及 Facebook 上线流程.我通常会简单说几句,然后说「如果你真感兴趣的话,去搜 ...

  3. shell 中命令输入的快!捷!键!

    非常棒!! 非常棒!! 删除ctrl + d 删除光标所在位置上的字符相当于VIM里x或者dlctrl + h 删除光标所在位置前的字符相当于VIM里hx或者dhctrl + k 删除光标后面所有字符 ...

  4. Node.js与Sails~中间查询语言Waterline

    回到目录 上讲主要说了如何配置sails的持久化机制,这讲主要说一下实现持久化时的增删改查的语法,在sails里使用了和mongodb风格类似的waterline查询语言,使用简单,语法生动,下面我们 ...

  5. Atitit 项目的主体设计与结构文档 v3

    Atitit 项目的主体设计与结构文档 v3 1. 实现的目标2 1.1. cross device跨设备(pc 手机 平板)作为规划2 1.2. 企业级Java体系与开发语言2 1.3. 高扩展性, ...

  6. Atititi 版本管理 rc final rtm ga release 软件的生命周期中一般分4个版本

    Atititi 版本管理 rc final rtm ga release 软件的生命周期中一般分4个版本 RC=Release Candidate,含义是"发布候选版",它不是最终 ...

  7. PHP两种redirect

    PHP两种redirect redirect header('Location: /admin_data.php'); exit(); redirect `echo "<script& ...

  8. XML学习笔记2——DTD

    在上一篇笔记中,将文档类型分类时,曾经根据文档是否使用并遵守了DTD或Schema来区分为格式良好的XML和有效的XML,那么什么是DTD和Schema呢?DTD和Schema都是用来规范XML文档的 ...

  9. Ajax在IE浏览器会出现中文乱码解决办法

    在AJAX浏览器来进行发送数据时,一般它所默认的都是UTF-8的编码. Ajax在IE浏览器会出现中文乱码的情况!解决办法如下 <script type="text/javascrip ...

  10. ZZUOJ 1199 大小关系(拓扑排序,两种方法_判断入度和dfs回路判断)

    /* 这道题如果按照度为0的节点来判断的时候,将度为0的节点和其相连的节点(度数并减去1) 从图中去掉,如果度为0的节点的个数为0个但是图中的节点没有都去掉的 时候那么说明 出现了回路!用这种方法必须 ...