php如何openssl encrypt加密解密

2021-09-05 01:24:57 字數 3655 閱讀 8275

一、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...