#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. ASP.NET过滤HTML标签只保留换行与空格的方法

    这篇文章主要介绍了ASP.NET过滤HTML标签只保留换行与空格的方法,包含网上常见的方法以及对此方法的改进,具有一定的参考借鉴价值,需要的朋友可以参考下   本文实例讲述了ASP.NET过滤HTML ...

  2. c#(asp.net)杂谈笔记

    1.js解析json格式的时间 //转换json格式时间的方法 如Date(1340239979000)转换为正常 function ConvertJSONDateToJSDateObject(JSO ...

  3. 提高HTML5 canvas性能的几种方法

    简介 HTML5 canvas 最初起源于苹果(Apple)的一项实验,现在已经成为了web中受到广泛支持的2D快速模式绘图(2Dimmediate mode graphic)的标准.许多开发者现在利 ...

  4. 快递鸟物流单号自动识别接口JAVA对接demo

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...

  5. Eclipse中配置Tomcat碰到Server Tomcat v6.0 Server at localhost failed to start问题

    控制台打印异常如下: Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/juli/logg ...

  6. 【Mood-3】心声

    每天醒来,我都会想明白一件事情,时间是不会停下来的,如果打算活下去的话,那么我们会有25岁,会有30岁,更会有40岁,为了不让时间风干我的理想,未来只剩下抱怨,那么为明天伏笔,今天只有努力.耸耸背上行 ...

  7. android studio1.3安装终于成功

    本人机器是win7 32位旗舰版,4G内存.以前使用eclipse adt bundle开发Android程序感觉非常方便,但随着google对andriod studio支持力度加大,转向studi ...

  8. NDK编译FFMpeg[Linux]

    最近在研究视频直播相关的技术,了解到了FFmpeg,就在网上查看如何将FFmpeg移植到Android中,查了几天,看的东西不少,就是没有一个可以完全移植成功的,最后通过产看各种资料,结合网上的资料, ...

  9. Hadoop2.0重启脚本

    Hadoop2.0重启脚本 方便重启带ha的集群,写了这个脚本 #/bin/bash sh /opt/zookeeper-3.4.5-cdh4.4.0/bin/zkServer.sh restart ...

  10. 对象(类)的封装方式(面向对象的js基本知识)

    上一个月一直忙于项目,没写过笔记,今天稍微空下来了一点 前几天在写项目的时候关于怎么去封装每一个组件的时候思考到几种方式,这里总结一下: 1.构造函数方式(类似java写类的方式):把所有的属性和方法 ...