php公钥和私钥数据加密 公钥加密私钥解密和私钥加密公钥解密

php pki加密技术(openssl)详解

本篇文章是对php中的pki加密技术(openssl)进行了详细的分析介绍 需要的朋友参考下   复制代码 代码如下: ?php //pki加密 //使用pki加密需要开启 openssl扩展 //php ini extension = php_openssl dll扩展 /*pki模式是 * 公钥加密 私钥解密 * 私钥加密 公钥解密 */ //私钥加密 公钥解密 //客户端 //$data数据 $data = abcd ; //获取私钥 $priv_key_id $priv_key_id = openssl_get_privatekey(file_get_contents( bill rsa pem r)); //获取公钥 $pub_key_id $pub_key_id = openssl_get_publickey(file_get_contents( bill rsa cer r)); //$data首选通过SHA 哈希加密 然后通过$priv_key_id私钥加密 生成签名$signature //$signature就是加密过的签名 //openssl_sign()加密函数 至于它的解密方法我不知道?????????????????????? openssl_sign($data $signature $priv_key_id OPENSSL_ALGO_SHA ); //还有两种加密函数 而且这两种加密函数有解密方法 知道 //第一种 私钥加密 公钥解密 //$data要加密的数据 $crypted是加密生成的数据 $decrypted是解密生成的数据 $data与$decrypted值相同 //通过$priv_key_id私钥加密 生成$crypted; openssl_private_encrypt($data $crypted $priv_key_id); echo $crypted; //通过$pub_key_id公钥解密 生成$decrypted openssl_public_decrypt($crypted $decrypted $pub_key_id); //第二种 公钥加密 私钥解密 //$data要加密的数据 $crypted是加密生成的数据 $decrypted是解密生成的数据 $data与$decrypted值相同 //通过$pub_key_id公钥加密 生成$crypted; openssl_public_encrypt($data $crypted $pub_key_id); //通过$priv_key_id私钥解密 生成$decrypted openssl_private_decrypt($crypted $decrypted $priv_key_id); //注意事项 我这边的获取公钥与私钥的文件是不对应的 //正常情况 获取公钥与私钥文件是一一对应的 这里我使用快钱的 //快钱给了私钥生成文件 对应的公钥生成文件在快钱那边 //快钱给了公钥生成文件 对应的私钥生成文件在快钱那边 //也就是缺少了一个公钥生成文件和一个私钥生成文件 //我始终没找到一个一一对应的私钥 公钥生成文件 如果你找的了发我一份 谢谢 // openssl_verify()方法验证签名是否正确(私钥加密生成的数据返回来 用对应的公钥验证) 只有这一种情况 // $signature公钥加密生成的数据 $data原始数据 成功返回 失败返回 错误返回 // $pub_key_id公钥 openssl_verify($data $signature $pub_key_id); //从内存中释放私钥或公钥 openssl_free_key($priv_key_id); openssl_free_key($pub_key_id); lishixinzhi/Article/program/PHP/201311/21239

成都创新互联公司专业为企业提供阜新网站建设、阜新做网站、阜新网站设计、阜新网站制作等企业网站建设、网页设计与制作、阜新企业网站模板建站服务,10余年阜新做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。

php 怎么生成rsa加密的公钥和私钥

附上出处链接:

四,用PHP生成密钥

PEAR::Crypt_RSA的Crypt_RSA_KeyPair类可以生成密钥。调用步骤如下:

require_once('Crypt/RSA.php');

$math_obj = Crypt_RSA_MathLoader::loadWrapper();

$key_pair = new Crypt_RSA_KeyPair($key_lenth);

if (!$key_pair-isError()){

$public_key = $key_pair-getPublicKey();

$private_key = $key_pair-getPrivateKey();

$e =$math_obj-hexstr($math_obj-bin2int($public_key-getExponent()));

$d =$math_obj-hexstr($math_obj-bin2int($private_key-getExponent()));

$n =$math_obj-hexstr($math_obj-bin2int($public_key-getModulus()));

}

hexstr()是自己添加的函数,用来把十进制字符串转换为十六进制。对Crypt_RSA_Math_GMP很简单,只需:

function hexstr($num){

return gmp_strval($num,16);

}

对Crypt_RSA_Math_BCMath略麻烦些:

function hexstr($num){

$result = '';

do{

$result = sprintf('%02x',intval(bcmod($num,256))).$result;

$num = bcdiv($num, 256);

}while(bccomp($num, 0));

return ltrim($result,'0');

}

五,用php生成密钥(二)

为了提高加密速度,一般选一个较小的e。比较常用的是3、17、257、65537几个素数。

generate()生成密钥的算法是依次计算p,q,n,e,d。因此做了如下改动,以便可以自己选e值:

原来的:

function Crypt_RSA_KeyPair($key_len, $wrapper_name = 'default', $error_handler = '')

改后增加一个参数e:

function Crypt_RSA_KeyPair($key_len, $e = null, $wrapper_name = 'default', $error_handler = '')

这个函数调用generate()。效应地:

function generate($key_len = null)

也增加一个参数e:

function generate($key_len = null, $e = null)

把CRYPT_RSA-1.0.0的KeyPair.php中属于generate()的245~271行改动顺序,由e确定p和q:

if($e != null$this-_math_obj-cmpAbs($e,2)0)

$e = $this-_math_obj-nextPrime($this-_math_obj-dec($e));//取个素数

else

{

while(true)

{

$e = $this-_math_obj-getRand($q_len, $this-_random_generator);

if ($this-_math_obj-cmpAbs($e,2)=0)

continue;

$e = $this-_math_obj-nextPrime($this-_math_obj-dec($e));

break;

}

}

do{

$p = $this-_math_obj-getRand($p_len, $this-_random_generator, true);

$p = $this-_math_obj-nextPrime($p);

do{

do{

$q = $this-_math_obj-getRand($q_len, $this-_random_generator, true);

$tmp_len = $this-_math_obj-bitLen($this-_math_obj-mul($p, $q));

if ($tmp_len $key_len)

$q_len++;

elseif ($tmp_len $key_len)

$q_len--;

} while ($tmp_len != $key_len);

$q = $this-_math_obj-nextPrime($q);

$tmp = $this-_math_obj-mul($p, $q);

} while ($this-_math_obj-bitLen($tmp) != $key_len);

// $n - is shared modulus

$n = $this-_math_obj-mul($p, $q);

// generate public ($e) and private ($d) keys

$pq = $this-_math_obj-mul($this-_math_obj-dec($p), $this-_math_obj-dec($q));

if($this-_math_obj-isZero($this-_math_obj-dec($this-_math_obj-gcd($e, $pq))))

break;

}while(true);

(网易的服务真体贴啊,连pre标记里面的东西都给改。还改不好)这样,如果要生成e为3的1024位密钥,可以如下调用:

$key_pair = new Crypt_RSA_KeyPair(1024,3);

六,干什么用

加密比较重要的数据。比如注册时用户输入的密码。

登录时把密码hmac一下就可以防止重放攻击(replay attack)了。对注册不存在这种攻击,但有密码泄露的危险。上传密码hash那点安全性根本不算什么。这个可以用RSA加密解决。

不过,对中间人攻击还是没办法。

另外一个

理解两种加密方式中私钥和公钥的概念

私钥加密算法 ,又称  对称加密算法 ,因为这种算法解密密钥和加密密钥是相同的。也正因为同一密钥既用于加密又用于解密,所以这个密钥是不能公开的。常见的有《 DES加密算法 》、《 AES加密算法 》。

公钥和私钥成对出现

公开的密钥叫公钥,只有自己知道的叫私钥

用公钥加密的数据只有对应的私钥可以解密

用私钥加密的数据只有对应的公钥可以解密

如果可以用公钥解密,则必然是对应的私钥加的密

如果可以用私钥解密,则必然是对应的公钥加的密

公钥和私钥是相对的,两者本身并没有规定哪一个必须是公钥或私钥。

要实现数据的安全传输,当然就要对数据进行加密了。

如果使用对称加密算法,加解密使用同一个密钥,除了自己保存外,对方也要知道这个密钥,才能对数据进行解密。如果你把密钥也一起传过去,就存在密码泄漏的可能。所以我们使用 非对称算法 ,过程如下:

首先 接收方 生成一对密钥,即私钥和公钥;

然后,接收方 将公钥发送给 发送方;

发送方用收到的公钥对数据加密,再发送给接收方;

接收方收到数据后,使用自己的私钥解密。

由于在非对称算法中,公钥加密的数据必须用对应的私钥才能解密,而私钥又只有接收方自己知道,这样就保证了数据传输的安全性。

除了保证数据的安全传输之外,公钥体系的另一个用途就是对数据进行签名。通常 “数字签名” 是用来验证发送方的身份并帮助保护数据的完整性。

例如:一个发送者 A 想要传些资料给大家,用自己的私钥对资料加密,即签名。这样一来,所有收到资料的人都可以用发送者的公钥进行验证,便可确认资料是由 A 发出来的了。(因为只有A使用私钥签名得到的信息,才能用这个公钥来解) 采用数字签名,可以确认两点:

保证信息是由签名者自己签名发送的,签名者不能否认或难以否认。

保证信息自签发后到收到为止未曾作过任何修改。

之所以可以确认这两点,是因为用公钥可以解密的必然是用对应的私钥加的密,而私钥只有签名者持有。

四、公钥算法的缺点

现实中,公钥机制也有它的缺点,那就是 效率非常低 ,比常用的私钥算法(如 DES 和 AES)慢上一两个数量级都有可能。所以它不适合为大量的原始信息进行加密。为了同时兼顾安全和效率,我们通常结合使用公钥算法和私钥算法:

首先,发送方使用对称算法对原始信息进行加密。

接收方通过公钥机制生成一对密钥,一个公钥,一个私钥。

接收方 将公钥发送给 发送方。

发送方用公钥对对称算法的密钥进行加密,并发送给接收方。

接收方用私钥进行解密得到对称算法的密钥。

发送方再把已加密的原始信息发送给接收方。

接收方使用对称算法的密钥进行解密。

PHP 加密:AES & RSA

最近两年一直从事与金融相关项目的开发与维护。但是,关于 PHP 加密解密的最佳实践,网上没有人给出一个完美的总结。恰逢最近看了《图解密码技术》一书,对 PHP 加解密有了更深刻的认识。

为了避免各位看枯燥的文字理论,开篇我就把总结给出:

一、对称加密

对称加密的特点是加解密速度快,加密后的密文强度目前还没有硬解的可能性。但是,在未来随着计算机性能的提升有可能会出现被破解的可能性。

对称加密的缺点也很明显。对称加密的加密过程与解密过程使用的是同一把密钥。一旦泄漏密钥,加密就失去了任何意义。

根据《图解密码技术》一书的推荐,对称加密目前推荐使用 AES。在 PHP 当中要实现 AES 加解密,是使用 openssl 扩展来实现。所以,请确保你的 PHP 已经开启了 openssl 扩展。

可以通过如下方式检测:

或者如下方式检测:

AES 的加密模式属于分组密码模式。所谓分组密码,是加密时把明文按照固定的长度分组,然后再进行加密。当然,细节之处很很多不同。AES 分组模式有多种:ECB、CBC、CFB、OFB、CTR 五种分组模式。目前优先推荐使用 CBC 模式。

如果使用 CBC 模式,那么在加密的时候,就需要一个前置的加密向量 IV。当初博主在使用 AES 来加密的时候,就很奇怪一个对称加密为何要这个向量。因为,在博主寒冰的潜意识里,对称加密只需要一个密钥就 Ok 了。没想到 AES 加密还有多种模式,而这个 CBC 模式恰恰就需要一个这样的向量值。关于这个向量大家可以在网上查阅相关的资料。这个东西非常重要,也非常好理解。

关于 PHP AES 加解密会用到的相关方法:

AES 支持三种强度:128、192、256。128 位的强度最低,但是,加密解密速度较快。256 位强度最高,但是,加密解密速度最低。所以,大家根据自己系统的重要程度选择使用对应强度。通常普通的金融项目使用 192 位完整够用了。顶级的就用 256 位。其他的就用 128 位吧。

二、非对称加密

非对称加密是指公钥加密私钥解密,私钥加密公钥解密的算法。非对称加密的算法有很多。《图解密码技术》一书推荐使用 RSA 算法。它使用起来也非常简单。

要使用 RSA 算法。首先,我们必须生成一对公钥私钥。其实生成公钥私钥很简单。

在 Linux 系统,直接使用如下命令生成:

此命令会生 ~/.ssh/ 目录下生成两个文件:

id_rsa 是私钥, is_rsa.pub 是公钥。

关于 PHP RSA 加解密会用到的相关方法:

以上就是关于在 PHP 项目开发中,我们使用的加密解密算法的一个总结。博主寒冰在总结过程中难免会有不足之处,还请大家指正!谢谢!


文章标题:php公钥和私钥数据加密 公钥加密私钥解密和私钥加密公钥解密
路径分享:http://scyanting.com/article/hgeogh.html