本文将提供有关如何生成ECDSA私钥的指南,然后使用PHP7.0++导出到以太坊钱包地址。
你可以找到以下工作实现:
composer.json
{
"require": {
"sop/asn1": "^3.3",
"sop/crypto-encoding": "^0.2.0",
"sop/crypto-types": "^0.2.1",
"kornrunner/keccak": "^1.0",
"symfony/dotenv": "^4.0",
"sc0vu/web3.php": "dev-master"
}
}
GenerateEthereumWallet.php
<?php
require_once "vendor/autoload.php";
use Sop\CryptoTypes\Asymmetric\EC\ECPublicKey;
use Sop\CryptoTypes\Asymmetric\EC\ECPrivateKey;
use Sop\CryptoEncoding\PEM;
use kornrunner\keccak;
$config = [
'private_key_type' => OPENSSL_KEYTYPE_EC,
'curve_name' => 'secp256k1'
];
$res = openssl_pkey_new($config);
if (!$res) {
echo 'ERROR: Fail to generate private key. -> ' . openssl_error_string();
exit;
}
// 生成私钥
openssl_pkey_export($res, $priv_key);
// 获取公钥
$key_detail = openssl_pkey_get_details($res);
$pub_key = $key_detail["key"];
$priv_pem = PEM::fromString($priv_key);
// 转换为椭圆曲线私钥格式
$ec_priv_key = ECPrivateKey::fromPEM($priv_pem);
// 然后将其转换为ASN1结构
$ec_priv_seq = $ec_priv_key->toASN1();
// HEX中的私钥和公钥
$priv_key_hex = bin2hex($ec_priv_seq->at(1)->asOctetString()->string());
$priv_key_len = strlen($priv_key_hex) / 2;
$pub_key_hex = bin2hex($ec_priv_seq->at(3)->asTagged()->asExplicit()->asBitString()->string());
$pub_key_len = strlen($pub_key_hex) / 2;
// 从公钥导出以太坊地址
// 每个EC公钥始终以0x04开头,
// 我们需要删除前导0x04才能正确hash它
$pub_key_hex_2 = substr($pub_key_hex, 2);
$pub_key_len_2 = strlen($pub_key_hex_2) / 2;
// Hash
$hash = Keccak::hash(hex2bin($pub_key_hex_2), 256);
// 以太坊地址长度为20个字节。 (40个十六进制字符长)
// 我们只需要最后20个字节作为以太坊地址
$wallet_address = '0x' . substr($hash, -40);
$wallet_private_key = '0x' . $priv_key_hex;
echo "\r\n ETH Wallet Address: " . $wallet_address;
echo "\r\n Private Key: " . $wallet_private_key;
代码条件
该代码需要PHP 7.0++,OpenSSL扩展和PHP Composer。需要使用PHP Composer来安装第三方软件包。
$ composer install
生成私钥
以太坊标准是使用secp256k1曲线生成私钥。在我的教程中,我使用OpenSSL函数生成PEM格式的椭圆曲线私钥,如下所示:
$config = [
'private_key_type' => OPENSSL_KEYTYPE_EC,
'curve_name' => 'secp256k1'
];
$res = openssl_pkey_new($config);
if (!$res) {
echo 'ERROR: Fail to generate private key. -> ' . openssl_error_string();
exit;
}
// Generate Private Key
openssl_pkey_export($res, $priv_key);
// PEM Format
$priv_pem = PEM::fromString($priv_key);
之后我需要将私钥转换为ASN1序列,下面是ANS1序列的结构。
ECPrivateKey ::= SEQUENCE {
version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),
privateKey OCTET STRING,
parameters [0] ECParameters {{ NamedCurve }} OPTIONAL,
publicKey [1] BIT STRING OPTIONAL
}
下面的代码是我如何从ANS1序列结构中查询十六进制字符串中的公钥和私钥。
// Then convert it to ASN1 Structure
$ec_priv_seq = $ec_priv_key->toASN1();
// Private Key & Public Key in HEX
$priv_key_hex = bin2hex($ec_priv_seq->at(1)->asOctetString()->string());
$priv_key_len = strlen($priv_key_hex) / 2;
$pub_key_hex = bin2hex($ec_priv_seq->at(3)->asTagged()->asExplicit()->asBitString()->string());
$pub_key_len = strlen($pub_key_hex) / 2;
衍生以太坊钱包地址
以太坊钱包地址来自公钥。每个EC公钥始终以0x04开头。为了获得以太坊钱包地址的正确哈希值,我们需要删除前导0x04。
$pub_key_hex_2 = substr($pub_key_hex, 2);
$pub_key_len_2 = strlen($pub_key_hex_2) / 2;
我们继续使用EC公钥的Keccak256哈希。 以太坊钱包地址长度为20个字节,长度为40个字符,因此我们只需要哈希数据的最后20个字节。
$hash = Keccak::hash(hex2bin($pub_key_hex_2), 256);
$wallet_address = '0x' . substr($hash, -40);
$wallet_private_key = '0x' . $priv_key_hex;
现在你有**$wallter_address存储你新生成的以太坊钱包地址,$wallet_private_key**是你以太坊钱包地址的私钥。
如何运行代码
$ php GenerateEthereumWallet.php
它将输出以太坊钱包地址及其私钥,如下所示:
ETH Wallet Address: 0xb2...
Private Key: 0x73...
======================================================================
分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:
php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。
- php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。
汇智网原创翻译,转载请标明出处。这里是原文
相关推荐
用web3.php操作以太坊私链的具体代码。php需要使用composer。
php 以太坊web3代码工具版本,请放心使用,亲测可用版
使用区块链的证书生成和验证 使用以太坊在本地区块链设置上构建并部署在Rinkeby测试网络上。 合同部署在0x89c34c6a0d4c7587e9120a533757f380f4676887 RPC网络Rinkeby测试网络建立本地开发环境的步骤设置本地区块链...
以太坊开发环境搭建
本文将介绍在使用Solidity开发以太坊智能合约时常用的一些Gas优化模式。 以太坊教程链接: Dapp入门 | 电商Dapp实战 | Token实战 | Php对接 | Java对接 | Python对接 | C#对接 | Dart对接 1、使用短路模式排序...
完整RSA密钥生成代码和JS加密、PHP解密示例,快速上手使用,提高系统数据安全性!
适用于PHP的以太坊客户端 PHP版本以太坊JSON RPC客户端。 可通过简单的添加合约地址和ABI来方便的调用合约内部的方法,对于需要对交易签名的请求,客户端会自动完成。 支持对事件(日志)的监听,但需要通过计时器...
PHP通过OpenSSL生成证书、密钥并且加密解密数据,以及公钥,私钥和数字签名的理解 php代码简单生成 容易理解
游览器生成,存在兼容性问题 测试使用chrome通过 ,解决了以太坊离线相关 生成二进制 使用sendRawTranscation 进行传送data
在这篇文章中我们给大家分享了关于PHP与以太坊交互的相关知识点内容,有兴趣的朋友们阅读下吧。
FPDF中的F意味着自由:你可以使用它的任何一种使用和修改它以适合你的需要。 FPDF还有其它优点:高水平的功能。这里是一个列表,它的主要特点: 计量单位的选择,网页格式和利润 页眉和页脚管理 自动分页符 自动换行...
web3.php 一个与以太坊区块链和生态系统进行交互的php接口。安装为开发人员设置最低稳定性"minimum-stability": "dev"然后composer require sc0vu/web3.php dev-master或者您可以在composer.json中添加此行"sc0vu/...
PhpOffice这是一个强大的PHP库用于创建Word文件。事实上许多办公软件可以打开.docx文件(Office Open XML) 。利用这个库可以插入文本、Text分段、页分段、页头/页脚、表格、列表元素、超链接、并进行格式化。
一个使用json生成php class代码的工具
php 生成SITEMAP 代码 部分源码 //网址 private $weburl='http://www.wna.com/'; //更新的频率 private $frequency='weekly'; //always、hourly、daily、weekly、monthly、yearly、never //需要显示出来的扩展...
使用PHP生成专属邀请码 一、开发环境 1、环境搭建:Windows 8+Apache 2.4.18+MySQL 5.7.11+PHP 7.1.0 。 2、文本编辑器:Sublime Text3。...本实验主要使用JAVASCRIPT和一定的算法实现生成专属邀请码。
php生成PDF电子合同签名
使用方法:实例化类 TCPDF2DBarcode(文件tcpdf_barcodes_2d.php),使用getBarcodePNG方法即可生成。 例:新建个PHP文件 barcode.php <?php require_once ("tcpdf_barcodes_2d.php"); $code = "hello"; $type = ...
用PHP语言,PHP生成海报,二维码,名片等,可以自行定义文字,图片位置,里面有效果图,运行index.php可以自行生成图片。
PHP生成各种图表的代码---pChart