加密解密知识 php非对称加密
function test1(){
    $config = array(
            "digest_alg" => "sha1",
            "private_key_bits" => 1024,
            "private_key_type" => OPENSSL_KEYTYPE_RSA,
            "encrypt_key" => false
    );
    $res = openssl_pkey_new($config);
    openssl_pkey_export($res, $priKey); //获取私钥$priKey
    $pubKey = openssl_pkey_get_details($res);
    $pubKey = $pubKey['key'];//获得公钥 $pubKey
    var_dump('私钥:',$priKey);
    var_dump('公钥:',$pubKey);
    $data = 'zhangpeng';//要被加密的数据
    openssl_public_encrypt($data,$encrypted,$pubKey);//用公钥加密
    openssl_private_decrypt($encrypted, $decrypted, $priKey);//用私钥解密
    var_dump($decrypted);
}
php环境下配置openssl实现签名验证
配置如下
1:编辑openssl,php5需要0.96以上版本
2:将编译好的libeay32.dll,ssleay32.dll放到system32目录下
3:将php.ini中的openssl.dll前面的;去掉
4:将php目录下的php_openssl.dll拷贝到system32目录下
5:设置环境变量
OPENSSL_CONF=c:opensslopenssl.cnf
其中php自带了一个cnf示例,在phpextrasopenssl目录下
编写测试代码:
$config = array(
"digest_alg" => "sha1",
"private_key_bits" => 1024,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
"encrypt_key" => false
);
$privkey = openssl_pkey_new($config);
openssl_pkey_export($privkey, $keydata);
echo $keydata;
http://www.alixixi.com/program/a/2008050731975.shtml
封装php的非对称加密RSA
http://tiandiou.blog.163.com/blog/static/2355668220106108342139/
将php的openssl扩展中的非对称加密函数封装成一个Rsa类。
需要注意的是,在windows上,需要打开openssl的配置文件,请参照官方的openssl扩展安装文档。
//以下说明2011-06-23添加
在windows上安装openssl扩展
1、将php路径下的两个库文件libeay32.dll和ssleay32.dll复制到操作system32下
2、配置openssl配置文件的位置,在php的路径下,有文件extras/openssl/openssl.cnf,添加环境变量OPENSSL_CONF指向这个文件的全路径。如何添加环境变量请google搜索之。
3、在php.ini里添加一行extension=php_openssl.dll
使用的demo:
//====================demo=======================
//以下是一个简单的测试demo,如果不需要请删除
$rsa = new Rsa('sslkey'); //sslkey为存放密钥的路径,将已有的密钥文件复制到该路径下,公钥名称为pub.key,私钥名称为priv.key
$rsa->createKey(); //创建一对密钥,如果密钥对已经存在,不需调用
//私钥加密,公钥解密
echo 'source:我是老鳖<br />';
$pre = $rsa->privEncrypt('我是老鳖');
echo 'private encrypted:<br />' . $pre . '<br />';
$pud = $rsa->pubDecrypt($pre);
echo 'public decrypted:' . $pud . '<br />';
//公钥加密,私钥解密
echo 'source:干IT的<br />';
$pue = $rsa->pubEncrypt('干IT的');
echo 'public encrypt:<br />' . $pue . '<br />';
$prd = $rsa->privDecrypt($pue);
echo 'private decrypt:' . $prd;
//========================demo======================
本示例在windows7、php 5.2.14、openssl 0.98下开发
<?php
/**
 * 使用openssl实现非对称加密
 *
 * @author 老鳖<iamlaobie@gmail.com>
 * @since 2010-07-08
 */
class Rsa
{
    /**
     * private key
     */
        private $_privKey;
        /**
         * public key
         */
        private $_pubKey;
        /**
         * the keys saving path
         */
        private $_keyPath;
        /**
         * the construtor,the param $path is the keys saving path
         */
        public function __construct($path)
        {
                if(empty($path) || !is_dir($path)){
                        throw new Exception('Must set the keys save path');
                }
                $this->_keyPath = $path;
        }
        /**
         * create the key pair,save the key to $this->_keyPath
         */
        public function createKey()
        {
                $r = openssl_pkey_new();
                openssl_pkey_export($r, $privKey);
                file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR . 'priv.key', $privKey);
                $this->_privKey = openssl_pkey_get_private($privKey);
                $rp = openssl_pkey_get_details($r);
                $pubKey = $rp['key'];
                file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR .  'pub.key', $pubKey);
                $this->_pubKey = openssl_pkey_get_public($pubKey);
        }
        /**
         * setup the private key
         */
        public function setupPrivKey()
        {
                if(is_resource($this->_privKey)){
                        return true;
                }
                $file = $this->_keyPath . DIRECTORY_SEPARATOR . 'priv.key';
                $prk = file_get_contents($file);
                $this->_privKey = openssl_pkey_get_private($prk);
                return true;
        }
        /**
         * setup the public key
         */
        public function setupPubKey()
        {
                if(is_resource($this->_pubKey)){
                        return true;
                }
                $file = $this->_keyPath . DIRECTORY_SEPARATOR .  'pub.key';
                $puk = file_get_contents($file);
                $this->_pubKey = openssl_pkey_get_public($puk);
                return true;
        }
        /**
         * encrypt with the private key
         */
        public function privEncrypt($data)
        {
                if(!is_string($data)){
                        return null;
                }
                $this->setupPrivKey();
                $r = openssl_private_encrypt($data, $encrypted, $this->_privKey);
                if($r){
                        return base64_encode($encrypted);
                }
                return null;
        }
        /**
         * decrypt with the private key
         */
        public function privDecrypt($encrypted)
        {
                if(!is_string($encrypted)){
                        return null;
                }
                $this->setupPrivKey();
                $encrypted = base64_decode($encrypted);
                $r = openssl_private_decrypt($encrypted, $decrypted, $this->_privKey);
                if($r){
                        return $decrypted;
                }
                return null;
        }
        /**
         * encrypt with public key
         */
        public function pubEncrypt($data)
        {
                if(!is_string($data)){
                        return null;
                }
                $this->setupPubKey();
                $r = openssl_public_encrypt($data, $encrypted, $this->_pubKey);
                if($r){
                        return base64_encode($encrypted);
                }
                return null;
        }
        /**
         * decrypt with the public key
         */
        public function pubDecrypt($crypted)
        {
                if(!is_string($crypted)){
                        return null;
                }
                $this->setupPubKey();
                $crypted = base64_decode($crypted);
                $r = openssl_public_decrypt($crypted, $decrypted, $this->_pubKey);
                if($r){
                        return $decrypted;
                }
                return null;
        }
        public function __destruct()
        {
                @ fclose($this->_privKey);
                @ fclose($this->_pubKey);
        }
}
加密模式:CBC、CFB、CTR、ECB、OFB、NCFB
加密算法:Blowfish、DES、TripleDES、SAF-ER-SK128、TWOFISH、TEA、RC2、3-WAY、SAFER-SK64
对称性加密:特点:单密钥(即加密和解密都使用同一个密钥),加密速度快
常用的对称加密有:DES、IDEA、RC2、RC4、SKIPJACK、RC5、AES算法等
非对称性加密:特点:有两个密码(公钥和私钥)
广泛应用的不对称加密算法有RSA算法和美国国家标准局提出的DSA
非对称加密算法又名“公开密钥加密算法”,主要有:RSA、Elgamal、背包算法、Rabin、D-H、ECC
加密解密知识 php非对称加密的更多相关文章
- PHP中使用OpenSSL生成RSA公钥私钥及进行加密解密示例(非对称加密)
		php服务端与客户端交互.提供开放api时,通常需要对敏感的部分api数据传输进行数据加密,这时候rsa非对称加密就能派上用处了,下面通过一个例子来说明如何用php来实现数据的加密解密 先了解一下关于 ... 
- 使用java实现对称加密解密(AES),非对称加密解密(RSA)
		对称加密:双方采用同样的秘钥进行加密和解密.特点是速度快,但是安全性没有非对称加密高 非对称加密:接收方生成的公有秘钥公布给发送方,发送方使用该公有秘钥加密之后,发送给接收方,然后接收方使用私有秘钥解 ... 
- Java常用的加密解密类(对称加密类)
		Java常用的加密解密类 原文转载至:http://blog.csdn.net/wyc_cs/article/details/8793198 原创 2013年04月12日 14:33:35 1704 ... 
- 各种加密解密函数(URL加密解密、sha1加密解密、des加密解密)
		原文:各种加密解密函数(URL加密解密.sha1加密解密.des加密解密) 普通hash函数如md5.sha1.base64等都是不可逆函数.虽然我们利用php可以利用这些函数写出可逆函数来.但是跨语 ... 
- php中des加密解密 匹配C#des加密解密 对称加密
		原文:php中des加密解密 匹配C#des加密解密 对称加密 网上找来的 php des加密解密 完全匹配上一篇C# 字符串加密解密函数 可以用于C#和php通信 对数据进行加密,其中$key 是 ... 
- AES加密解密 助手类 CBC加密模式
		"; string result1 = AESHelper.AesEncrypt(str); string result2 = AESHelper.AesDecrypt(result1); ... 
- Java 加密解密 对称加密算法 非对称加密算法 MD5 BASE64 AES RSA
		版权声明:本文为博主原创文章,未经博主允许不得转载. [前言] 本文简单的介绍了加密技术相关概念,最后总结了java中现有的加密技术以及使用方法和例子 [最简单的加密] 1.简单的概念 明文:加密前的 ... 
- Java加密与解密笔记(三) 非对称加密
		非对称的特点是加密和解密时使用的是不同的钥匙.密钥分为公钥和私钥,用公钥加密的数据只能用私钥进行解密,反之亦然. 另外,密钥还可以用于数字签名.数字签名跟上文说的消息摘要是一个道理,通过一定方法对数据 ... 
- 常见三种加密(MD5、非对称加密,对称加密)
		转载. https://blog.csdn.net/SSY_1992/article/details/79094556 任何应用的开发中安全都是重中之重,在信息交互异常活跃的现在,信息加密技术显得尤为 ... 
随机推荐
- Java [Leetcode 258]Add Digits
			题目描述: Given a non-negative integer num, repeatedly add all its digits until the result has only one ... 
- Erlang入门(二)—并发编程
			Erlang中的process——进程是轻量级的,并且进程间无共享.查了很多资料,似乎没人说清楚轻量级进程算是什么概念,继续查找中...闲话不提,进入并发编程的世界.本文算是学习笔记,也可以说是< ... 
- 单点登录系统(SSO)的开发思路
			单点登录并不是一个新鲜的玩意儿,比较官方的解释是企业业务整合的解决方案之一,通俗来讲SSO就是一个通用的用户中心,国内比较流行的UCenter就是一套单点登录解决方案.而近期以CSDN明文存储用户密码 ... 
- error C2065:未声明的标识符错误
			原文地址:http://blog.sina.com.cn/s/blog_8216ada701017evx.html 在VS2010下进行VC++调试时,出现这样一种错误:error C2065:未声明 ... 
- STM32 串口功能 库函数 详解和DMA 串口高级运用(转载)
			数据传输时要从支持那些相关的标准?传输的速度?什么时候开始?什么时候结束?传输的内容?怎样防止通信出错?数据量大的时候怎么弄?硬件怎么连接出发,当然对于stm32还要熟悉库函数的功能 具起来rs232 ... 
- windows内核窥探
			windows是一个非常优秀的OS,从今天开始,我要和大家共同分享windows给我们带来的快乐!本人只所以将自己的学习笔记与大家分享,一是让自己更深入的理解windows,再就是有什么疏漏之处,望大 ... 
- bzoj 3122 [Sdoi2013]随机数生成器(逆元,BSGS)
			Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. ... 
- 【暑假】[数学]UVa 1262 Password
			UVa 1262 Password 题目: Password Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld ... 
- Android的Spinner
			使用Spinner遇到不少坑啊 3.自定义spinner样式 <style name="AppTheme" parent="Theme.AppCompat.Ligh ... 
- Linux Pmap 命令:查看进程用了多少内存
			Pmap 提供了进程的内存映射,pmap命令用于显示一个或多个进程的内存状态.其报告进程的地址空间和内存状态信息.Pmap实际上是一个Sun OS上的命令,linux仅支持其有限的功能.但是它还是对查 ... 
