leigh / poly1305
纯PHP实现的Poly1305 MAC算法。
Requires
- php: >=7.0
Requires (Dev)
- phpunit/phpunit: ~5.0
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命名空间中提供的单次函数authenticate
和verify
来生成和验证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);