问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

[PHP]关于mcrypt加密方法的参数

发布网友 发布时间:2022-04-06 03:41

我来回答

2个回答

懂视网 时间:2022-04-06 08:02

php实现不对称加密的方法:首先创建一个PHP示例文件;然后使用openssl实现非对称加密;最后通过“$rsa = new Rsa('ssl-key');”进行测试即可。

推荐:《PHP视频教程》

PHP实现非对称加密


至于什么是非对称加密,这里就不说啦,大家谷歌去吧。这里说明的是,最近在做一个对外的充值加密服务,那么涉及到这个加密的处理,中间遇到几个小问题,所以记录下,方便自己下次查阅。

详细代码

<?php
/**
 * 使用openssl实现非对称加密
 * 
 * @since 2015-11-10
 */
class Rsa
{
 /**
 * 私钥
 * 
 */
 private $_privKey;
 /**
 * 公钥
 * 
 */
 private $_pubKey;
 /**
 * 保存文件地址
 */
 private $_keyPath;
 /**
 * 指定密钥文件地址
 * 
 */
 public function __construct($path)
 {
 if (empty($path) || !is_dir($path)) {
  throw new Exception('请指定密钥文件地址目录');
 }
 $this->_keyPath = $path;
 }
 /**
 * 创建公钥和私钥
 * 
 */
 public function createKey()
 {
 $config = [
  "config" => 'D:wampinapacheapache2.4.9confopenssl.cnf',
  "digest_alg" => "sha512",
  "private_key_bits" => 4096,
  "private_key_type" => OPENSSL_KEYTYPE_RSA,
 ];
 // 生成私钥
 $rsa = openssl_pkey_new($config);
 openssl_pkey_export($rsa, $privKey, NULL, $config);
 file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR . 'priv.key', $privKey);
 $this->_privKey = openssl_pkey_get_public($privKey);
 // 生成公钥
 $rsaPri = openssl_pkey_get_details($rsa);
 $pubKey = $rsaPri['key'];
 file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR . 'pub.key', $pubKey);
 $this->_pubKey = openssl_pkey_get_public($pubKey);
 }
 /**
 * 设置私钥
 * 
 */
 public function setupPrivKey()
 {
 if (is_resource($this->_privKey)) {
  return true;
 }
 $file = $this->_keyPath . DIRECTORY_SEPARATOR . 'priv.key';
 $privKey = file_get_contents($file);
 $this->_privKey = openssl_pkey_get_private($privKey);
 return true;
 }
 /**
 * 设置公钥
 * 
 */
 public function setupPubKey()
 {
 if (is_resource($this->_pubKey)) {
  return true;
 }
 $file = $this->_keyPath . DIRECTORY_SEPARATOR . 'pub.key';
 $pubKey = file_get_contents($file);
 $this->_pubKey = openssl_pkey_get_public($pubKey);
 return true;
 }
 /**
 * 用私钥加密
 * 
 */
 public function privEncrypt($data)
 {
 if (!is_string($data)) {
  return null;
 }
 $this->setupPrivKey();
 $result = openssl_private_encrypt($data, $encrypted, $this->_privKey);
 if ($result) {
  return base64_encode($encrypted);
 }
 return null;
 }
 /**
 * 私钥解密
 * 
 */
 public function privDecrypt($encrypted)
 {
 if (!is_string($encrypted)) {
  return null;
 }
 $this->setupPrivKey();
 $encrypted = base64_decode($encrypted);
 $result = openssl_private_decrypt($encrypted, $decrypted, $this->_privKey);
 if ($result) {
  return $decrypted;
 }
 return null;
 }
 /**
 * 公钥加密
 * 
 */
 public function pubEncrypt($data)
 {
 if (!is_string($data)) {
  return null;
 }
 $this->setupPubKey();
 $result = openssl_public_encrypt($data, $encrypted, $this->_pubKey);
 if ($result) {
  return base64_encode($encrypted);
 }
 return null;
 }
 /**
 * 公钥解密
 * 
 */
 public function pubDecrypt($crypted)
 {
 if (!is_string($crypted)) {
  return null;
 }
 $this->setupPubKey();
 $crypted = base64_decode($crypted);
 $result = openssl_public_decrypt($crypted, $decrypted, $this->_pubKey);
 if ($result) {
  return $decrypted;
 }
 return null;
 }
 /**
 * __destruct
 * 
 */
 public function __destruct() {
 @fclose($this->_privKey);
 @fclose($this->_pubKey);
 }
}
?>

测试

$rsa = new Rsa('ssl-key');
//私钥加密,公钥解密
echo "待加密数据:segmentfault.com
";
$pre = $rsa->privEncrypt("segmentfault.com");
echo "加密后的密文:
" . $pre . "
";
$pud = $rsa->pubDecrypt($pre);
echo "解密后数据:" . $pud . "
";
//公钥加密,私钥解密
echo "待加密数据:segmentfault.com
";
$pue = $rsa->pubEncrypt("segmentfault.com");
echo "加密后的密文:
" . $pue . "
";
$prd = $rsa->privDecrypt($pue);
echo "解密后数据:" . $prd;

重要问题

这里特别要注意的是在配置中要指定openssl.cnf的文件地址,或者设置个OPENSSL_CONF全局变量就可以了。

热心网友 时间:2022-04-06 05:10

首先纠正一个问题,128不是说你的key要128个字符,128只是说加密后的密文是128位,也就是16个字节(1个字节是8位, 16 * 8 = 128);

加密对key没有强制要求,当你是null的时候,也是可以的,null只是我们人为约定不表示任何内容,内容为空,但是作为计算机存储,也是用二进制表示的;

Key用于和给定的密文进行计算,从而得到结果。加密中用的key就相当于钥匙,你加密后,如果需要解密,就必须提供钥匙。在非对称加密中,存在两个不同的key,非对称加密通常用于证书签名,我们通常说的公钥和私钥,其实就是这里的key,用公钥加密,就需要用私钥解密,用私钥加密,就需要用公钥解密;对称加密就只有一个key,加密解密都需要塔,就像你上面这里这个方法。在对称加密中,你需要保证key的安全,就像你不能把钥匙随便给人一样。

iv,我们通常成为初始化向量,但是用英语的话更容易明白,即:initial value,初始值,我们在加密的时候需要一个初始值,主要是为了加密结果更随机。


如果你想了解更多的话,可能就需要专门了解加密的相关内容了。

推荐你看下下面的内容:

http://www.ciphersbyritter.com/GLOSSARY.HTM

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
在公交车上实施扒窃,会受到怎样的处罚? 交通违法行为识别 公交车扒窃会如何处罚? 郑州鱼缸清洗找哪家公司做得比较好? 郑州有没有专业维修鱼缸,清洗鱼缸的? ...的鱼缸,放在办公室养些鱼水草之类的。郑州哪里有卖这样的鱼缸。_百... 我们公司想要定做个观赏鱼缸,不知道郑州哪家公司最专业? 谁知道郑州生态鱼缸定做哪家做的效果最好? 联想电脑启用无线功能的功能键? 笔记本电脑怎么连接网笔记本电脑怎样连接无线网 php 非对称加密 用于什么情况 php 如何正则替换数组 PHP正则匹配数字问题 php如何用正则表达式去掉数字 PHP正则表达式替换时,如何直接替换成数组值. 在线等 php 正则替换 php中 正则表达式替换问题 php正则匹配数字 php正则动态替换 php正则替换:2 9 8 8 12 15 + 8 这是一串数字(数字的个数不一定),数字间的空格数量不一定; php正则替换变量数字“str_replace”怎么用? php 正则替换数字的问题 PHP正则替换数字 php 正则替换变量数字 str_replace 怎么用 电脑快捷键大全截图 php 正则替换url参数 比如页数p=x 如何实现? php指定范围批量正则匹配与替换 PHP正则表达式如何匹配出域名? php 匹配替换 PHP正则函数替换问题 php代码怎么加密最好,不能破解的那种 PHP中给源代码加密的几种方法 PHP代码如何加密? php实现rsa算法,该怎么处理 php 一共有几种加密方式? 请问在Php中有什么双向加密的方法?请告之方法名称及代码.谢谢 php中RSA加密,明文超长,需要分段加密该怎么做 php 非对称加密算法 可以破解吗 java加密用PHP解密 php怎么实现java接口的对称加密 php查询数组并替换字符 关于php 构建购物车里面,用到session 书上有这样一段程序 thinkphp做的session购物车,求详细代码。有完整例子的可以发下。非常感谢 请问一下php做购物车为什么要用SESSION来实现呢? ASP.NET中如何用session来实现购物车的功能? php购物车功能 结合session和数据库怎么结合求代码 php 最新的购物车session类 php购物车如何获取多个商品的id,用$_SESSION[&#39;id&#39;]=$_SESSION[&#39;id&#39;].$GET[&#39;id&#39;].&quot;@&quot;这个书上的方法。 php 类中 通过成员方法访问成员变量有什么好处,我知道是争对于安全性,但不能解释怎么个安全法, 在PHP方法(或成员函数)上除了对象可作为参数限定类型外,还有什么可作为参数限定类