附上出处链接:
四,用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();
}
hexstr()是自己添加的函数,用来把十进制字符串转换为十六进制.对Crypt_RSA_Math_GMP很简单,只需:
function hexstr($num){
对Crypt_RSA_Math_BCMath略麻烦些:
$result = '';
do{
}while(bccomp($num, 0));
return ltrim($result,'0');
五,用php生成密钥(二)
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)
$e = $this-_math_obj-nextPrime($this-_math_obj-dec($e));//取个素数
else
{
while(true)
$e = $this-_math_obj-getRand($q_len, $this-_random_generator);
continue;
$e = $this-_math_obj-nextPrime($this-_math_obj-dec($e));
break;
$p = $this-_math_obj-getRand($p_len, $this-_random_generator, true);
$p = $this-_math_obj-nextPrime($p);
$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))))
}while(true);
六,干什么用
加密比较重要的数据.比如注册时用户输入的密码.
登录时把密码hmac一下就可以防止重放攻击(replay attack)了.对注册不存在这种攻击,但有密码泄露的危险.上传密码hash那点安全性根本不算什么.这个可以用RSA加密解决.
不过,对中间人攻击还是没办法.
另外一个
以下是资料:
php中数字签名与校验
① 先用php生成一对公钥和私钥
$res = openssl_pkey_new();
openssl_pkey_export($res,$pri);
$d= openssl_pkey_get_details($res);
$pub = $d['key'];
var_dump($pri,$pub);
输出依次为私钥和公钥的pem字串,如:
mmlSmN1enhoCUqc=
-----END PRIVATE KEY-----
"
-----END PUBLIC KEY-----
$res = openssl_pkey_get_private($pri);
if (openssl_sign('hello', $out, $res))
$res = openssl_pkey_get_public($pubkey);
if (openssl_verify('hello', $sig, $res) === 1)
; // 通过验证
php中这种签名使用的是RSA算法;数字签名可以在 单点登录 等系统中派上用场.
以下命令来生成密钥对.
-out private_key.pem -nocrypt
这个命令得到的公共密钥.
$ openssl rsa -in mykey.pem -pubout -outform DER -out public_key.der
我写了两方法读取私钥和公钥
分别.public PrivateKey getPemPrivateKey(String filename, String algorithm) throws Exception {
File f = new File(filename);
FileInputStream fis = new FileInputStream(f);
DataInputStream dis = new DataInputStream(fis);
byte[] keyBytes = new byte[(int) f.length()];
dis.readFully(keyBytes);
dis.close();
String temp = new String(keyBytes);
String privKeyPEM = temp.replace("-----BEGIN PRIVATE KEY-----\n", "");
privKeyPEM = privKeyPEM.replace("-----END PRIVATE KEY-----", "");
//System.out.println("Private key\n"+privKeyPEM);
KeyFactory kf = KeyFactory.getInstance(algorithm);
return kf.generatePrivate(spec);
public PublicKey getPemPublicKey(String filename, String algorithm) throws Exception {
String publicKeyPEM = temp.replace("-----BEGIN PUBLIC KEY-----\n", "");
publicKeyPEM = privKeyPEM.replace("-----END PUBLIC KEY-----", "");
return kf.generatePublic(spec);
最近两年一直从事与金融相关项目的开发与维护.但是,关于 PHP 加密解密的最佳实践,网上没有人给出一个完美的总结.恰逢最近看了<<图解密码技术>>一书,对 PHP 加解密有了更深刻的认识.
为了避免各位看枯燥的文字理论,开篇我就把总结给出:
第一段:对称加密
对称加密的特点是加解密速度快,加密后的密文强度目前还没有硬解的可能性.但是,在未来随着计算机性能的提升有可能会出现被破解的可能性.
对称加密的缺点也很明显.对称加密的加密过程与解密过程使用的是同一把密钥.一旦泄漏密钥,加密就失去了任何意义.
根据<<图解密码技术>>一书的推荐,对称加密目前推荐使用 AES.在 PHP 当中要实现 AES 加解密,是使用 openssl 扩展来实现.所以,请确保你的 PHP 已经开启了 openssl 扩展.
可以通过如下方式检测:
或者如下方式检测:
AES 的加密模式属于分组密码模式.所谓分组密码,是加密时把明文按照固定的长度分组,然后再进行加密.当然,细节之处很很多不同.AES 分组模式有多种:ECB、CBC、CFB、OFB、CTR 五种分组模式.目前优先推荐使用 CBC 模式.
如果使用 CBC 模式,那么在加密的时候,就需要一个前置的加密向量 IV.当初博主在使用 AES 来加密的时候,就很奇怪一个对称加密为何要这个向量.因为,在博主寒冰的潜意识里,对称加密只需要一个密钥就 Ok 了.没想到 AES 加密还有多种模式,而这个 CBC 模式恰恰就需要一个这样的向量值.关于这个向量大家可以在网上查阅相关的资料.这个东西非常重要,也非常好理解.
关于 PHP AES 加解密会用到的相关方法:
第二段:非对称加密
非对称加密是指公钥加密私钥解密,私钥加密公钥解密的算法.非对称加密的算法有很多.<<图解密码技术>>一书推荐使用 RSA 算法.它使用起来也非常简单.
要使用 RSA 算法.首先,我们必须生成一对公钥私钥.其实生成公钥私钥很简单.
在 Linux 系统,直接使用如下命令生成:
此命令会生 ~/.ssh/ 目录下生成两个文件:
id_rsa 是私钥, is_rsa.pub 是公钥.
关于 PHP RSA 加解密会用到的相关方法:
以上就是土嘎嘎小编为大家整理的php生成秘钥和公钥相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!