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

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

如上原理,最后很容易通过数学原理证明(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
(0)

相关推荐

  • Node.js如何使用Diffie-Hellman密钥交换算法详解

    简介 Diffie-Hellman(简称DH)是密钥交换算法之一,它的作用是保证通信双方在非安全的信道中安全地交换密钥.目前DH最重要的应用场景之一,就是在HTTPS的握手阶段,客户端.服务端利用DH算法交换对称密钥. 下面会先简单介绍DH的数理基础,然后举例说明如何在nodejs中使用DH相关的API.下面话不多说了,来一起看看详细的介绍吧. 数论基础 要理解DH算法,需要掌握一定的数论基础.感兴趣的可以进一步研究推导过程,或者直接记住下面结论,然后进入下一节. 假设 Y = a^X mod

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

    迪菲-赫尔曼(Diffie–Hellman)是一个可以让双方在不安全的公共信道上建立秘钥的一种算法,双方后期就可以利用这个秘钥加密(如RC4)内容. 迪菲-赫尔曼(Diffie–Hellman)算法原理很简单: 如上原理,最后很容易通过数学原理证明(g^b%p)^a%p = (g^a%p)^b%p,因此它们得到一个相同的密钥. 上面除了a,b和最后得出的公共密钥是秘密的,其它都是可以在公共信道上传递.实际运用中p很大(300位以上),g通常取2或5.那么几乎不可能从p,g和g^a%p算出a(离散

  • 解读赫夫曼树编码的问题

    定义: 结点的带权路径长度为从该结点到树根之间的路径长度与结点上权的乘积.树的带权路径长度为树中所有叶子结点的带权路径长度之和.假设有n个权值,试构造一棵有n个叶子结点的二叉树,每个叶子结点带权为wi,则其中带权路径长度最小的二叉树称做最优二叉树或赫夫曼树. 构造赫夫曼树的方法: (1)根据给定的n个权值{w1,w2,w3......}构成n棵二叉树的集合F={T1,T2,T3,T4......},其中每棵二叉树Ti中只有一个带权为wi的根结点,其左右子树均空. (2)在F中选取两棵根结点的权值

  • Java实现赫夫曼树(哈夫曼树)的创建

    目录 一.赫夫曼树是什么? 1.路径和路径长度 2.节点的权和带权路径长度 3.树的带权路径长度 二.创建赫夫曼树 1.图文创建过程 2.代码实现 一.赫夫曼树是什么? 给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度(WPL)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近. 图1 一棵赫夫曼树 1.路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径.

  • React diff算法的实现示例

    前言 在上一篇文章,我们已经实现了React的组件功能,从功能的角度来说已经实现了React的核心功能了. 但是我们的实现方式有很大的问题:每次更新都重新渲染整个应用或者整个组件,DOM操作十分昂贵,这样性能损耗非常大. 为了减少DOM更新,我们需要找渲染前后真正变化的部分,只更新这一部分DOM.而对比变化,找出需要更新部分的算法我们称之为diff算法. 对比策略 在前面两篇文章后,我们实现了一个render方法,它能将虚拟DOM渲染成真正的DOM,我们现在就需要改进它,让它不要再傻乎乎地重新渲

  • vue的diff算法知识点总结

    源码:https://github.com/vuejs/vue/blob/dev/src/core/vdom/patch.js 虚拟dom diff算法首先要明确一个概念就是diff的对象是虚拟dom,更新真实dom则是diff算法的结果 Vnode基类 constructor ( ... ) { this.tag = tag this.data = data this.children = children this.text = text this.elm = elm this.ns = u

  • 提高NodeJS中SSL服务的性能

    在浏览互联网时,我们都知道,通过SSL进行加密是非常重要的.在贝宝(PayPal),安全是我们的首要任务.我们使用端到端的加密,不仅只是我们的公共网站,对于我们的内部服务调用也同样如此.SSL加密技术将在很大程度上影响node.js的性能.我们已经花时间调整我们的对外服务,并充分地利用他们.下面是一些我们发现能显著地提高SSL对外性能的SSL配置调整清单. SSL密码 开箱即用,Node.js 的SSL使用一组非常强大的密码算法.特别是,迪菲赫尔曼密钥交换和椭圆曲线算法是极其昂贵的.而且当你在默

  • Nginx+SSL搭建 HTTPS 网站

    一.HTTPS 是什么? 根据维基百科的解释: 复制代码 代码如下: 超文本传输安全协议(缩写:HTTPS,英语:Hypertext Transfer Protocol Secure)是超文本传输协议和SSL/TLS的组合,用以提供加密通讯及对网络服务器身份的鉴定.HTTPS连接经常被用于万维网上的交易支付和企业信息系统中敏感信息的传输.HTTPS不应与在RFC 2660中定义的安全超文本传输协议(S-HTTP)相混. HTTPS 目前已经是所有注重隐私和安全的网站的首选,随着技术的不断发展,H

  • Python实现ElGamal加密算法的示例代码

    在密码学中,ElGamal加密算法是一个基于迪菲-赫尔曼密钥交换的非对称加密算法.它在1985年由塔希尔·盖莫尔提出.GnuPG和PGP等很多密码学系统中都应用到了ElGamal算法. ElGamal加密算法可以定义在任何循环群G上.它的安全性取决于G上的离散对数难题. 使用Python实现ElGamal加密算法,完成加密解密过程,明文使用的是125位数字(1000比特). 代码如下: import random from math import pow a = random.randint(2

  • docker nginx + https 子域名配置详细教程

    今天刚好要帮朋友的服务器搬家,因此把服务器的基础设备都配置了一次, 但在配置的时候遇到了一些问题.原来现在的 google chrome / safari 是会 强制性把http转换成为https . 刚开始的时候并不知道什么回事,还将域名的记录重新设置了一遍.而且在 ping 的时候域名是能够成功被解析出服务器地址的,因此把矛头转向了 http -> https的过程中 ,我用微信的内置的浏览器发现是能够访问http的域名.因此要设置一下证书. 这边我使用的证书也是免费的 acme.sh 在g

随机推荐