des 加解密

来源:互联网 发布:java replace替换 编辑:程序博客网 时间:2024/05/21 22:46
要和别的系统通讯,那边是c#和java。 两个版本的加密解密都一致。
可我的php就是找不到一致的方法。
求教达人。。。谢谢!
下面是C#的加密解密,还有我找到php的两个方法

C# code
//C# 版DES 加解密算法using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Data.SqlClient; using System.Security.Cryptography; using System.IO; using System.Text; public class Des{ //加解密密钥 private static string skey = "12345678"; //初始化向量 private static byte[] DESIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; #region DESEnCode DES加密 public static string DESEnCode(string pToEncrypt, string sKey) { pToEncrypt = HttpContext.Current.Server.UrlEncode(pToEncrypt); DESCryptoServiceProvider des = new DESCryptoServiceProvider(); byte[] inputByteArray = Encoding.GetEncoding("UTF-8").GetBytes(pToEncrypt); //建立加密对象的密钥和偏移量 //原文使用ASCIIEncoding.ASCII方法的GetBytes方法 //使得输入密码必须输入英文文本 des.Key = ASCIIEncoding.ASCII.GetBytes(sKey); des.IV = ASCIIEncoding.ASCII.GetBytes(sKey); MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write); cs.Write(inputByteArray, 0, inputByteArray.Length); cs.FlushFinalBlock(); StringBuilder ret = new StringBuilder(); foreach (byte b in ms.ToArray()) { ret.AppendFormat("{0:X2}", b); } ret.ToString(); return ret.ToString(); } #endregion /// <summary> /// /// </summary> /// <param name="pToDecrypt"> 待解密的字符串</param> /// <param name="sKey"> 解密密钥,要求为8字节,和加密密钥相同</param> /// <returns>解密成功返回解密后的字符串,失败返源串</returns> #region DESDeCode DES解密 public static string DESDeCode(string pToDecrypt, string sKey) { // HttpContext.Current.Response.Write(pToDecrypt + "<br>" + sKey); // HttpContext.Current.Response.End(); DESCryptoServiceProvider des = new DESCryptoServiceProvider(); byte[] inputByteArray = new byte[pToDecrypt.Length / 2]; for (int x = 0; x < pToDecrypt.Length / 2; x++) { int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16)); inputByteArray[x] = (byte)i; } des.Key = ASCIIEncoding.ASCII.GetBytes(sKey); des.IV = ASCIIEncoding.ASCII.GetBytes(sKey); MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write); cs.Write(inputByteArray, 0, inputByteArray.Length); cs.FlushFinalBlock(); StringBuilder ret = new StringBuilder(); return HttpContext.Current.Server.UrlDecode(System.Text.Encoding.Default.GetString(ms.ToArray())); } #endregion }



我找了很多php加密的,结果出来都是不一样,求教大伙了,谢谢!!!

下面是找的php的2个des加密解密
1.
PHP code
$key = '12345678';//密钥$iv = mcrypt_create_iv(mcrypt_get_block_size(MCRYPT_TripleDES, MCRYPT_MODE_CBC), MCRYPT_DEV_RANDOM );function encrypt($input,$key,$iv) { $enc=mcrypt_cbc (MCRYPT_TripleDES, $key, $input, MCRYPT_ENCRYPT, $iv); return base64_encode($enc);}function decrypt($encrypted,$key,$iv) { $encrypted = trim(base64_decode($encrypted)); $dec = mcrypt_cbc (MCRYPT_TripleDES, $key, $encrypted, MCRYPT_DECRYPT, $iv); return $enc;}


2.
PHP code
<?phpclass DES{ var $key; function DES($key) { $this->key = $key; } function encrypt($input) { $size = mcrypt_get_block_size('des','ecb'); $input = $this->pkcs5_pad($input, $size); $key = $this->key; $td = mcrypt_module_open('des', '', 'ecb', ''); $iv = @mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND); @mcrypt_generic_init($td, $key, $iv); $data = mcrypt_generic($td, $input); mcrypt_generic_deinit($td); mcrypt_module_close($td); $data = base64_encode($data); return $data; } function decrypt($encrypted) { $encrypted = base64_decode($encrypted); $key =$this->key; $td = mcrypt_module_open('des','','ecb',''); //使用MCRYPT_DES算法,cbc模式 $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND); $ks = mcrypt_enc_get_key_size($td); @mcrypt_generic_init($td, $key, $iv); //初始处理 $decrypted = mdecrypt_generic($td, $encrypted); //解密 mcrypt_generic_deinit($td); //结束 mcrypt_module_close($td); $y=$this->pkcs5_unpad($decrypted); return $y; } function pkcs5_pad ($text, $blocksize) { $pad = $blocksize - (strlen($text) % $blocksize); return $text . str_repeat(chr($pad), $pad); } function pkcs5_unpad($text) { $pad = ord($text{strlen($text)-1}); if ($pad > strlen($text)) { return false; } if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) { return false; } return substr($text, 0, -1 * $pad); }}?>
  
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
回复次数:10
  • coolesting用户头像
  • coolesting
  • (骄傲青蛙)
  • 等 级:
  • 2

    2

#1楼 得分:20回复于:2010-04-01 18:57:37
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
精华推荐:新手如何学习php提高php的一些建议
  • s777n用户头像
  • s777n
  • (六卖神剑)
  • 等 级:

#2楼 得分:0回复于:2010-04-02 08:40:21
只要两个的加密解密结果一致就成。
例如:
12345678910 加密:E7D3EBBA60A79D27566692F290929988
E7D3EBBA60A79D27566692F290929988 解密: 12345678910

我查的php的mcrypt文档的例子,没有能和这个结果一致的例子。


谢谢大家
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
精华推荐:php实现验证码识别-中级篇
  • s777n用户头像
  • s777n
  • (六卖神剑)
  • 等 级:

#3楼 得分:0回复于:2010-04-02 12:55:46
搞定,唉…… 就是这么简单。。。

PHP code
<?phpclass DES{ var $key; var $iv; function DES($key) { $this->key = $key; $this->iv = $key; } function encrypt($str) { return strtoupper(bin2hex(mcrypt_cbc(MCRYPT_DES, $this->key, $str, MCRYPT_ENCRYPT, $this->iv))); } function decrypt($str) { $strBin = $this->hex2bin(strtolower($str)); $str = mcrypt_cbc(MCRYPT_DES, $this->key, $strBin, MCRYPT_DECRYPT, $this->iv); return $str; } function hex2bin($hexData) { $binData = ""; for($i = 0; $i < strlen ( $hexData ); $i += 2) { $binData .= chr ( hexdec ( substr ( $hexData, $i, 2 ) ) ); } return $binData; }}?>
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
精华推荐:share一段采集程序的代码,顺便散分
  • s777n用户头像
  • s777n
  • (六卖神剑)
  • 等 级:

#4楼 得分:0回复于:2010-04-02 13:47:14
还不行。貌似还要补位。
再找找再来结贴
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
精华推荐:新手如何学习php提高php的一些建议
  • coolesting用户头像
  • coolesting
  • (骄傲青蛙)
  • 等 级:
  • 2

    2

#5楼 得分:40回复于:2010-04-02 20:57:11
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
精华推荐:php实现验证码识别-中级篇
  • wangzhen47337用户头像
  • wangzhen47337
  • (追求梦想)
  • 等 级:

#6楼 得分:40回复于:2010-04-05 12:56:55
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • s777n用户头像
  • s777n
  • (六卖神剑)
  • 等 级:

#7楼 得分:0回复于:2010-04-06 10:58:20
可以了,貌似只能回复3次。我已经不能回复了。

PHP code
<?phpclass DES{ var $key; var $iv; //偏移量 function DES( $key, $iv=0 ) { //key长度8例如:1234abcd $this->key = $key; if( $iv == 0 ) { $this->iv = $key; //默认以$key 作为 iv } else { $this->iv = $iv; //mcrypt_create_iv ( mcrypt_get_block_size (MCRYPT_DES, MCRYPT_MODE_CBC), MCRYPT_DEV_RANDOM ); } } function encrypt($str) { //加密,返回大写十六进制字符串 $size = mcrypt_get_block_size ( MCRYPT_DES, MCRYPT_MODE_CBC ); $str = $this->pkcs5Pad ( $str, $size ); return strtoupper( bin2hex( mcrypt_cbc(MCRYPT_DES, $this->key, $str, MCRYPT_ENCRYPT, $this->iv ) ) ); } function decrypt($str) { //解密 $strBin = $this->hex2bin( strtolower( $str ) ); $str = mcrypt_cbc( MCRYPT_DES, $this->key, $strBin, MCRYPT_DECRYPT, $this->iv ); $str = $this->pkcs5Unpad( $str ); return $str; } function hex2bin($hexData) { $binData = ""; for($i = 0; $i < strlen ( $hexData ); $i += 2) { $binData .= chr ( hexdec ( substr ( $hexData, $i, 2 ) ) ); } return $binData; } function pkcs5Pad($text, $blocksize) { $pad = $blocksize - (strlen ( $text ) % $blocksize); return $text . str_repeat ( chr ( $pad ), $pad ); } function pkcs5Unpad($text) { $pad = ord ( $text {strlen ( $text ) - 1} ); if ($pad > strlen ( $text )) return false; if (strspn ( $text, chr ( $pad ), strlen ( $text ) - $pad ) != $pad) return false; return substr ( $text, 0, - 1 * $pad ); } }?>


测试:
PHP code
$str = "test string";$key = '12341234';$crypt = new DES($key);$mstr = $crypt->encrypt($str);echo "[ $str ]加密:[ $mstr ]<br>";$str = $crypt->decrypt($mstr);echo "[ $mstr ]解密:[ $str ]<br>";

 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • s777n用户头像
  • s777n
  • (六卖神剑)
  • 等 级:

#8楼 得分:0回复于:2010-04-06 11:04:25
嗯哼,是一天内不能回复3次吧。 :(

我也是菜鸟,最后解决看上楼,希望对楼上哥们有帮助。
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • ygxx用户头像
  • ygxx
  • (ShrimpN)
  • 等 级:

#9楼 得分:0回复于:2011-06-26 17:01:35
非常感谢!
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • kndyking用户头像
  • kndyking
  • (kndyking)
  • 等 级:

#10楼 得分:0回复于:2011-07-27 16:45:09
php这边当如何解密????

以下是C#加解密:

using System;
using System.Security.Cryptography;
using System.IO;

namespace fseip.App_Code
{
/// <summary>
/// DESEncode 的摘要说明。
/// </summary>
public class DESEncode
{
/// <summary>
/// 字串加密
/// </summary>
/// <param name="strText">需要加密的文本内容</param>
/// <returns>加密后的密文</returns>
public string Encrypt(string strText)
{
string strEncrKey="FSOA's key";
Byte[] byKey = {};
Byte[] IV = {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF};
try
{
byKey = System.Text.Encoding.UTF8.GetBytes(strEncrKey.Substring(0, 8));
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
Byte[] inputByteArray = System.Text.Encoding.UTF8.GetBytes(strText);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(byKey, IV), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
return Convert.ToBase64String(ms.ToArray());
}
catch(Exception ex)
{
return ex.Message;
}

}

/// <summary>
/// 字串解密
/// </summary>
/// <param name="strText">需解密的密文</param>
/// <returns>解密出来的原文</returns>
public string Decrypt(string strText)
{
string strDecrKey="FSOA's key";
Byte[] byKey = {};
Byte[] IV = {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF};
Byte[] inputByteArray = new byte[strText.Length];
try
{
byKey = System.Text.Encoding.UTF8.GetBytes(strDecrKey.Substring(0,8));
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
inputByteArray = Convert.FromBase64String(strText);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(byKey, IV), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
System.Text.Encoding encoding = System.Text.Encoding.UTF8;
return encoding.GetString(ms.ToArray());
}
catch(Exception ex)
{
return ex.Message;
}
}
}
}