一、des介紹
des 是對稱性加密裡面常見一種,全稱為 data encryption standard,即資料加密標準,是一種使用金鑰加密的塊演算法。金鑰長度是64位(bit),超過位數金鑰被忽略。所謂對稱性加密即加密和解密金鑰相同,對稱性加密一般會按照固定長度,把待加密字串分成塊,不足一整塊或者剛好最後有特殊填充字元。
跨語言做 des 加密解密經常會出現問題,往往是填充方式不對、編碼不一致或者加密解密模式沒有對應上造成。
常見的填充模式有: pkcs5、pkcs7、iso10126、ansix923、zero。
加密模式有:des-ecb、des-cbc、des-ctr、des-ofb、des-cfb。
加密用到的方法:
openssl_encrypt($data, $method, $password, $options, $iv)
引數說明:
$data 加密明文
$method 加密方法
des-ecb
des-cbc
des-ctr
des-ofb
des-cfb
$passwd 加密金鑰[密碼]
$options 資料格式選項(可選)【選項有:】
0openssl_raw_data=1
openssl_zero_padding=2
openssl_no_padding=3
$iv 密初始化向量(可選)
需要注意:如果method為des−ecb,則
method為des−ecb,則iv無需填寫
二、解密用到的方法:
openssl_decrypt($data, $method, $password, $options, $iv)
引數說明:
$data 要解密的資料
其他引數同加密方法
三、用法案例:
引數:$data = '1234567887654321';//加密明文
$method = 'des-ecb';//加密方法
$passwd = '12344321';//加密金鑰
$options = 0;//資料格式選項(可選)
$iv = '';//加密初始化向量(可選)12
345(1) 預設填充方式:
加密:$result = openssl_encrypt($data, $method, $passwd, $options);
var_dump($result);12
結果:string(32) "kqyodswcm9i5elv2wdjucplqagqdnqxg"1解密
$result = 'kqyodswcm9i5elv2wdjucplqagqdnqxg';
var_dump(openssl_decrypt($result, $method, $passwd, 0));12
結果:string(16) "1234567887654321"
1(2) openssl_raw_data方式【會用pkcs#7進行補位】
加密$result = openssl_encrypt($data, $method, $passwd, openssl_raw_data);
var_dump($result);12
結果:string(24) "�v���9z[���nr�j �6��"
我們可以看到結果是亂碼的,這時我們需要base64一下
$result = openssl_encrypt($data, $method, $passwd, openssl_raw_data);
var_dump(base64_encode($result));12
這時結果是
string(32) "kqyodswcm9i5elv2wdjucplqagqdnqxg"
解密result = openssl_encrypt($data, $method, $passwd, openssl_raw_data);
var_dump(openssl_decrypt($result, $method, $passwd,openssl_raw_data));12
3結果:
string(16) "1234567887654321"
我們可以看到:預設填充方式與openssl_raw_data,這兩種方式加密結果是一樣的
(3) openssl_zero_padding方式
看字面意思,是用0填充,但是測試並不起作用
加密$result = openssl_encrypt($data, $method, $passwd, openssl_zero_padding);
var_dump($result);12
結果:string(24) "kqyodswcm9i5elv2wdjucg=="
解密:$result = openssl_encrypt($data, $method, $passwd, openssl_zero_padding);
var_dump(openssl_decrypt($result, $method, $passwd,openssl_zero_padding));12
結果:string(16) "1234567887654321"
(4) openssl_no_padding【不填充,需要手動填充】
在openssl_encrypt前加上填充過程
加密$str_padded = $data;
if (strlen($str_padded) % 16)
$result = openssl_encrypt($str_padded, $method, $passwd, openssl_no_padding);
var_dump($result);
echo '
';var_dump( base64_encode($result));12
3456
78結果:string(16) "�v���9z[���nr"
string(24) "kqyodswcm9i5elv2wdjucg=="12
我們可以看到結果是加密的亂碼,需要用base64一下,就可以看到結果了
解密://加密begin
$str_padded = $data;
if (strlen($str_padded) % 16)
$result = openssl_encrypt($str_padded, $method, $passwd, openssl_no_padding);
//加密end
//解密begin
$str = base64_encode($result);
$m = openssl_decrypt( base64_decode($str) , $method, $passwd, openssl_no_padding);
var_dump( rtrim( rtrim( $m,chr(0) ), chr(7) ) );
//解密 end12
3456
78910
1112
結果:string(16) "1234567887654321"
1** 結尾要去除填充字元』\0』和』\a』。
『\a』是為了相容用openssl_raw_data加密的結果。 **
參照的文件有:
php 基礎篇 - php 中 des 加解密詳解
關於mcrypt_encrypt和openssl_encrypt加密結果不一致的解決
php如何獲得編碼 php如何轉編碼
php轉編碼的實現方法 1 使用iconv函式轉換目標編碼,語法如 iconv gbk utf 8 instr 2 通過mb convert encoding函式轉換編碼。在使用php處理字串時,我們經常會碰到字元編碼轉換的問題,你碰到過iconv轉換失敗嗎?發現問題時,網上搜了搜,才發現iconv...
php如何安裝補丁,php補丁如何安裝
安裝php補丁的方法 首先轉到php5.4源 的根目錄 然後執行 patch p0 path to patch.patch 最後編譯這個補丁版本的php即可。具體問題 我需要在php 中安裝此修補程式 我的php版本 5.4.10 安裝方法 必須先擁有原始檔和修補程式檔案,然後才能對其進行修補。很簡...
如何安裝php?
1.解壓apache檔案 2.進行註冊,寫位址,郵箱 3.下一步選擇typical 4.下一步隨意選個安裝路徑 5.解壓php檔案 6.把php.ini development檔案改為php.ini 7.在apache的模組中,conf檔案裡127行 loadmodule php5 module d...