php - 将在 PHP 中实现的简单密码学问题

标签 php cryptography

我需要实现几个符合以下条件的函数:

  1. 函数 genKey:给定一个字符串 q(这可能是 MD5 或 SHA 哈希)和一个种子字符串,该函数必须生成一个新的字符串 p

  2. 函数 checkKey:如果字符串 p 是从字符串 q 生成的(使用前面的函数),则此函数必须返回 true

在伪代码中,上面的内容是这样的:

p=genKey(q,seed) ; // generate string p from q and seed 

checkKey(p,q)==true ; // if p was generated from q, then this must return true. False otherwise.

有谁知道现有的算法可以做这样的事情吗?
如果没有已知的 PHP 实现,我可以自己实现这些算法,所以我真正要求的是完成这个过程的过程。

最佳答案

听起来您可能正在尝试描述 MAC。

消息验证码采用消息摘要、 secret 和消息。 secret 和数据一起散列,结果包含在消息中。

知道 secret 的消息接收者可以执行相同的摘要计算,并将他的 MAC 与接收到的消息附带的 MAC 进行比较。如果它们相等,他就可以相信消息没有被更改。


鉴于您的意见,我现在了解到您正在使用非对称 key ,而不是将在 MAC 中使用的 secret key 。

然而,还是有一点困惑。通常,私有(private)签名 key 由其所有者保密,在本例中似乎是客户端。客户可以在不公开私钥的情况下以加密方式证明他们拥有与公钥相对应的私钥。

使用数字签名,你可以做这样的事情:

p = genKey(pvt, seed)
checkKey(pub, p)

这里,pvt 是服务器的私钥,pub 是它的公钥。 seed 参数是被签名的数据。如果我了解您的应用程序(对此我表示怀疑),seed 应该是客户端标识符。那么p就是将seed和它的签名捆绑在一起的消息格式。您的问题令人困惑,因为 q 用于生成和验证 p — 就像共享 secret 一样。

但是,这个方案(或 MAC 方案)中没有任何内容可以阻止一个客户端使用另一个客户端的 p 值。使用这种技术所能做的就是确保消息内容没有被更改。例如,如果消息类似于“clientID=Alice,IPAddress=192.168.1.1”,您可以确保 Mallory 没有用自己的 IP 地址替换 Alice 的 IP 地址。

但是如果消息只是“clientID=Alice”,你就无法阻止 Alice 将她的防篡改消息给 Bob(作为分摊许可成本的返回),你也无法控制 Mallory 是否破解进入爱丽丝的盒子并窃取消息。

顺便说一句,如果消息完整性真的是您所需要的,并且您可以轻松地在发送方和接收方之间共享 secret ,那么 MAC 相对于公钥密码术有一些很好的优势,例如更小的消息大小和更快的性能.

概述您要防御的威胁。密码学很难。设计未经尝试的方案通常以失败告终。

关于php - 将在 PHP 中实现的简单密码学问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/762221/

相关文章:

java - 如何安装或导入用于 Java 的 Bouncy CaSTLe Cryptography API; ZIP 没有 .class 文件;使用 netbeans ide

php - 山魈验证错误

php - AES_DECRYPT SELECT WHERE 不起作用

iOS RSA 解密成功但解密数据似乎已损坏

php - PHP 中的 "Signed"电子邮件

javascript - 使用 Node 解密的ruby加密数据

java - Java中如何基于数据签名,但基于哈希验证?

php - 使用 php 和 magic quote 插入 HTML 代码

php - AWS SWF 关闭事件未发送至决策程序

php - SQL 错误 : Returned value is boolean?