gpt4 book ai didi

zend-framework - Zend_Crypt_DiffieHellman - 用法示例

转载 作者:行者123 更新时间:2023-12-04 06:40:43 25 4
gpt4 key购买 nike

是否有使用 Zend_Crypt_DiffieHellman 类的示例?我正在尝试编写一个桌面应用程序,它将以安全的方式与 Zend Framework 上的 PHP 服务器进行通信。我一直在理解如何在两方之间建立共享 key 。我需要获得一组我自己的素数吗?

任何有关如何使用它来获取共享 key 的示例将不胜感激!

我认为我真正的问题是如何获得素数和它的生成器!

最佳答案

如何得到一个群(由一个素数和一个生成元组成)

我绝不是密码学专家,但我认为您应该使用 RFC 2412 - The OAKLEY Key Determination Protocol (appendix E.1) 中定义的“知名组”或来自 RFC 3526 的组.在将它们与 Zend_Crypt_DiffieHellman 一起使用之前,您可能必须先将十六进制数转换为十进制数。

您应该使用哪个组?

越大越好 - 不,开个玩笑。

取决于您计划如何实现 key 交换。如果你必须在每个 HTTP 请求上执行 DH 交换,更大的组将杀死你的服务器,因为它需要更多的时间来计算(但另一方面更难破解)。在我的示例中,我使用了 768 位的“Well Known Group 1”,它相当慢(好吧,我的开发机器不是最快的)。

您还可以添加服务器和客户端在第一步中同意使用哪个预定义组的选项。例如:您在应用程序中提供众所周知的组 1、2 和 5。在实际的 DH key 交换之前,你们双方同意使用组 1 进行实际的 DH key 交换。这样您就可以在硬件 catch 时切换到更大的组。当然,此组协议(protocol)为您的 key 交换过程增加了另一个步骤。

Zend_Crypt_DiffieHellman 例子

这是一个简单的示例,实际上没有将公共(public)数据传输到另一个进程。

// why disable the use of openssl?
// apparently "computeSecretKey" uses the php function
// openssl_dh_compute_key which expects an openssl "pkey" resource but
// the Zend Framework (1.11.4) supplies a string
Zend_Crypt_DiffieHellman::$useOpenssl = false;

// here I define the Well Known Group 1 (which consists of the prime and
// the generator) with a 768 bit prime.
// These can be either hard coded ore your parties agree on which group to
// use in a separate step of the key-exchange process.
$public_prime =
"155251809230070893513091813125848175563133404943451431320235" .
"119490296623994910210725866945387659164244291000768028886422" .
"915080371891804634263272761303128298374438082089019628850917" .
"0691316593175367469551763119843371637221007210577919";
$public_generator = 2;

// if you want it to go fast use smaller values (these are from the
// Diffie Hellman entry on Wikipedia).
//$public_generator = 5;
//$public_prime = 23;

$bob = new Zend_Crypt_DiffieHellman($public_prime, $public_generator);
$alice = new Zend_Crypt_DiffieHellman($public_prime, $public_generator);

// first generate the private key and the public data on both sides
$bob->generateKeys();
$alice->generateKeys();

// you can access the public data using the "getPublicKey" method.
// You can transmit those values over the wire to the other party.
echo "bob=", $bob->getPublicKey(), PHP_EOL;
echo "alice=", $alice->getPublicKey(), PHP_EOL;

// After both parties have received the public data from the other party
// they can calculate the shared secret:
echo "shared(alice)=", $alice->computeSecretKey($bob->getPublicKey()), PHP_EOL;
echo "shared(bob )=", $bob->computeSecretKey($alice->getPublicKey()), PHP_EOL;
// the values should be equal.

唯一真正通过线路传递的是 Zend_Crypt_DiffieHellman::getPublicKey 的返回值。公共(public)数据可以编码为文本(Zend_Crypt_DiffieHellman::NUMBER)或二进制数据(Zend_Crypt_DiffieHellman::BINARY)。

还有另一个:Zend_Crypt_DiffieHellman::BTWOC,它与二进制相同但有前导零字节,所以整数不被视为“有符号”整数 - 如果您的客户端应用程序使用Java JCE 或 .NET Crypto API 这一个可能是二进制传输的最佳选择。

不请自来的建议

如果您想让您的生活更轻松,不要重新发明 SSL - 只需通过 HTTPS 使用现有的 SSL 实现即可。

大多数 SSL 库允许您检查服务器证书,因此请检查客户端服务器证书的有效性(至少检查指纹)。

如果您需要或想要,您可以在服务器上检查客户端的证书(参见 Using SSL Client Certificates with PHP)。

关于zend-framework - Zend_Crypt_DiffieHellman - 用法示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9176708/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com