leigh/poly1305

纯PHP实现的Poly1305 MAC算法。

0.2.0 2016-01-14 11:18 UTC

This package is not auto-updated.

Last update: 2024-09-12 00:04:59 UTC


README

此库包含Poly1305算法的纯PHP实现。

  • 基于GMP的实现需要GMP扩展和PHP 5.6或更高版本。
  • 基于GMPLegacy的实现需要GMP扩展和PHP 5.4或更高版本。
  • 本地实现需要PHP 5.4或更高版本且支持64位整数。

上述实现按性能顺序列出。

对于那些想要基于C的扩展,它位于自己的存储库中:Poly1305 PHP扩展

使用方法

您可以使用在Poly1305命名空间中提供的单次函数authenticateverify来生成和验证MAC。

使用256位唯一密钥生成MAC

$mac = Poly1305\authenticate($key, $message);

使用该密钥/消息组合的MAC验证其真实性

$valid = Poly1305\verify($mac, $key, $message);

请记住,密钥不能重复使用

您还可以直接使用Authenticator类。如果您正在流式传输消息并希望边走边生成MAC,这将更有用。

$auth = new Poly1305\Authenticator;

// Context preserves state between updates
$ctx = $auth->init($key);

while($messageChunk = getChunk()) {
    $auth->update($ctx, $messageChunk);
}

$mac = $poly1305->finish($ctx);

Poly1305-AES

此扩展可用于计算Poly1305-AES MAC,并包含针对此目的优化的AES函数。

如果您已安装OpenSSL扩展,则将使用它。MCrypt比捆绑的本地实现慢约2倍,且未维护,因此在此不受支持。

要使用Poly1305-AES,您需要三个128位字符串,而不是通常的256位密钥。

$r = '0123456789012345'; // "static" portion of Poly1305 key
$k = '0123456789012345'; // AES key
$n = '0123456789012345'; // Nonce

密钥现在通过计算$r . aes($k, $n)形成,允许$k$r在每次消息使用唯一$n的情况下保持不变。

本地实现有两种生成aes($k, $n)的优化方法,适用于不同的场景。OpenSSL版本提供相同的方法,但未优化(尽管如此,它仍然比本地实现快)。

如果您仅在脚本生命周期内执行一次AES操作(即,在Web请求期间),则使用单次kn(k, n)方法是最优的解决方案。

$aes = new Poly1305\AES();
$key = $r . $aes->kn($k, $n);
$mac = Poly1305\auth($key, $message);

如果您有一个长时间运行的脚本,将执行许多与增量或随机nonce的AES操作,则使用单独的k()n()方法是最优的解决方案。调用k()会缓存处理过的密钥,以便可以再次使用。

$aes = new Poly1305\AES();
$aes->k($k);

$key = $r . $aes->n($n);
$mac = Poly1305\auth($key, $message);

// change nonce

$key = $r . $aes->n($n);
$mac = Poly1305\auth($key, $message);