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