欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

非对称加密openssl协议在php7实践

程序员文章站 2022-05-25 09:23:53
据网上资料,RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商务中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特(RON RIVEST)、阿迪·萨莫尔(ADI SHAMIR)和伦纳德·阿德曼(LEONARD ADLEMAN)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们 ......

      据网上资料,rsa加密算法是一种非对称加密算法。在公开密钥加密和电子商务中rsa被广泛使用。rsa是1977年由罗纳德·李维斯特(ron rivest)、阿迪·萨莫尔(adi shamir)和伦纳德·阿德曼(leonard adleman)一起提出的。当时他们三人都在麻省理工学院工作。rsa就是他们三人姓氏开头字母拼在一起组成的。

    工作中经常会出现对敏感数据加解密的需要,比如自己当前金融公司涉及到的用户交易数据,用户身份识别验证等。这里有关用户身份识别的用到了rsa加密算法。php这里用到了openss协议。

    非对称加密即是私钥加密需用公钥解密;公钥加密的需用私钥解密;公钥和私钥是成对出现,公钥可以派发给所用人,私钥只可服务端保留。

    下面是php实现的openssl加解密部分示例代码:

##服务器是centos7
##首先确定服务器是否安装openssl协议(未安装的请执行命令yum install -y openssl-devel): [root@iz2vcf47jzvf8dxrapolf7z test]# openssl version openssl 1.0.2k-fips 26 jan 2017 [root@iz2vcf47jzvf8dxrapolf7z test]# #生成私钥文件rsa_private_key.pem文件 [root@iz2vcf47jzvf8dxrapolf7z test]# openssl genrsa -out rsa_private_key.pem 1024 generating rsa private key, 1024 bit long modulus ..................................................++++++ ........................................................................++++++ e is 65537 (0x10001)
##私钥转成pkcs8模式(文末附各模式说明)
[root@iz2vcf47jzvf8dxrapolf7z test]# openssl pkcs8 -topk8 -inform pem -in rsa_private_key.pem -outform pem -nocrypt -out private_key.pem
##打印私钥文件 [root@iz2vcf47jzvf8dxrapolf7z test]# cat rsa_private_key.pem -----begin rsa private key----- miicxqibaakbgqch13gukzwqlx7cuyqvy1a6jujjarmax8yhctrtcl+kpa5cg6md 609qnitacujxmh7q/w+1lw/cuwn0q7s3s4wzjet6yci3fh4zqvmpqwickwc/he3p vv3ljsbvmpoz2bfn1erwvtmsp4dvaqe542yvbz13vgheevkki5uqwyhy1widaqab aogaiysjjofz5wc28bxh55yu8ay/mqvjdidtf5v+zvatkkbzqtjlcbnzsk58yxwr qkv2hmje0wx1j4yjqxmhm46lolkipwdqfzryffnk3xmo9lc6jxbirkmfyyn7ftqt 5cadvrtj2jo9bldg0ddtp7pl6dri00jkrtru3mgxzz1kowkcqqdrzzl9lks+lz0v koekguhjfhpfypjce/mg0xfozufiqyxdm/no1nx/kar+xtuhiqkrzdxadoa0nrxg alctt1nbakeaxdxotvcfykofes1aoag35mv7inlnjelbj1jx0wtgrvuv/0nvmvkf tlinecd2muae00owjuxanai2fqqwbml1nqjbal/agdrgaxjhsiguvd+zegg6jyxq akbnykr57qo3r+miq6vsh4phy65vjuwmtdpw9c33o8+leuyvix+he+wzfk0cqqda gb+9lfyxpou6yqr+tdrglisukwscfp27qbmfesq3umvyb8lovmwxpby5zxelnxdm uolz0gaog4myonbxrm2lakaeojh32xmstb+hi+lqrlcfiumyrjhpgbrgtcyuqoly fjr63m0e/rzvinekpqlp+ysoylfco3bjuma75cqic8pf -----end rsa private key-----

 ##根据私钥得到相应的公钥
 [root@iz2vcf47jzvf8dxrapolf7z test]# openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
 writing rsa key
 [root@iz2vcf47jzvf8dxrapolf7z test]# cat rsa_public_key.pem
 -----begin public key-----
 migfma0gcsqgsib3dqebaquaa4gnadcbiqkbgqch13gukzwqlx7cuyqvy1a6jujj
 armax8yhctrtcl+kpa5cg6md609qnitacujxmh7q/w+1lw/cuwn0q7s3s4wzjet6
 yci3fh4zqvmpqwickwc/he3pvv3ljsbvmpoz2bfn1erwvtmsp4dvaqe542yvbz13
 vgheevkki5uqwyhy1widaqab
 -----end public key-----
##新建openssl.php
[root@iz2vcf47jzvf8dxrapolf7z test]# cat openssl.php

<?php
/**
 * 私钥加密/公钥解密
 *
 * @param $str string 待加解密字符串
 * @param $isencrypt boolean
 * return string|null
 */
 function opensslprivateencrypt($str, $isencrypt = true)
 {

  if($isencrypt){
    $privatekey = file_get_contents('./rsa_private_key.pem');
    $privatekey = openssl_pkey_get_private($privatekey);

    return openssl_private_encrypt($str, $encryptedstr, $privatekey)
      ? base64_encode($encryptedstr) : null;
  }else{
    $publickey = file_get_contents('./rsa_public_key.pem');
    $publickey = openssl_pkey_get_public($publickey);

    return (openssl_public_decrypt(base64_decode($str), $decryptedstr, $publickey))
    ? $decryptedstr : null;
  }
}

/**
 * 公钥加密/私钥解密
 *
 * @param $str string 待加解密字符串
 * @param $isencrypt boolean
 * return string|null
 */
function opensslpublicencrypt($str , $isencrypt = true)
{

  if($isencrypt){
    $publickey = file_get_contents('./rsa_public_key.pem');
    $publickey = openssl_pkey_get_public($publickey);

    return openssl_public_encrypt($str, $encryptedstr, $publickey)
      ? base64_encode($encryptedstr) : null;
  }else{
    $privatekey = file_get_contents('./rsa_private_key.pem');
    $privatekey = openssl_pkey_get_private($privatekey);

    return (openssl_private_decrypt(base64_decode($str), $decryptedstr, $privatekey))
      ? $decryptedstr : null;
  }
}

$config = array();
$config['title'] = 'php is the best program language.';
$config['comment'] = 'phpers are great people.';

$privateencrypt = opensslprivateencrypt(json_encode($config));
echo("##privateencrypt is:" . php_eol);
echo($privateencrypt . php_eol);
$privatedecrypt = opensslprivateencrypt($privateencrypt, false);
echo("##privatedecrypt is:" . php_eol);
echo($privatedecrypt . php_eol);

$publicencrypt = opensslpublicencrypt(json_encode($config));
echo("##publicencrypt is:" . php_eol);
echo($publicencrypt . php_eol);
$publicdecrypt = opensslpublicencrypt($publicencrypt, false);
echo("##publicdecrypt is:" . php_eol);
echo($publicdecrypt . php_eol);

##执行脚本
[root@iz2vcf47jzvf8dxrapolf7z test]# php openssl.php

##privateencrypt is:
mlrliawbwle69yj5/lnnw1t8qsjhnfa+96s/ksmywean/hesv7jfvaj6mn/fy2drrwkkeonguuysrcftbcs1ieg7utqbuaasxa5dwvgttrfodcdhhml7p90+dio8n+vmobx1kkuegpvth03y3mguvsj/blkle8jrfxyjguficv0=
##privatedecrypt is:
{"title":"php is the best program language.","comment":"phpers are great people."}
##publicencrypt is:
nw2k5m2pkrzmemshxik7mfyc+ydjh1+b6trempv+ywbfsulo2p8ewwcxoqxvsv4ug87a1s4xa2qysntdewhpyoim97457odvvcb6jx+cqqdwj1wlls+gx7fjxw7z0kmpmcm5imcqwwpk+uzf+dpc/gjfa9ugaamyczuumoauax0=
##publicdecrypt is:
{"title":"php is the best program language.","comment":"phpers are great people."}

pkcs标准:

pkcs标准汇总
  版本 名称 简介
pkcs #1 2.1 rsa密码编译标准(rsa cryptography standard) 定义了rsa的数理基础、公/私钥格式,以及加/解密、签/验章的流程。1.5版本曾经遭到攻击。
pkcs #2 - 撤销 原本是用以规范rsa加密摘要的转换方式,现已被纳入pkcs#1之中。
pkcs #3 1.4 dh密钥协议标准(diffie-hellman key agreement standard) 规范以dh密钥协议为基础的密钥协议标准。其功能,可以让两方通过金议协议,拟定一把会议密钥(session key)。
pkcs #4 - 撤销 原本用以规范转换rsa密钥的流程。已被纳入pkcs#1之中。
pkcs #5 2.0 密码基植加密标准(password-based encryption standard) 参见rfc 2898与pbkdf2
pkcs #6 1.5 证书扩展语法标准(extended-certificate syntax standard) 将原本x.509的证书格式标准加以扩充。
pkcs #7 1.5 密码消息语法标准(cryptographic message syntax standard) 参见rfc 2315。规范了以公开密钥基础设施(pki)所产生之签名/密文之格式。其目的一样是为了拓展数字证书的应用。其中,包含了s/mimecms
pkcs #8 1.2 私钥消息表示标准(private-key information syntax standard). apache读取证书私钥的标准。
pkcs #9 2.0 选择属性格式(selected attribute types) 定义pkcs#6、7、8、10的选择属性格式。
pkcs #10 1.7 证书申请标准(certification request standard) 参见rfc 2986。规范了向证书中心申请证书之csr(certificate signing request)的格式。
pkcs #11 2.20 密码设备标准接口(cryptographic token interface (cryptoki)) 定义了密码设备的应用程序接口(api)之规格。
pkcs #12 1.0 个人消息交换标准(personal information exchange syntax standard) 定义了包含私钥与公钥证书(public key certificate)的文件格式。私钥采密码(password)保护。常见的pfx就履行了pkcs#12。
pkcs #13 椭圆曲线密码学标准(elliptic curve cryptography standard) 制定中。规范以椭圆曲线密码学为基础所发展之密码技术应用。椭圆曲线密码学是新的密码学技术,其强度与效率皆比现行以指数运算为基础之密码学算法来的优秀。然而,该算法的应用尚不普及。
pkcs #14 拟随机数产生器标准(pseudo-random number generation) 制定中。规范拟随机数产生器的使用与设计。
pkcs #15 1.1 密码设备消息格式标准(cryptographic token information format standard) 定义了密码设备内部数据的组织结构。