php openssl加密解密

基本使用

代碼

<?php


/*
 *
Base64是MIME郵件中常用的編碼方式之一。
主要思想:
1 將輸入的字符串或數(shù)據(jù)編碼成只含有{'A'-'Z', 'a'-'z', '0'-'9', '+', '/'}這64個(gè)可打印字符的串,故稱為“Base64”壕探。
編碼的方法:
2 將輸入數(shù)據(jù)流每次取6 bit谭网,用此6 bit的值(0-63)作為索引去查表十办,輸出相應(yīng)字符谴餐。這樣妙蔗,每3個(gè)字節(jié)將編碼為4個(gè)字符(3×8 → 4×6)蚕冬;不滿4個(gè)字符的以'='填充免猾。
 */


$config = array(
    "digest_alg"    => "sha512",
    "private_key_bits" => 2048,           //字節(jié)數(shù)  512 1024 2048  4096 等 ,不能加引號(hào),此處長(zhǎng)度與加密的字符串長(zhǎng)度有關(guān)系囤热,可以自己測(cè)試一下
    "private_key_type" => OPENSSL_KEYTYPE_RSA,   //加密類型
);
$resource = openssl_pkey_new($config);

//提取私鑰
openssl_pkey_export($resource, $privateKey);

//生成公鑰
$publicKey = openssl_pkey_get_details($resource)['key'];

echo '------------------創(chuàng)建私鑰---------------------' . PHP_EOL;
echo $privateKey.PHP_EOL;
echo '------------------創(chuàng)建公鑰---------------------' . PHP_EOL;
echo $publicKey.PHP_EOL;


// 加密后內(nèi)容含有特殊字符猎提,需編碼轉(zhuǎn)換

//從證書中提取公鑰
$publicKey = openssl_pkey_get_public($publicKey);
//從證書中提取私鑰
$privateKey = openssl_pkey_get_private($privateKey); // 提取成功返回資源標(biāo)識(shí),錯(cuò)誤返回false is_resource($publicKey)


//原始數(shù)據(jù)
$data = '{"name":"xiaoming","age":"23","address":"beijing"}';
//加密
$encrypted = "";
//解密
$decrypted = "";

echo '原始數(shù)據(jù):' . PHP_EOL . $data . PHP_EOL;

//私鑰加密,公鑰解密
echo '------------------私鑰加密,公鑰解密---------------------' . PHP_EOL;

//私鑰加密
openssl_private_encrypt($data, $encrypted, $privateKey);
//加密后內(nèi)容含有特殊字符,需編碼轉(zhuǎn)換
$encrypted = base64_encode($encrypted);
echo '私鑰加密:' . PHP_EOL, $encrypted . PHP_EOL;
//公鑰解密
openssl_public_decrypt(base64_decode($encrypted), $decrypted, $publicKey);
echo '公鑰解密:' . PHP_EOL, $decrypted . PHP_EOL;

//公鑰加密,私鑰解密
echo '------------------公鑰加密,私鑰解密---------------------' . PHP_EOL;

//加密后內(nèi)容含有特殊字符旁蔼,需編碼轉(zhuǎn)換
openssl_public_encrypt($data, $encrypted, $publicKey);


$encrypted = base64_encode($encrypted);
echo '公鑰加密:' . PHP_EOL, $encrypted . PHP_EOL;

openssl_private_decrypt(base64_decode($encrypted), $decrypted, $privateKey);//私鑰解密
echo '私鑰解密:' . PHP_EOL, $decrypted . PHP_EOL;

//釋放key關(guān)聯(lián)秘鑰
openssl_free_key($publicKey);
openssl_free_key($privateKey);


打印結(jié)果

------------------創(chuàng)建私鑰---------------------
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDde+MZc3GTeyfu
PPBDBrZBv9qiMHkpl2aLO25VmVilrjIvdFoGlLO15jqfWhzmPtIok7YY6aNV7CTU
iTW/QD8KRbsFQA0AnjN8iISosTMQ7I2cQ7DOUcuQ9ZJhCsH7JdmdZ9t6JA6epl0P
SL87LJwUP/F6yStFOpDZEnqhJe7KOImp/eKjq937yrLCTP1iPF4iUFhPwakN9cOn
LE44JBVPT/snjpyDlFZPti+suXLscd0Td6KQvGmCM3MpObDmEsTdHpSSc07yMiEP
ihx3DVoicJRjOHdgBwsNcxgPCXRTm3KZ9B1bt6aIEoHMVaWUAf64AMxEo5Wk6tuV
PKUY0QjlAgMBAAECggEBAMkGN9KS2GQupMh0IPIE9olos+z/qAka9KSstXEV9MKz
/7LYnRlaAF657z1REefc3uybXOzxqiFDaw5I1zKWAmG1dpDGWMbV0A9Y7WcbJilX
OxS4z5ID5YrViR1xIS1tZj2a1Tbf4TEX+GD1+zOfQq6Sdv+l9RMpm+yZ/Bmljz2U
MMDsfi4MV4Gtt76uMEJF+8xgBCBR+DANyyNxtVwUPJr0o8TjQPAu9bEh0fvIo4iG
2Bo7AvI3PoztUNMXrfsbqXmp8zkr94y1Lz3++uz3JFZTtoY5/8OMO/bP1MP3OsM3
n4KWiw3XbFAnkLmrob/T9jLkDe0T1rU7C7G91pjXvqUCgYEA9r8ymb/1UnrkpABp
TM1D+0SSDzBrjWJQ3a6FmmkHzdMTb1APjMD38i+jfWL+5h0u3tZ7mjqZvc1cDoUq
aSTl5hO/nRspXHI0JfedH+f2mR8u6VSgJxijCUyPiQ0WI4vxo/c8cx021fAPmswT
6elmK5qjxKs/SO9Sqg6RDTSLDUcCgYEA5copd7HcSDopR8jf64HC9qNin0g0UTEb
moIgZWVGPOSXwb+QJfCZ6aYUvX8mA2liz/Ws18E3WwX0ahVWJ3XNCUAUWUXBlG8t
sl0U7PrG7CFGY9oKJL576pGn92Z4CA66v3bHvJxkSfUC+ML2EkKeT+cP17t4S7k3
C5OVY4m2XnMCgYA5RfAM2A2tc3EW0DGg7hRVgnkUpXyReLykeBny2WZCVDgyoja5
ySDESmJ8fDoGV8fFWaufBPMip0Qy6p4JgdMLMJJNeTyEhM2t8me6PDF1IVPWPRpf
eMx/IBJBEZSN87HHCWAyqBlOV0aH+86zgMWCYYaZ49Xwq/xYFMF+ey+7iQKBgAgR
YgVW1FIg4KQplFsTckHwmJzZDyUuoTZ6jSKiPKYUrJNb43bBjNXcQ+wnU7FY+OQu
TwRAP25NtjgnSaAXDbzeaBh+T36jrKoPhJWRdHyD6pHE7Qg/O+CPfqM8EMjPo5Tn
Wbnwj8Dc/l63kaYweph5l1/OsDmQZjNc2ijlg+arAoGBAK7Re38ZEYtnC7MSLHIx
I7nJefrPw9SAkzkQ6CgH05hjwTXegM6f/c9pdg/qmA7cudNW1r9i6gRb+cp3ek18
tEuI9NjNzlkS7HT1CeV51rSc6QfOLfz2a7i0Co9nmzaP5JKXIgnUDh8mBLMjTRfU
NcQ17ebXueTF9MsgamrBt18S
-----END PRIVATE KEY-----

------------------創(chuàng)建公鑰---------------------
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3XvjGXNxk3sn7jzwQwa2
Qb/aojB5KZdmiztuVZlYpa4yL3RaBpSzteY6n1oc5j7SKJO2GOmjVewk1Ik1v0A/
CkW7BUANAJ4zfIiEqLEzEOyNnEOwzlHLkPWSYQrB+yXZnWfbeiQOnqZdD0i/Oyyc
FD/xeskrRTqQ2RJ6oSXuyjiJqf3io6vd+8qywkz9YjxeIlBYT8GpDfXDpyxOOCQV
T0/7J46cg5RWT7YvrLly7HHdE3eikLxpgjNzKTmw5hLE3R6UknNO8jIhD4ocdw1a
InCUYzh3YAcLDXMYDwl0U5tymfQdW7emiBKBzFWllAH+uADMRKOVpOrblTylGNEI
5QIDAQAB
-----END PUBLIC KEY-----

原始數(shù)據(jù):
{"name":"xiaoming","age":"23","address":"beijing"}
------------------私鑰加密,公鑰解密---------------------
私鑰加密:
JKxCYGsGshnTF9o4HaX7KfcMPGnCcNnnZrWk9lQaSJ17cJbkOO8b/n2s4S2TBLdTy7oqmyqF5+MqR0/Pn08dZNy2oJc9fScjoEzovDsXWLqFXRDrxnoy8RtqYC70B9b6WfQGFesWL6qVhVfvH0xbqhbMQ19z7vyztYd5jy22Vw1jAIgl+3P9VdH5zJJ6eTpnkW0I82c9/vY4nIeMv49dTOjTN8vEcInqBse1pUb2UcnrOsiTzhh+D+0RiGVeWJ6Vx7RYkV6s9D7C+25Zf128MiPsCcEnI6ocfoBMEX/GzaXnT+vxj6b3vqJu738n7bF+dxNJnrr2iPzLF5JzpoFaEQ==
公鑰解密:
{"name":"xiaoming","age":"23","address":"beijing"}
------------------公鑰加密,私鑰解密---------------------
公鑰加密:
kEhne7tYqjmhBJqTq5GXop9OE5FBbDVBtcCKpBONrfTjbcZa0WPqyi2meCg/gNWzk8hI6KF5V5H9UIZBE74DJMQk2s/DcYQY/0zHuxaV4zgrD7TDVhTwM/YfnpR9xlf4JBnoY27M5eULaxf0Rj70nxwW/QGldZ/lhHpN/kZBlTmonSjfiEpm1WnWvZGSZVTib75/70kGDhl8ykpTZLRt9/CFIIgpf+U0WiSoOa3FRnFx/BTiAtWWYWSiIwMs7pzxM+UWPGy9m4FPPJgAhy8/AO9GKBWfpk3WFzz38OQTCsS/X+QkuUbDO7mSSalkTsYWTXTWv4GbPdcUaUYSkB97/g==
私鑰解密:
{"name":"xiaoming","age":"23","address":"beijing"}

封裝類

class

<?php

/**
 * 生成證書文件及加密解密
 * Class Rsa
 */
class Rsa
{

    public $publicKey = '';
    public $privateKey = '';

    /**
     * 獲取證書文件
     * @param $publicKey
     * @param $privateKey
     */
    public function __construct($publicKey, $privateKey)
    {

        $this->publicKey = $publicKey;
        $this->privateKey = $privateKey;
    }

    /**
     * 加密解密
     * @param        $string
     * @param string $operation
     * @return string
     */
    public function authcode($string, $operation = 'encrypt')
    {

        if (!(file_exists($this->publicKey) || file_exists($this->privateKey))) {
            echo '秘鑰文件不存在';
            return false;
        }
        $publicKey = openssl_pkey_get_public(file_get_contents($this->publicKey));
        $privateKey = openssl_pkey_get_private(file_get_contents($this->privateKey));
        if (!($privateKey || $publicKey)) {
            echo '證書錯(cuò)誤';
            return false;
        }
        $data = "";
        if ($operation == 'decrypt') {
            openssl_private_decrypt(base64_decode($string), $data, $privateKey);
        } else {
            openssl_public_encrypt($string, $data, $publicKey);
            $data = base64_encode($data);
        }
        return $data;
    }

    /**
     * 生成證書
     * @return bool
     */
    public function exportOpenSSLFile()
    {

        $publicKey = $privateKey = '';
        $dir = './conf';
        $conf = 'openssl.cnf';
        if (!is_dir($dir)) {
            mkdir($dir,0700);
        }
        if (!file_exists($conf)) {
            touch($dir . '/' . $conf);
        }

        //參數(shù)設(shè)置
        $config = [
            "digest_alg" => "sha512",
            //字節(jié)數(shù)    512 1024  2048   4096 等
            "private_key_bits" => 2048,
            "config" => "./conf/openssl.cnf",
            //加密類型
            "private_key_type" => OPENSSL_KEYTYPE_RSA,
        ];

        //創(chuàng)建私鑰和公鑰
        $res = openssl_pkey_new($config);
        if ($res == false) {
            //創(chuàng)建失敗,請(qǐng)檢查openssl.cnf文件是否存在
            echo '生成秘鑰失敗';
            return false;
        }

        //將密鑰導(dǎo)出為PEM編碼的字符串锨苏,并輸出(通過引用傳遞)。
        openssl_pkey_export($res, $privateKey, null, $config);
        $publicKey = openssl_pkey_get_details($res);
        $publicKey = $publicKey["key"];

        //生成證書
        $createPublicFileRet = file_put_contents($this->publicKey, $publicKey);
        $createPrivateFileRet = file_put_contents($this->privateKey, $privateKey);
        if (!($createPublicFileRet || $createPrivateFileRet)) {
            echo '創(chuàng)建秘鑰文件失敗';
            return false;
        }

        openssl_free_key($res);
        return true;
    }
}

$certPublic = "./conf/cert_public.key";
$certPrivate = "./conf/cert_private.key";
$rsaObj = new Rsa($certPublic, $certPrivate);

//生成證書
$rsaObj->exportOpenSSLFile();

//原始數(shù)據(jù)
$sourceDat = '{"name":"jack","age":"22","address":"beijing"}';
echo 'source data:' . PHP_EOL, $sourceDat . PHP_EOL;

//加密
$encryptStr = $rsaObj->authcode($sourceDat);
echo 'string encrypt:' . PHP_EOL, $encryptStr . PHP_EOL;

//解密
$decryptStr = $rsaObj->authcode($encryptStr, 'decrypt');
echo 'string decrypt:' . PHP_EOL, $decryptStr . PHP_EOL;

輸出

source data:
{"name":"jack","age":"22","address":"beijing"}
string encrypt:
hikoQAKwt9jztThG4SoepMnRsd/VqkpgUubnP6tFHqvsAEka9mPm5QLNFSW07p2l+5KJYOkNOX8IDQ+YXid2kivLnDc3RWHOsACw3nFnb28SbTsqv/QRLteRqXrj/zt/s02V9qQ/s/WZOHPRrKMqkVIbo1yrncT1YhdPWPeeY/6BBUWB7YS2a2IzN1Yo/MmGUtxqPTzXwUhdTztu7kVJnwF6sJK8Dus+2PsAdvbNSNrZGHIEKfKueaThn0QN55vzsK88wnuMpyJcpfK8O2WtwdIFVvBboZH9sNNCU80nUM3ma/Xpewash/Zac1ZX1jgxdfsNxmh73aV8eaOQyXzjCw==
string decrypt:
{"name":"jack","age":"22","address":"beijing"}

生成文件

$ tree conf/
conf/
├── cert_private.key
├── cert_public.key
└── openssl.cnf

0 directories, 3 files

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末棺聊,一起剝皮案震驚了整個(gè)濱河市伞租,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌限佩,老刑警劉巖葵诈,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異祟同,居然都是意外死亡作喘,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門晕城,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)泞坦,“玉大人,你說(shuō)我怎么就攤上這事砖顷》∷” “怎么了赃梧?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)豌熄。 經(jīng)常有香客問我授嘀,道長(zhǎng),這世上最難降的妖魔是什么房轿? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任粤攒,我火速辦了婚禮所森,結(jié)果婚禮上囱持,老公的妹妹穿的比我還像新娘。我一直安慰自己焕济,他們只是感情好纷妆,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著晴弃,像睡著了一般掩幢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上上鞠,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天际邻,我揣著相機(jī)與錄音,去河邊找鬼芍阎。 笑死世曾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的谴咸。 我是一名探鬼主播轮听,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼岭佳!你這毒婦竟也來(lái)了血巍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤珊随,失蹤者是張志新(化名)和其女友劉穎述寡,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叶洞,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鲫凶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了京办。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掀序。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖惭婿,靈堂內(nèi)的尸體忽然破棺而出不恭,到底是詐尸還是另有隱情叶雹,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布换吧,位于F島的核電站折晦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏沾瓦。R本人自食惡果不足惜满着,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贯莺。 院中可真熱鬧风喇,春花似錦、人聲如沸缕探。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)爹耗。三九已至耙考,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間潭兽,已是汗流浹背倦始。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工把介, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惩琉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓腕窥,卻偏偏與公主長(zhǎng)得像怒坯,于是被迫代替她去往敵國(guó)和親炫狱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉剔猿,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,686評(píng)論 0 9
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,090評(píng)論 1 32
  • 強(qiáng)烈推薦閱讀大神博客--談?wù)?iOS 中圖片的解壓縮 知識(shí)點(diǎn): 位圖:位圖就是一個(gè)像素?cái)?shù)組视译,數(shù)組中的每個(gè)像素就代表...
    灰灰是只小賤狗閱讀 247評(píng)論 0 0
  • 開文很遺憾的告訴你酷含,雞皮膚是沒有辦法治愈的,不管是什么手段你都只能讓它看起來(lái)汪茧,沒有那么明顯和嚴(yán)重椅亚。 如果你覺得你對(duì)...
    臘月南枝閱讀 450評(píng)論 0 2
  • 傲氣凌霜閱讀 254評(píng)論 0 0