當前位置:編程學習大全網 - 源碼下載 - 如何用php實現和c#壹致的DES加密解密

如何用php實現和c#壹致的DES加密解密

PHP實現和c#壹致的DES加密解密,可以從網上搜到壹大堆,但是測試後發現都沒法用。以下正確代碼是我經過苦苦才找到的。希望大家在系統整合時能用的上。

註意:key的長度為8位以內。

[csharp]?view?plain?copy?print?

//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]?view?plain?copy?print?

<?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?);?

}?

}?

>

  • 上一篇:自家菜園子種植的茄子開花多,結果少,這是土地的問題嗎?
  • 下一篇:如何設置兩臺電腦(Windows7系統)聯網(兩地同壹個城市)以便互相訪問和共享?謝謝妳的建議。
  • copyright 2024編程學習大全網