要和别的系统通讯,那边是c#和java。 两个版本的加密解密都一致。
可我的php就是找不到一致的方法。
求教达人谢谢!
下面是C#的加密解密,还有我找到php的两个方法//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.$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
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.   

    简单的说,就是把C#代码翻译成PHP ?
      

  2.   

    只要两个的加密解密结果一致就成。
    例如:
    12345678910 加密:E7D3EBBA60A79D27566692F290929988
    E7D3EBBA60A79D27566692F290929988 解密: 12345678910我查的php的mcrypt文档的例子,没有能和这个结果一致的例子。
    谢谢大家
      

  3.   

    搞定,唉…… 就是这么简单
    <?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;
    }
    }
    ?>
      

  4.   

    可以了,貌似只能回复3次。我已经不能回复了。
    <?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 );
    }

    }
    ?>测试:$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>";
      

  5.   

    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;
    }
    }
    }
    }