aiwozhe / phactor
Phactor 是基于 secp256k1 曲线参数的高性能 PHP 实现椭圆曲线数学函数库,用于生成和验证私钥/公钥(非对称)EC 密钥对和 ECDSA 签名。此库还包括一个用于生成服务识别号码(SINs)的类。
Requires
- php: ^7.4
- ext-bcmath: *
- ext-openssl: *
Requires (Dev)
- phpunit/phpunit: ^5.7.9
Suggests
- ext-gmp: Highest performing math library and preferred for this library's Elliptic Curve calculations.
README
描述
Phactor 是一个高性能的 PHP 实现椭圆曲线数学函数库,用于生成私钥/公钥 EC 密钥对和基于 secp256k1 曲线参数的 ECDSA 签名。此库还包括一个类,用于根据发布的 Identity Protocol v1 规范生成服务识别号码(SINs)。
这些 PHP 类目前设计用于与用于比特币相关加密操作的软件一起使用,但最终、长期的目标是成为一个更通用的数学库,也可以用于科学计算和其他非椭圆曲线加密项目——基本上任何需要 PHP 中任意精度数学函数方便接口的地方。
注意: 这些类需要 BC 或 GMP 数学 PHP 扩展(首选 GMP,但会使用 BC 作为后备)。您可以在以下位置了解更多有关 GMP 扩展的信息:https://php.ac.cn/manual/en/book.gmp.php
安装
使用 composer 安装此项目非常简单
php composer.phar require aiwozhe/phactor:1.1.0
如果您已安装 git,可以克隆存储库
git clone https://github.com/aiwozhe/phactor.git
或者您可以通过从 发布 页面下载 zip 文件,并将其内容提取到项目的源目录中手动安装。
注意: Phactor 正在积极开发中,因此您应始终从 发布 页面下载项目。这些包是生产环境中唯一应依赖的包,因为最前沿的源代码更改可能包含回归。
使用方法
将这些类与您的项目集成非常简单。例如,在包含必要的 Phactor 类文件(或使用自动加载器)后,要生成密钥对
$key = new \Phactor\Key; $info = $key->GenerateKeypair();
成功时将返回一个关联数组
Array ( [private_key_hex] => 7a4fbece43963538cb8f9149b094906168d71be36cfb405e6930fddb42da2c7d [private_key_dec] => 55323065337948610870652254548527896513063178460294714145329611159... [public_key] => 043fbbf44c3da3fec12bf7bac254fd176adc3eaed79470932b574d8d60728eb206fb7a... [public_key_compressed] => 033fbbf44c3da3fec12bf7bac254fd176adc3eaed79470932b574d8d607... [public_key_x] => 3fbbf44c3da3fec12bf7bac254fd176adc3eaed79470932b574d8d60728eb206 [public_key_y] => fb7ac7ac6959f75a6859a1a8d745db7e825a3c5c826e5b2e4950892b35772313 )
根据您硬件的速度,使用 GMP 生成密钥大约需要 10ms 或更少的时间。
要生成 ECDSA 签名
$sig = new \Phactor\Signature; $signature = $sig->generate('my message to sign...', $info['private_key_hex']);
这将返回以 ASN.1 DER 格式编码的签名
30440220421cfa96cb4f735cc768e8e2acd6bdf87c9b731ded3184f05a146ba0709cf24802204a21831926b14...
要验证现有签名,调用 Verify() 函数,它返回布尔值 true/false
$sig = new \Phactor\Signature; if ($sig->Verify($signature, $message, $publickey) == false) { // The signature is invalid - reject! } else { // The signature is valid. }
签名和密钥已针对 OpenSSL 进行测试,并具有互操作性。事实上,任何可以导入/导出正确 EC 密钥对和 ECDSA 签名的其他项目都将与此库兼容。
注意: 所有点和签名在返回给调用者之前都会经过数学验证。如果点或签名未通过验证方法,则会抛出 \Exception。
用于生成服务识别号码(SINs)的类的工作方式类似。传递十六进制形式的压缩公钥,例如
$sin = new \Phactor\Sin; print_r($sin->Generate($info['public_key_compressed']));
这将返回一个以字母 'T' 开头的单个 BASE-58 编码值(具体值取决于 SINs)。例如
Tf61EPoJDSjbp6tGoyjbTKq7XLABPVcyUwY
注意:在使用此类生成用于比特币相关项目的SIN时,未压缩公钥的使用已弃用。生成此目的的SIN时,请仅使用压缩公钥,以确保与比特币网络兼容。
发现了一个错误吗?
告诉我!发送一个pull请求或补丁。有问题吗?问!我将回应所有提交的问题。
支持
- GitHub问题
- 如果您在使用此库时遇到问题,请创建一个问题。
贡献
您想帮助这个项目吗?太好了!您不必是开发者。如果您发现了一个错误或有一个改进的想法,请创建一个问题并告诉我。
如果您是想为此项目贡献增强、错误修复或其他补丁的开发者,请将此存储库fork并提交一个pull请求,详细说明您的更改。我会审查所有PR!
这个开源项目是在MIT许可证下发布的,这意味着如果您想在自己的项目中使用此项目的代码,您可以自由使用。说到这里,如果您在一个酷炫的新项目中使用了Phactor,我想听听您的经历!
许可证
Copyright (c) 2015-2020 Rich Morgan, rich@richmorgan.me
The MIT License (MIT)
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.