php数据加密密钥 php加密技术

php 怎么生成rsa加密的公钥和私钥附上出处链接:
四php数据加密密钥 , 用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生成密钥(二)
为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加密解决 。
不过,对中间人攻击还是没办法 。
另外一个
PHP 加密:AES & RSA 最近两年一直从事与金融相关项目的开发与维护 。但是php数据加密密钥,关于 PHP 加密解密的最佳实践php数据加密密钥,网上没有人给出一个完美的总结 。恰逢最近看了《图解密码技术》一书 , 对 PHP 加解密有了更深刻的认识 。

推荐阅读