php openssl加密解密

基本使用

代码

<?php


/*
 *
Base64是MIME邮件中常用的编码方式之一。
主要思想:
1 将输入的字符串或数据编码成只含有{'A'-'Z', 'a'-'z', '0'-'9', '+', '/'}这64个可打印字符的串,故称为“Base64”。
编码的方法:
2 将输入数据流每次取6 bit,用此6 bit的值(0-63)作为索引去查表,输出相应字符。这样,每3个字节将编码为4个字符(3×8 → 4×6);不满4个字符的以'='填充。
 */


$config = array(
    "digest_alg"    => "sha512",
    "private_key_bits" => 2048,           //字节数  512 1024 2048  4096 等 ,不能加引号,此处长度与加密的字符串长度有关系,可以自己测试一下
    "private_key_type" => OPENSSL_KEYTYPE_RSA,   //加密类型
);
$resource = openssl_pkey_new($config);

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

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

echo '------------------创建私钥---------------------' . PHP_EOL;
echo $privateKey.PHP_EOL;
echo '------------------创建公钥---------------------' . PHP_EOL;
echo $publicKey.PHP_EOL;


// 加密后内容含有特殊字符,需编码转换

//从证书中提取公钥
$publicKey = openssl_pkey_get_public($publicKey);
//从证书中提取私钥
$privateKey = openssl_pkey_get_private($privateKey); // 提取成功返回资源标识,错误返回false is_resource($publicKey)


//原始数据
$data = '{"name":"xiaoming","age":"23","address":"beijing"}';
//加密
$encrypted = "";
//解密
$decrypted = "";

echo '原始数据:' . PHP_EOL . $data . PHP_EOL;

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

//私钥加密
openssl_private_encrypt($data, $encrypted, $privateKey);
//加密后内容含有特殊字符,需编码转换
$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;

//加密后内容含有特殊字符,需编码转换
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关联秘钥
openssl_free_key($publicKey);
openssl_free_key($privateKey);


打印结果

------------------创建私钥---------------------
-----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-----

------------------创建公钥---------------------
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3XvjGXNxk3sn7jzwQwa2
Qb/aojB5KZdmiztuVZlYpa4yL3RaBpSzteY6n1oc5j7SKJO2GOmjVewk1Ik1v0A/
CkW7BUANAJ4zfIiEqLEzEOyNnEOwzlHLkPWSYQrB+yXZnWfbeiQOnqZdD0i/Oyyc
FD/xeskrRTqQ2RJ6oSXuyjiJqf3io6vd+8qywkz9YjxeIlBYT8GpDfXDpyxOOCQV
T0/7J46cg5RWT7YvrLly7HHdE3eikLxpgjNzKTmw5hLE3R6UknNO8jIhD4ocdw1a
InCUYzh3YAcLDXMYDwl0U5tymfQdW7emiBKBzFWllAH+uADMRKOVpOrblTylGNEI
5QIDAQAB
-----END PUBLIC KEY-----

原始数据:
{"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 '证书错误';
            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);
        }

        //参数设置
        $config = [
            "digest_alg" => "sha512",
            //字节数    512 1024  2048   4096 等
            "private_key_bits" => 2048,
            "config" => "./conf/openssl.cnf",
            //加密类型
            "private_key_type" => OPENSSL_KEYTYPE_RSA,
        ];

        //创建私钥和公钥
        $res = openssl_pkey_new($config);
        if ($res == false) {
            //创建失败,请检查openssl.cnf文件是否存在
            echo '生成秘钥失败';
            return false;
        }

        //将密钥导出为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 '创建秘钥文件失败';
            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();

//原始数据
$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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,709评论 0 9
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,097评论 1 32
  • 强烈推荐阅读大神博客--谈谈 iOS 中图片的解压缩 知识点: 位图:位图就是一个像素数组,数组中的每个像素就代表...
    灰灰是只小贱狗阅读 250评论 0 0
  • 开文很遗憾的告诉你,鸡皮肤是没有办法治愈的,不管是什么手段你都只能让它看起来,没有那么明显和严重。 如果你觉得你对...
    腊月南枝阅读 453评论 0 2
  • 傲气凌霜阅读 260评论 0 0