迪菲-赫尔曼密钥交换(Diffie?Hellman)算法原理和PHP实现版


Posted in PHP onMay 12, 2015

迪菲-赫尔曼(Diffie?Hellman)是一个可以让双方在不安全的公共信道上建立秘钥的一种算法,双方后期就可以利用这个秘钥加密(如RC4)内容。
迪菲-赫尔曼(Diffie?Hellman)算法原理很简单:

迪菲-赫尔曼密钥交换(Diffie?Hellman)算法原理和PHP实现版

如上原理,最后很容易通过数学原理证明(g^b%p)^a%p = (g^a%p)^b%p,因此它们得到一个相同的密钥。
上面除了a,b和最后得出的公共密钥是秘密的,其它都是可以在公共信道上传递。实际运用中p很大(300位以上),g通常取2或5。那么几乎不可能从p,g和g^a%p算出a(离散数学问题)。

很多语言都对该算法做了实现,以PHP package中Crypt_DiffieHellman为例:

<?php
include 'DiffieHellman.php';
 
/*
 *   Alice: prime = 563
 *       generator = 5
 *       private key = 9
 *   Bob:  prime = 563
 *       generator = 5
 *       private key = 14
 */
 
$p = 563;
$g = 5;
$alice = new Crypt_DiffieHellman($p, $g, 9);
$alice_pubKey = $alice->generateKeys()->getPublicKey();
 
$bob = new Crypt_DiffieHellman($p, $g, 14);
$bob_pubKey = $bob->generateKeys()->getPublicKey();
 
$alice_computeKey = $alice->computeSecretKey($bob_pubKey)->getSharedSecretKey();
$bob_computeKey = $bob->computeSecretKey($alice_pubKey)->getSharedSecretKey();
 
echo "{$alice_pubKey}-{$bob_pubKey}-{$alice_computeKey}-{$bob_computeKey}"; //78-534-117-117
PHP 相关文章推荐
php json与xml序列化/反序列化
Oct 28 PHP
PHP变量的定义、可变变量、变量引用、销毁方法
Dec 20 PHP
PHP命令行脚本接收传入参数的三种方式
Aug 20 PHP
PHP页面实现定时跳转的方法
Oct 31 PHP
编写PHP程序检查字符串中的中文字符个数的实例分享
Mar 17 PHP
Yii编程开发常见调用技巧集锦
Jul 15 PHP
功能强大的php文件上传类
Aug 29 PHP
DEDE实现转跳属性文档在模板上调用出转跳地址
Nov 04 PHP
PHP基于递归算法解决兔子生兔子问题
May 11 PHP
PHP 实现手机端APP支付宝支付功能
Jun 07 PHP
PHP正则判断一个变量是否为正整数的方法
Feb 27 PHP
PHP 并发场景的几种解决方案
Jun 14 PHP
PHP 反射(Reflection)使用实例
May 12 #PHP
PHP Reflection API详解
May 12 #PHP
php通过curl模拟登陆DZ论坛
May 11 #PHP
PHP中的魔术方法总结和使用实例
May 11 #PHP
php基于curl扩展制作跨平台的restfule 接口
May 11 #PHP
PHP SPL标准库中的常用函数介绍
May 11 #PHP
PHP中的类型约束介绍
May 11 #PHP
You might like
php CI框架插入一条或多条sql记录示例
2014/07/29 PHP
js 动态选中下拉框
2009/11/26 Javascript
本地对象Array的原型扩展实现代码
2010/12/04 Javascript
分页栏的web标准实现
2011/11/01 Javascript
javascript学习笔记(十) js对象 继承
2012/06/19 Javascript
javascript中HTMLDOM操作详解
2014/12/11 Javascript
jQuery插件Elastislide实现响应式的焦点图无缝滚动切换特效
2015/04/12 Javascript
js删除数组元素、清空数组的简单方法(必看)
2016/07/27 Javascript
AngularJs定制样式插入到ueditor中的问题小结
2016/08/01 Javascript
js获取Get值的方法
2016/09/29 Javascript
Angular1.x自定义指令实例详解
2017/03/01 Javascript
使用requirejs模块化开发多页面一个入口js的使用方式
2017/06/14 Javascript
基于Vue开发数字输入框组件
2017/12/19 Javascript
jQuery实现的淡入淡出与滑入滑出效果示例
2018/04/18 jQuery
React 无状态组件(Stateless Component) 与高阶组件
2018/08/14 Javascript
Vue实现美团app的影院推荐选座功能【推荐】
2018/08/29 Javascript
js使用Promise实现简单的Ajax缓存
2018/11/14 Javascript
微信小程序 scroll-view的使用案例代码详解
2020/06/11 Javascript
Python批量创建迅雷任务及创建多个文件
2016/02/13 Python
Python使用sorted排序的方法小结
2017/07/28 Python
python获取命令行输入参数列表的实例代码
2018/06/23 Python
Flask框架模板渲染操作简单示例
2019/07/31 Python
tensor和numpy的互相转换的实现示例
2019/08/02 Python
OpenCV模板匹配matchTemplate的实现
2019/10/18 Python
python框架flask表单实现详解
2019/11/04 Python
浅谈python中频繁的print到底能浪费多长时间
2020/02/21 Python
html5 利用canvas手写签名并保存的实现方法
2018/07/12 HTML / CSS
新秀丽官方旗舰店:Samsonite拉杆箱、双肩包、皮具
2018/03/05 全球购物
超市国庆节促销方案
2014/02/20 职场文书
宣传部部长竞选演讲稿
2014/04/26 职场文书
竞选劳动委员演讲稿
2014/04/28 职场文书
反邪教警示教育方案
2014/05/13 职场文书
敬老院志愿者活动总结
2015/05/06 职场文书
nginx前后端同域名配置的方法实现
2021/03/31 Servers
深入浅析Django MTV模式
2021/09/04 Python
python 镜像环境搭建总结
2022/09/23 Python