>  기사  >  백엔드 개발  >  PHP와 C# 간에 일관된 DES 암호화 및 암호 해독 알고리즘 클래스

PHP와 C# 간에 일관된 DES 암호화 및 암호 해독 알고리즘 클래스

WBOY
WBOY원래의
2016-07-29 09:04:15918검색

DES 암호화 및 복호화 알고리즘은 C# 및 PHP의 공통 클래스입니다.

참고:

1. 클래스의 비밀 키와 벡터 iv는 동일한 값을 사용합니다.

2. 인코딩은 utf-8을 사용합니다

다음은 실제 테스트를 위해 직접 복사할 수 있는 특정 코드입니다

C# 버전 코드:

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;  

//C# 版DES 加解密算法类
public class Des{   
    //加解密密钥
    private static  string skey = "12345678";
	
	#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);   
    
		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  
	
	#region DESDeCode DES解密
	public static string DESDeCode(string pToDecrypt, string sKey)
	{
		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
//PHP 版DES 加解密算法类
class DES {
	var $key;
	var $iv; //偏移量
	
	function DES($key) {
		//key长度为8位,例如:1234abcd
		$this->key = $key;
		$this->iv = $key; //默认以$key 作为 iv
	}
	
	//加密
	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 );
	}
}

header("Content-type: text/html; charset=utf-8");
$key = '12345678';
$str = 'abc.123';
$des = new DES($key);
$str_en_des = $des->encrypt($str); //加密字符串
$str_de_des = $des->decrypt($str_en_des); //解密字符串
echo '加密字符串:',$str,'<br>';
echo '加密秘钥key:',$key,'<br><br>';
echo '加密后字符串:',$str_en_des,'<br>';
echo '解密后字符串:',$str_de_des,'<br>';

?>

코드는 온라인 검색을 통해 편집되었습니다. 블로그 게시물에 특별한 감사를 드립니다: http://blog.csdn.net/e421083458/article/details/39373815

위 내용은 관련 내용을 포함하여 PHP 및 C#과 일치하는 DES 암호화 및 복호화 알고리즘 클래스를 소개하고 있으며, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.