大佬教程收集整理的这篇文章主要介绍了php实现和c#一致的DES加密解密实例,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
php实现和c#一致的DES加密解密,可以从网上搜到一大堆,但是测试后发现都没法用。以下正确代码是我经过苦苦才找到的。希望大家在系统整合时能用的上。
注意:key的长度为8位以内。
#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,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,inputByteArray.Length);
cs.FlushFinalBlock();
StringBuilder ret = new StringBuilder();
return httpContext.Current.Server.UrlDecode(System.Text.Encoding.Default.GetString(ms.ToArray()));
}
}
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,$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,- 1 * $pad );
}
}
?>
以上这篇php实现和c#一致的DES加密解密实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持菜鸟教程。
以上是大佬教程为你收集整理的php实现和c#一致的DES加密解密实例全部内容,希望文章能够帮你解决php实现和c#一致的DES加密解密实例所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。