本文目錄一覽:
用PHP的方法解DES加密
?php
$key =’LY870513′;
$ctext = ‘j45Rrzxm0jD62U1w798yBg==’;
$ptext = mcrypt_decrypt ( MCRYPT_DES, $key , base64_decode($ctext), MCRYPT_MODE_CBC, “\x12\x34\x56\120\x90\xab\xcd\xef”);
//echo iconv(‘UTF-8′,’GBK’,$ptext); //GBK環境使用,UTF8環境多餘不用
echo $ptext; //UTF8環境用
20219241337
由於不清楚原代碼的塊鏈接模式,暫時用的CBC,對於短數據可解出。
PHP常用加密解密方法
作者/上善若水
1.md5(string $str,bool $flag = false);
$flag = false 默認返回32位的16進至數據散列值
$flag = true 返回原始流數據
2.sha1($string,$flag = false)
$flag = false 默認返回40位的16進至數據散列值
true 返回原始流數據
3.hash(string $algo,srting $str,bool $flag);
$algo : 演算法名稱,可通過hash_algos()函數獲取所有hash加密的演算法
如:md5,sha1等,採用md5,sha1加密所得結果和1,2兩種方式結 果相同。
$flag = false 默認返回16進至的數據散列值,具體長度根據演算法不同
而不同。
true 返回原始流數據。
4.crypt(string $str,$string $salt);
函數返回使用 DES、Blowfish 或 MD5 演算法加密的字元串。
具體演算法依賴於PHP檢查之後支持的演算法和$salt的格式和長度,當 然具體結果也和操作系統有關。比較結果採用 hash_equals($crypted,crypt($input,$salt));//且salt值相同
Password_verify($str,$crypted);
5.password_hash ( string $str, integer $algo [, array $options ] )
函數返回哈希加密後的密碼字元串, password_hash() 是crypt()的 一個簡單封裝
$algo : 演算法 PASSWORD_DEFAULT ,PASSWORD_BCRYPT
$options = [
「cost」=10,//指明演算法遞歸的層數,
「salt」=「xxadasdsad」//加密鹽值,即將被遺 棄,採用系統自動隨機生成安全性更高
];
使用的演算法、cost 和鹽值作為哈希的一部分返回
Password_verify($str,$hashed);
6.base64_encode(string $str)
設計此種編碼是為了使二進位數據可以通過非純 8-bit 的傳輸層 傳輸,例如電子郵件的主體。base64_decode(string $encoded)
可以進行解碼;
7.mcrypt_encrypt ( string $cipher , string $key , string $data ,
string $mode [, string $iv ] )
mcrypt_decrypt ( string $cipher , string $key , string $crypted ,
string $mode [, string $iv ] )
$ciper:加密演算法,mcrypt_list_algorithms()可以獲取該函數所有支持的演算法
如MCRYPT_DES(「des」),MCRYPT_RIJNDAEL_128(「rijndael-128」);
$mode : 加密模式 ,mcrypt_list_modes()獲取所有支持的加密模式,ecb,cbc
$key: 加密的秘鑰,mcrypt_get_key_size ( string $cipher , string $mode )
獲取指定的演算法和模式所需的密鑰長度。$key要滿足這個長度,如果長 度無效會報出警告。
$iv : 加密的初始向量,可通過mcrypt_create_iv ( int $size [, int $source = MCRYPT_DEV_URANDOM ] ),
Iv的參數size:
通過mcrypt_get_iv_size ( string $cipher , string $mode )獲取
Iv 的參數source:
初始向量數據來源。可選值有: MCRYPT_RAND (系統隨機數生成 器), MCRYPT_DEV_RANDOM (從 /dev/random 文件讀取數據) 和 MCRYPT_DEV_URANDOM (從 /dev/urandom 文件讀取數據)。 在 Windows 平台,PHP 5.3.0 之前的版本中,僅支持 MCRYPT_RAND。
請注意,在 PHP 5.6.0 之前的版本中, 此參數的默認值 為 MCRYPT_DEV_RANDOM。
Note: 需要注意的是,如果沒有更多可用的用來產生隨機數據的信息, 那麼 MCRYPT_DEV_RANDOM 可能進入阻塞狀態。
$data : 要加密的字元串數據
如何用php實現和c#一致的DES加密解密
PHP實現和c#一致的DES加密解密,可以從網上搜到一大堆,但是測試後發現都沒法用。以下正確代碼是我經過苦苦才找到的。希望大家在系統整合時能用的上。
注意:key的長度為8位以內。
[csharp] view plain copy print?
//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] view plain copy print?
?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 );
}
}
?
des加密演算法
des加密演算法如下:
一、DES加密演算法簡介
DES(Data Encryption Standard)是目前最為流行的加密演算法之一。DES是對稱的,也就是說它使用同一個密鑰來加密和解密數據。
DES還是一種分組加密演算法,該演算法每次處理固定長度的數據段,稱之為分組。DES分組的大小是64位,如果加密的數據長度不是64位的倍數,可以按照某種具體的規則來填充位。
從本質上來說,DES的安全性依賴於虛假表象,從密碼學的術語來講就是依賴於「混亂和擴散」的原則。混亂的目的是為隱藏任何明文同密文、或者密鑰之間的關係,而擴散的目的是使明文中的有效位和密鑰一起組成儘可能多的密文。兩者結合到一起就使得安全性變得相對較高。
DES演算法具體通過對明文進行一系列的排列和替換操作來將其加密。過程的關鍵就是從給定的初始密鑰中得到16個子密鑰的函數。要加密一組明文,每個子密鑰按照順序(1-16)以一系列的位操作施加於數據上,每個子密鑰一次,一共重複16次。每一次迭代稱之為一輪。要對密文進行解密可以採用同樣的步驟,只是子密鑰是按照逆向的順序(16-1)對密文進行處理。
二、DES加密演算法加密原理
DES是採用分組加密。使用64位的分組長度和56位的密鑰長度,將64位的輸入經過一系列變換得到64位的輸出。DES演算法利用多次組合替代演算法和換位演算法,通過混淆和擴散的相互作用,把明文編輯成密碼強度很高的密文。解密則使用了相同的步驟和相同的密鑰。
64位數據為一組進行加密;
初始置換根據一張8*8的置換表,將64位的明文打亂
與56位的密鑰經16輪次迭代運算形成的初始密文
最後經過初始逆置換得到分組的最終密文
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/258484.html