加密解密的时候如果只传一个key值那么向量值默认跟key值一样
c#中实现加密和解密的类
Des.csusingSystem;
usingSystem.IO;
usingSystem.Security.Cryptography;
usingSystem.Text;
namespaceAnk.Class
{
classDes
{
加解密密钥
//privatestaticstringskey="12345678";
初始化向量
//privatestaticbyte[]DESIV={0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF};
#regionDESEnCodeDES加密
publicstaticstringEnCode(stringpToEncrypt,stringsKey,stringsIv=null)
{
try
{
if(sKey.Length
{
sKey=sKey.PadRight(8,'0');
}
else
{
sKey=sKey.Substring(0,8);
}
if(sIv==null)
{
sIv=sKey;
}
DESCryptoServiceProviderdes=newDESCryptoServiceProvider();
byte[]inputByteArray=Encoding.GetEncoding("UTF-8").GetBytes(pToEncrypt);
//建立加密对象的密钥和偏移量
//原文使用ASCIIEncoding.ASCII方法的GetBytes方法
//使得输入密码必须输入英文文本
des.Key=Encoding.ASCII.GetBytes(sKey);
des.IV=Encoding.ASCII.GetBytes(sKey);
MemoryStreamms=newMemoryStream();
CryptoStreamcs=newCryptoStream(ms,des.CreateEncryptor(),CryptoStreamMode.Write);
cs.Write(inputByteArray,0,inputByteArray.Length);
cs.FlushFinalBlock();
StringBuilderret=newStringBuilder();
foreach(bytebinms.ToArray())
{
ret.AppendFormat("{0:X2}",b);
}
returnret.ToString();
}
catch(Exceptionex)
{
Console.WriteLine(ex.Message);
return"";
}
}
#endregion
///pToDecrypt待解密的字符串
///sKey解密密钥,要求为8字节,和加密密钥相同
///returns解密成功返回解密后的字符串,失败返源串
#regionDESDeCodeDES解密
publicstaticstringDeCode(stringpToDecrypt,stringsKey,stringsIv=null)
{
try
{
if(sKey.Length
{
sKey=sKey.PadRight(8,'0');
}
else
{
sKey=sKey.Substring(0,8);
}
if(sIv==null)
{
sIv=sKey;
}
DESCryptoServiceProviderdes=newDESCryptoServiceProvider();
byte[]inputByteArray=newbyte[pToDecrypt.Length/2];
for(intx=0;x
{
inti=(Convert.ToInt32(pToDecrypt.Substring(x*2,2),16));
inputByteArray[x]=(byte)i;
}
des.Key=ASCIIEncoding.ASCII.GetBytes(sKey);
des.IV=ASCIIEncoding.ASCII.GetBytes(sKey);
MemoryStreamms=newMemoryStream();
CryptoStreamcs=newCryptoStream(ms,des.CreateDecryptor(),CryptoStreamMode.Write);
cs.Write(inputByteArray,0,inputByteArray.Length);
cs.FlushFinalBlock();
StringBuilderret=newStringBuilder();
returnSystem.Text.Encoding.Default.GetString(ms.ToArray());
}
catch(Exceptionex)
{
Console.WriteLine(ex.Message);
return"";
}
}
#endregion
}
}
php中进行加密解密的类classDES{
var$crypto=null;
var$key;
var$iv;//偏移量
functionDES($key,$iv=null){
//key长度8例如:1234abcd
$this->crypto=mcrypt_module_open(MCRYPT_DES,'',MCRYPT_MODE_CBC,'');
$key=substr($key,0,8);
if(is_null($iv)){
$this->iv=$key;//mcrypt_create_iv(mcrypt_enc_get_iv_size($this->crypto),MCRYPT_DEV_URANDOM);
}else{
$this->iv=$iv;
}
$this->key=$key;
}
functionencrypt($str){
//加密,返回大写十六进制字符串
$size=mcrypt_get_block_size(MCRYPT_DES,MCRYPT_MODE_CBC);
$str=$this->pkcs5Pad($str,$size);
mcrypt_generic_init($this->crypto,$this->key,$this->iv);
$enc_question=mcrypt_generic($this->crypto,$str);
mcrypt_generic_deinit($this->crypto);
returnstrtoupper(bin2hex($enc_question));
}
functiondecrypt($str){
//解密
$strBin=$this->hex2bin(strtolower($str));
mcrypt_generic_init($this->crypto,$this->key,$this->iv);
$str=mdecrypt_generic($this->crypto,$strBin);
mcrypt_generic_deinit($this->crypto);
$str=$this->pkcs5Unpad($str);
return$str;
}
functionhex2bin($hexData){
$binData="";
for($i=0;$i
$binData.=chr(hexdec(substr($hexData,$i,2)));
}
return$binData;
}
functionpkcs5Pad($text,$blocksize){
$pad=$blocksize-(strlen($text)%$blocksize);
return$text.str_repeat(chr($pad),$pad);
}
functionpkcs5Unpad($text){
$pad=ord($text{strlen($text)-1});
if($pad>strlen($text)){
returnfalse;
}
if(strspn($text,chr($pad),strlen($text)-$pad)!=$pad){
returnfalse;
}
returnsubstr($text,0,-1*$pad);
}
function__destruct(){
//mcrypt_generic_deinit($this->crypto);
mcrypt_module_close($this->crypto);
}
}
$str="teststring";
$key='123412349';
$crypt=newDES($key);
$mstr=$crypt->encrypt($str);
echo"[$str]加密:[$mstr]
";
$str=$crypt->decrypt($mstr);
echo"[$mstr]解密:[$str]
";