PHP实现和c#一致的DES加密解密,可以从网上搜到一大堆,但是测试后发现都没法用。以下正确代码是我经过苦苦才找到的。希望大家在系统整合时能用的上。
注意:key的长度为8位以内。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
//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
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
<?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实现和c#一致的DES加密解密实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。