des 加解密

要和别的系统通讯,那边是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
            
            
<? php class 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 ); } } ?>
 
 
#1楼 得分:20回复于:2010-04-01 18:57:37
 
  • s777n用户头像
  • s777n
  • (六卖神剑)
  • 等 级:

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

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


谢谢大家
 
  • s777n用户头像
  • s777n
  • (六卖神剑)
  • 等 级:

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

PHP code
            
            
<? php class 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 ; } } ?>
 
  • s777n用户头像
  • s777n
  • (六卖神剑)
  • 等 级:

#4楼 得分:0回复于:2010-04-02 13:47:14
还不行。貌似还要补位。
再找找再来结贴
 
#5楼 得分:40回复于:2010-04-02 20:57:11
 
#6楼 得分:40回复于:2010-04-05 12:56:55
 
  • s777n用户头像
  • s777n
  • (六卖神剑)
  • 等 级:

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

PHP code
            
            
<? php class 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> " ;

 
  • s777n用户头像
  • s777n
  • (六卖神剑)
  • 等 级:

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

我也是菜鸟,最后解决看上楼,希望对楼上哥们有帮助。
 
  • ygxx用户头像
  • ygxx
  • (ShrimpN)
  • 等 级:

#9楼 得分:0回复于:2011-06-26 17:01:35
非常感谢!
 
#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;
}
}
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值