常用的几种加密方式
md5加密
Md5是一种单向的加密技术,不可逆,不能进行解密
crypt加密
crypt()为单向加密,跟md5差不多一样
sha1加密
跟md5很像,不同的是sha1()默认情况下返回40个字符的散列值,传入参数性质一样,第一个为加密的字符串,第二个为raw_output的布尔值,默认为false,如果设置为true,sha1()则会返回原始的20 位原始格式报文摘要
sha1()也是单行加密,没有逆向解密算法
urlencode
一个参数,传入要加密的字符串(通常应用于对URL的加密),
urlencode为双向加密,可以用urldecode来加密(严格意义上来说,不算真正的加密)
base64编码加密
base64_encode()接受一个参数,也就是要编码的数据(这里不说字符串,是因为很多时候base64用来编码图片)
base64_encode()为双向编码,可用base64_decode()来解码。(实际上这也不算加密,只是编码)
AES加密
对称加密,只有一把密钥,只要密钥不泄露,AES加密还是十分安全的
RSA加密
非对称加密,一个公钥,一个密钥两把钥匙,优点是安全可靠
md5,crypt和sha1统称hash算法,urlencode和base64也称为编码。他们都不是严格意义上面的加密。下面重点说下AES和RSA加密。这是最常见的两种加密方式。要理解这两种加密方法。
我先以我自己的理解讲一个故事。有3个国家在打仗,A国和B国是同盟国 对付C国。A国需要和B国共享情报,于是派使者传话给B国约定了彼此之间信件往来的规则。
比如说英文字母A用Z代替,B用3代替(这个加密的规则就是密钥,这里只是举个例子,真实情况不会这么简单),只要密钥不泄露出去,C国就算截取到他们之家的通信也不大可能读懂他们之间的情报。(对称加密)
这种情况持续了很久,C国一直受2个国家的联合打压,眼看就要溃败了。这时候C国军师收买了当时A国传话给B国的使者得到他们之间的通信规则(密钥)。于是C国掌握了情报扭转了局势。
这时候A国和B觉得这样下去不是办法,就算我换一个通信规则,C国也很可能可以获取到。到底要怎么交换情报呢?这时候有人提议用两把钥匙的方式对情报进行加密。A国先对情报进行一次加密,然后随即用密钥1(私钥)解密,但是由于没有用密钥2解密,情报还是看不到,然后就把
密钥2(公钥)发给B国,B国很轻松用密钥2解开了情报。情报内容为”下次什么时候发起进攻?“。这时候C国也窃取到密钥然后翻译了以上情报,大喜。此时,B国拿到情报准备回复,回复内容”下星期一“进行加密。然后发回给A国。
这时候C国又窃取到B国发回给A国的密文,正想解密。可是他怎么解都解不出来。因为解密一定要两套密钥具备才可以。这时候C国彻底懵逼了。
总结:AES加密很容易理解,就是通过一特地的.密钥对一组数据进行加密.AES加密也是对称加密的典型.RSA其实也很好理解,你只要知道理解RSA是要用到两个密钥就可以了,至于什么私钥,公钥其实没有一个统一的标准,不同情况下,私钥也可以是公钥,公钥也可以是私钥,这取决于你怎么使用.
再举个栗子.你们有没有开发国微信支付或者支付宝支付,他们都是用的RSA加密对支付信息进行加密.用户首先生成公钥,密钥.公钥给支付平台,密钥自己保留.用户发起支付,私钥加密支付信息,平台公钥加密.这时候平台的作用是验证你发起的支付信息跟你的身份的一致性.是验签的作用.平台收到你的支付信息,会用公钥加密回调信息返回给用户.这时候是公钥加密,私钥解密.此时,哪怕黑客拿到平台的公钥,也无法伪造正确的加密信息,因为黑客只有公钥是无法解密的.
下面是PHP的RSA加密类仅供参考
<?php
namespace encrypt;
class Rsa{
private static $_privkey = '';
private static $_pubkey = '';
private static $_isbase64 = false;
/**
* 初始化key值
* @param string $privkey 私钥
* @param string $pubkey 公钥
* @param boolean $isbase64 是否base64编码
* @return null
*/
public function init($privkey, $pubkey, $isbase64 = false)
{
self::$_privkey = $privkey;
self::$_pubkey = $pubkey;
self::$_isbase64 = $isbase64;
}
/**
* 私钥加密
* @param string $data 原文
* @return string 密文
*/
public function priv_encode($data)
{
$outval = '';
$res = openssl_pkey_get_private(self::$_privkey);
openssl_private_encrypt($data, $outval, $res);
if(self::$_isbase64){
$outval = base64_encode($outval);
}
return $outval;
}
/**
* 公钥解密
* @param string $data 密文
* @return string 原文
*/
public function pub_decode($data)
{
$outval = '';
if(self::$_isbase64){
$data = base64_decode($data);
}
$res = openssl_pkey_get_public(self::$_pubkey);
openssl_public_decrypt($data, $outval, $res);
return $outval;
}
/**
* 公钥加密
* @param string $data 原文
* @return string 密文
*/
public function pub_encode($data)
{
$outval = '';
$res = openssl_pkey_get_public(self::$_pubkey);
openssl_public_encrypt($data, $outval, $res);
if(self::$_isbase64){
$outval = base64_encode($outval);
}
return $outval;
}
/**
* 私钥解密
* @param string $data 密文
* @return string 原文
*/
public function priv_decode($data){
$outval = '';
if(self::$_isbase64){
$data = base64_decode($data);
}
$res = openssl_pkey_get_private(self::$_privkey);
openssl_private_decrypt($data, $outval, $res);
return $outval;
}
/**
* 创建一组公钥私钥
* @return array 公钥私钥数组
*/
public function new_rsa_key()
{
$res = openssl_pkey_new();
openssl_pkey_export($res, $privkey);
$d = openssl_pkey_get_details($res);
$pubkey = $d['key'];
return array(
'privkey' => $privkey,
'pubkey' => $pubkey
);
}
}
//举个例子
$Rsa = new Rsa();
$keys = $Rsa->new_rsa_key(); //生成完key之后应该记录下key值,这里省略
$privkey = $keys['privkey'];
$pubkey = $keys['pubkey'];
//初始化rsaobject
$Rsa->init($privkey, $pubkey,TRUE);
//原文
$data = '出门记得带口罩';
//私钥加密示例
$encode = $Rsa->priv_encode($data);
$ret = $Rsa->pub_decode($encode);
//公钥加密示例
$encode = $Rsa->pub_encode($data);
$ret = $Rsa->priv_decode($encode);
print_r($ret);