1. 程式人生 > >PHP7+中AES加密解密方法,openssl 替代 mcrypt

PHP7+中AES加密解密方法,openssl 替代 mcrypt

mcrypt十年過去,現在php7+中已經開始淘汰。官方給出掉提示:

mcrypt_get_block_size — 獲得加密演算法的分組大小

Warning
This function has been DEPRECATED as of PHP 7.1.0. Relying on this function is highly discouraged.

在php7中需要openssl替代,這裡需要注意的是:
在mcrypt中對加密key長度沒有限制要求,傳入多少長度都會參加加密,但是在openssl_encrypt中。key長度只能是16長度,>16長度後,簽名結果保持不變,這裡是哥坑,在替代方案測試時候容易出錯,具體直接上程式碼對比

低於php7版本程式碼

class AES {
    public static function encrypt($input,$key) {
        $blockSize = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
        $paddedData = static::pkcs5_pad($input, $blockSize);
        $ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
        $iv
= mcrypt_create_iv($ivSize, MCRYPT_RAND); $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $paddedData, MCRYPT_MODE_ECB, $iv); return bin2hex($encrypted); } private static function pkcs5_pad ($text, $blocksize) { $pad = $blocksize - (strlen($text) % $blocksize
); return $text . str_repeat(chr($pad), $pad); } public static function decrypt($sStr,$key) { $decrypted= mcrypt_decrypt( MCRYPT_RIJNDAEL_128, $key, hex2bin($sStr), MCRYPT_MODE_ECB ); $dec_s = strlen($decrypted); $padding = ord($decrypted[$dec_s-1]); $decrypted = substr($decrypted, 0, -$padding); return $decrypted; } /** *url 安全的base64編碼 sunlonglong */ function base64url_encode($data) { return rtrim(strtr(base64_encode($data), '+/', '-_'), '='); } /** *url 安全的base64解碼 sunlonglong */ function base64url_decode($data) { return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT)); } } $key = 'g87y65ki6e8p93av8zjdrtfdrtgdwetd'; $encrypt = AES::encrypt('123abc',$key); $decrypt = AES::decrypt($encrypt,$key); var_dump($encrypt,$decrypt); 加密結果: da07f6363eb0024b4bdd264e5fd4a2f5

下面是php7以上。使用openssl加密:

class AES {

    /**
     *
     * @param string $string 需要加密的字串
     * @param string $key 金鑰
     * @return string
     */
    public static function encrypt($string, $key)
    {

        // openssl_encrypt 加密不同Mcrypt,對祕鑰長度要求,超出16加密結果不變
        $data = openssl_encrypt($string, 'AES-128-ECB', $key, OPENSSL_RAW_DATA);

        $data = strtolower(bin2hex($data));

        return $data;
    }


    /**
     * @param string $string 需要解密的字串
     * @param string $key 金鑰
     * @return string
     */
    public static function decrypt($string, $key)
    {
        $decrypted = openssl_decrypt(hex2bin($string), 'AES-128-ECB', $key, OPENSSL_RAW_DATA);

        return $decrypted;
    }
}


$encrypt = AES::encrypt('123abc', 'g87y65ki6e8p93av8zjdrtfdrtgdwetd');
$decrypt = AES::decrypt($encrypt, 'g87y65ki6e8p93av8zjdrtfdrtgdwetd');
var_dump($encrypt,$decrypt);die;

加密結果:
8c927c42f93a83c5de763aa18e4e6c7d

雖然key長度32位,但是openssl_encrypt加密時候,key長度只使用了16長度,後面未參加簽名,而mcrypt_encrypt會整個key參與加密,這樣就會出現加密出來對結果不一致。造成困惑,key=g87y65ki6e8p93av8zjdrtfdrtgdwetd與key=g87y65ki6e8p93av結果都是一致對

相關推薦

PHP7+AES加密解密方法,openssl 替代 mcrypt

mcrypt十年過去,現在php7+中已經開始淘汰。官方給出掉提示: mcrypt_get_block_size — 獲得加密演算法的分組大小 Warning This function has been DEPRECATED as of PHP 7.1

PHP7.2AES加密解密方法mcrypt_module_open()替換方案

直接粘程式碼,該類是基於微信公眾號訊息加密解密所提供的PHP DEMO改造而來,目前使用於彬彬大學APP介面token校驗中。php的mcrypt 擴充套件已經過時了大約10年,並且用起來很複雜。因此它被廢棄並且被 OpenSSL 所取代。 從PHP 7.2起它將被從核心程式

C#AES256加密解密方法

/// <summary>         /// AES加密         /// </summary>         /// <param n

PHPAES加密解密

我們在工作中會遇到各種加密,下面就是PHP中AES加密解密的類 <?php  class Aes {     /**      * var string&nbs

C#開發常用加密解密方法解析

一、MD5加密演算法 我想這是大家都常聽過的演算法,可能也用的比較多。那麼什麼是MD5演算法呢?MD5全稱是message-digest algorithm 5,簡單的說就是單向的加密,即是說無法根據密文推匯出明文。 MD5主要用途: 1、對一段資訊生成資訊摘要,該摘要對該資訊具有唯一性

AndroidAES加密解密。解決密文不唯一、解密不出明文問題

AES加密方式是目前來看值得選擇的加密方式,但是在Android中使用AES加密時,有些坑看似不大,卻讓很多人栽了跟頭。 Android 4.2之後SHA1PRNG強隨意種子演算法呼叫不同,需要區別呼叫,這個你造嗎。 下面貼出部分關鍵程式碼,程式碼與網路上普

PHP7——openssl函式替換mcrypt函式加密解密方法

最近專案的php版本需要升級到php7,但是專案裡遺留了很多廢棄函式,其中比較“難纏”的就是mcrypt函式的替代方法了,找了很久,終於有了解決方法。 官方:mcrypt 擴充套件已經過時了大約

AES加密解密 Java運用

upper span pub substring rac ont wid mem log AES全稱 Advanced Encryption Standard, 高級加密算法,更加安全,可取代DES。 Aes: package com.blog.d201706.en

ruby 實現javaaes 加密解密

abcde class hwm nbsp crypt 實現 () cbc sad def aes_encrypt() cipher = OpenSSL::Cipher::AES.new(128, :CBC) cipher.encrypt cipher.key =

php aes加密解密類(兼容php5、php7

bytes pri rip dom ase lee vat idea cipher <?php /** * @desc:php aes加密解密類 * @author [Lee] <[<[email protected]>]> */ class

golangAes加密方法

因專案中go程式與java程式需要傳輸一些加密資料,以下為整理後的Aes(CBC模式)加密解密方法,因java中aes所用的填充演算法為PKCS5padding(具體內容可自行查閱),所以在本示例中也採用PKCS5padding package encrypt impor

python 的一些加密解密方法

因為遇到了加密解密的問題,翻看了一些關於此的博文,所以想在粗略的學習後記錄下來,回顧以前並且加深印象。在以後的學習中再精細的雕琢。 基礎的MD5加密 MD5 是一種單向加密技術(不

windows使用Python進行AES加密解密-加密解密功能實現

PyCrypto是一款非常實用的Python加密模組,最近寫了一個檔案加密指令碼需要用到AES加密(http://blog.csdn.net/u013578500/article/details/77916990),和大家分析一下心得。 下載與安裝:PyCrypto專案

PHP正確進行AES加密解密方法

廢話不多說,直接上程式碼 <?php namespace Aes; class Aes { /** * var string $method 加解密方法,可通過openssl_get_cipher_methods()獲得 */

基於PHP和JS的AES相互加密解密方法詳解

原地址 :https://blog.csdn.net/zhihua_w/article/details/79388297 下載地址:https://download.csdn.net/download/weixin_38615720/10908675   在最近的專案中,

windows使用Python進行AES加密解密-文字檔案加密工具

之前的文章http://blog.csdn.net/u013578500/article/details/77905924 簡單介紹了一下使用PyCrypto模組實現對字串的加密解密,裡面有提到我利用這個模組寫了一個對文字檔案進行加密解密的小指令碼,這裡和大家分享一下。 1

C#使用DES和AES加密解密

程式碼Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->using System; using System.Text;

OpensslAES解密——CBC模式

因工作需要接觸了一端是見AES,一些需要注意的地方提醒一下新手,少走一些彎路(個人開發遇到的問題,不對專業名詞進行解釋)。本人C++開發,所以此文章傾向於C++。 使用Openssl實現的CBC的加解密,所需的Openssl庫、標頭檔案和封裝類見文章底部。 文章模組: 1、

OpenSSLAES加密的用法

使用API的時候,需要特別小心資料長度,我在初次使用的時候簡直被弄的暈頭轉向,遂作此文留個備忘。一般沒有指定長度的引數,預設都是16(AES_BLOCK_SIZE)個位元組。輸出資料的長度一般都是16位元組的倍數,否則會出現陣列越界訪問。 以下API中,e

c#base64加密解密

stat mon 註意 pac enc return mba try encode using System; using System.Text; namespace Common { /// <summary> /// 實現Base64加密解密 ///