php asp.net des,转DES的dotNet到php实现

C# DESCryptoServiceProvider php 2011年07月27日 星期三 11:35

using System;

using System.Text;

using System.Collections;

using System.IO;

using System.Security.Cryptography; namespace ConsoleApplication1     class Program         static string skey = "12345678";

static string str = "gg";

static string enstr = "D084F252A84AB151";         static void Main(string[] args)             Console.WriteLine(Decrypt(enstr, skey));//解密

Console.WriteLine(Encrypt(str,skey));//加密

}         public static string Encrypt(string pToEncrypt, string sKey)             DESCryptoServiceProvider des = new DESCryptoServiceProvider();

//把字符串放到byte数组中

//原来使用的UTF8编码,我改成Unicode编码了,不行

byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);

//byte[] inputByteArray=Encoding.Unicode.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);

//Write the byte array into the crypto stream

//(It will end up in the memory stream)

cs.Write(inputByteArray, 0, inputByteArray.Length);

cs.FlushFinalBlock();

//Get the data back from the memory stream, and into a string

StringBuilder ret = new StringBuilder();

foreach (byte b in ms.ToArray())                 //Format as hex

ret.AppendFormat("{0:X2}", b);             ret.ToString();

return ret.ToString();

}         public static string Decrypt(string pToDecrypt, string sKey)             DESCryptoServiceProvider des = new DESCryptoServiceProvider();             //Put the input string into the byte array

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

//Flush the data through the crypto stream into the memory stream

cs.Write(inputByteArray, 0, inputByteArray.Length);

cs.FlushFinalBlock();             //Get the decrypted data back from the memory stream

//建立StringBuild对象,CreateDecrypt使用的是流对象,必须把解密后的文本变成流对象

StringBuilder ret = new StringBuilder();             return System.Text.Encoding.Default.GetString(ms.ToArray());     } ///

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 );     $key = '12345678';

$crypt = new DES($key); $str = 'gg'; $p = $crypt->encrypt($str); echo "
";

echo $p; $p = $crypt->decrypt($p); echo "
";

echo $p;

?>

更多交流到提问网(shenzhidao.com)一起交流网络新技术。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值