#region 3DES
/// <summary>
/// 3DES加密
/// </summary>
/// <param name="strString">需加密的字符串</param>
/// <param name="strKey">密匙</param>
/// <returns></returns>
public static string DES3Encrypt(string strString, string strKey)
{
strString = strString + "".PadLeft();
byte[] bMsg = Encoding.GetEncoding("GBK").GetBytes(strString); int l = (bMsg.Length / + ) * ;
byte[] btMsg = new byte[l];
Array.Copy(bMsg, btMsg, bMsg.Length); byte[] digestOfPassword = Encoding.Default.GetBytes(strKey);
byte[] keyBytes = new byte[];
Array.Copy(digestOfPassword, keyBytes, digestOfPassword.Length);
for (int j = , k = ; j < ; )
{
keyBytes[k++] = keyBytes[j++];
}
TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
DES.Mode = CipherMode.ECB;
ICryptoTransform DESEncrypt = DES.CreateEncryptor(keyBytes, keyBytes);
var dd = DESEncrypt.TransformFinalBlock(btMsg, , btMsg.Length);
return byte2hex(dd).ToString().Substring(, (bMsg.Length / + ) * );
} public static String getAdd(int length, String strKey)
{
byte[] btMsg = new byte[length / ]; byte[] digestOfPassword = Encoding.UTF8.GetBytes(strKey);
//byte[] digestOfPassword = Encoding.Default.GetBytes(strKey);
byte[] keyBytes = new byte[];
Array.Copy(digestOfPassword, keyBytes, digestOfPassword.Length);
for (int j = , k = ; j < ; )
{
keyBytes[k++] = keyBytes[j++];
} TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
DES.Mode = CipherMode.ECB;
ICryptoTransform DESEncrypt = DES.CreateEncryptor(keyBytes, keyBytes);
var dd = DESEncrypt.TransformFinalBlock(btMsg, , btMsg.Length);
String rtn = byte2hex(dd);
return rtn.Substring(length);
} /// <summary>
/// 字节数组转16进制字符串
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
private static string byte2hex(byte[] dd)
{
StringBuilder ret = new StringBuilder();
foreach (var item in dd)
{
ret.AppendFormat("{0:X2}", item);
}
return ret.ToString();
}
/// <summary>
/// 字符串转16进制字节数组
/// </summary>
/// <param name="hexString"></param>
/// <returns></returns>
private static byte[] strToToHexByte(string hexString)
{
hexString = hexString.Replace(" ", "");
if ((hexString.Length % ) != )
hexString += " ";
byte[] returnBytes = new byte[hexString.Length / ];
for (int i = ; i < returnBytes.Length; i++)
returnBytes[i] = Convert.ToByte(hexString.Substring(i * , ), );
return returnBytes;
}
/// <summary>
/// 3DES解密
/// </summary>
/// <param name="strString">需解密的字符串</param>
/// <param name="strKey">密匙</param>
/// <returns></returns>
public static string DES3Decrypt(string strString, string strKey)
{
strString += getAdd(strString.Length, strKey); byte[] digestOfPassword = Encoding.Default.GetBytes(strKey);
byte[] keyBytes = new byte[];
Array.Copy(digestOfPassword, keyBytes, digestOfPassword.Length);
for (int j = , k = ; j < ; )
{
keyBytes[k++] = keyBytes[j++];
}
TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
DES.Mode = CipherMode.ECB;
ICryptoTransform DESDecrypt = DES.CreateDecryptor(keyBytes, keyBytes);
string result = "";
try
{
byte[] Buffer = strToToHexByte(strString);
byte[] bb = DESDecrypt.TransformFinalBlock(Buffer, , Buffer.Length);
result = Encoding.GetEncoding("GBK").GetString(bb);
}
catch (Exception e)
{
throw e;
}
return result;
}
#endregion

2015-1-13 添加

在我传递key时,出现

查资料,原来是key的长度大于24了,(IV则是8位,但我没有传递)

修改后的3DES算法

#region 3DES
/// <summary>
/// 3DES加密
/// </summary>
/// <param name="strString">需加密的字符串</param>
/// <param name="strKey">密匙</param>
/// <returns></returns>
public static string DES3Encrypt(string strString, string strKey)
{
byte[] bMsg = Encoding.UTF8.GetBytes(strString);
TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
DES.Mode = CipherMode.ECB; string key = strKey;
while (key.Length < )
{
key += strKey;
}
byte[] digestOfPassword = Encoding.UTF8.GetBytes(key);
byte[] keyBytes = new byte[];
Array.Copy(digestOfPassword.Take().ToArray(), keyBytes, digestOfPassword.Take().ToArray().Length); DES.Key = keyBytes;
ICryptoTransform DESEncrypt = DES.CreateEncryptor();
var dd = DESEncrypt.TransformFinalBlock(bMsg, , bMsg.Length);
return Convert.ToBase64String(dd);
} /// <summary>
/// 3DES解密
/// </summary>
/// <param name="strString">需解密的字符串</param>
/// <param name="strKey">密匙</param>
/// <returns></returns>
public static string DES3Decrypt(string strString, string strKey)
{
TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
DES.Mode = CipherMode.ECB;
string key = strKey;
while (key.Length < )
{
key += strKey;
}
byte[] digestOfPassword = Encoding.UTF8.GetBytes(key);
byte[] keyBytes = new byte[];
Array.Copy(digestOfPassword.Take().ToArray(), keyBytes, digestOfPassword.Take().ToArray().Length);
DES.Key = keyBytes;
ICryptoTransform DESDecrypt = DES.CreateDecryptor();
string result = "";
try
{
byte[] Buffer = Convert.FromBase64String(strString);
byte[] bb = DESDecrypt.TransformFinalBlock(Buffer, , Buffer.Length);
result = Encoding.UTF8.GetString(bb);
}
catch (Exception e)
{
throw e;
}
return result;
}
#endregion

3DES 加解密,对长度不限制的更多相关文章

  1. 3DES 加解密

    using System; using System.IO; using System.Security.Cryptography; using System.Text; namespace Comm ...

  2. 3DES加解密【示例】

    代码 /**  * 3DES加解密  */ public class DESedeUtils {     private static final String ALGORITHM_MD5 = &qu ...

  3. 3DES加解密 C语言

    3DES(或称为Triple DES),它相当于是对每个数据块应用三次DES加密算法.3*8字节密钥. 设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代 ...

  4. PHP版3DES加解密类

    <?php /** * * PHP版3DES加解密类 * * 可与java的3DES(DESede)加密方式兼容 * * @Author:蓝凤(ilanfeng.com) * * @versio ...

  5. java 与 c# 3des 加解密

    java 与 c# 3des 加解密   主要差异如下: 1.  对于待加密解密的数据,各自的填充模式不一样 C#的模式有:ANSIX923.ISO10126.None.PKCS7.Zero,而Jav ...

  6. 3DES加解密类

    using System; using System.IO; using System.Security.Cryptography; using System.Text; namespace GT.C ...

  7. PHP和.NET通用的加密解密函数类,均使用3DES加解密 .

    以下为php代码 <PRE class=PHP name="code"> </PRE><PRE class=PHP name="code&q ...

  8. 3des加解密算法

    编号:1003时间:2016年4月1日09:51:11功能:openssl_3des加解密算法http://blog.csdn.net/alonesword/article/details/17385 ...

  9. C# And Java 3DES加解密 ECB模式/PKCS7

    c#: /// <summary>     /// 完整     /// </summary>     public class TripleDESHelper1     { ...

随机推荐

  1. 微信公共服务平台开发(.Net 的实现)11-------客服消息(定项消息推送 重要的OPENID)

    这次我们来一起研究一下“客服消息”,首先明确一下“客服消息”的概念.这不同于之前的“被动响应消息”,也就是说并不是之前“你一言我一语的即时响应”,可能在某种情况下你需要给不同的人主动发送消息,例如你的 ...

  2. SQL Server 2008数据库重命名方法

    假设SQL Server 2008中有个数据库test,现在要将其改名为zhy步骤:(1) 分离数据库:打开management studio,找到test数据库-->右键-->任务--& ...

  3. iOS开发——实战总结OC篇&网易彩票开发知识点总结

    网易彩票开发知识点总结 关于网易彩票开发中遇到了不少的坑,弄了好久才弄懂,或者有些犹豫很久没用就不记得了,所以这里就总结了一下,希望以后不会忘记,就算忘记也能快速查看! /************** ...

  4. ios开发——实用技术总结Swift篇&swift常用开发技术总结

    swift常用开发技术总结 懒加载:属性,数组(字典),控件... 数组(懒加载): lazy var shops:Array<Dictionary<String, String>& ...

  5. 云服务器 ECS Linux IO 占用高问题排查方法

    https://help.aliyun.com/knowledge_detail/41224.html?spm=5176.7841174.2.19.uqC1as#使用 iostat 从系统纬度查看磁盘 ...

  6. [转]Oracle快速入门

    原文出处:http://blog.csdn.net/yueguanghaidao/article/details/7019377 select * from scott.salgrade; /*解锁s ...

  7. Android adb.exe程序启动不起来,如何处理

    经常遇到 Please ensure that adb is correctly located at 'D:\java\sdk\platform-tools\adb.exe' and can be ...

  8. js与C#之间相互调用的一些方法

    1.获得aspx客户端请求地址: <a src= 'http://<%=Request.Url.Host %><%= ResolveUrl("../PayCenter ...

  9. jquery 动态事件绑定(0512)

    jquery动态事件绑定,父元素需为静态元素,(不能是动态生成): $("#parent").on("click","#child",fun ...

  10. Caching Best Practices--reference

    reference:http://java.dzone.com/articles/caching-best-practices There is an irresistible attraction ...