数字货币钱包密钥,钱包密码和私钥的关系是什么,数字货币钱包私钥是什么
本文提供了有关如何生成椭圆曲线数字签名私钥的指导,并使用PHP7.0将其导出到以太网钱包地址。
您可以:
composer.json
{
要求:{
sop/asn1: ^3.3 ,
sop/加密编码: ^0.2.0,
"标准操作程序/加密类型":^0.2.1,
科恩鲁纳/凯克:^1.0 ,
symfony/dotenv: ^4.0 ,
sc0vu/web3 .PHP : dev-master
}
}
GenerateEthereumWallet.php
"需要一次"供应商/自动加载. PHP ;
使用op 加密类型非对称ECEC公共密钥;
使用op 加密类型非对称ECEC专用密钥;
使用sop 加密编码 PEM
用户角色列表(kec cak
$config=[
private _ key _ type =OpenSSL _ key type _ EC,
curve_name=secp256k1
];
$ RES=OpenSSL _ pkey _ new($ config);
如果(!$res
“回声”错误:失败生成私有密钥.- .OpenSSL _ error _ string(;
退出;
}
//生成私钥
OpenSSL_pkey_export($RES,$ priv _ key);
//获取公钥
$ key _ detail=OpenSSL _ pkey _ get _ details($ RES);
$ pub _ key=$ key _ detail[ key ];
$ priv _ PEM=PEM:3360 from string($ priv _ key);
//转换为椭圆曲线的私钥格式
$ EC _ priv _ key=EC私有密钥:3360 from PEM($ priv _ PEM);
//将其转换为ASN1结构
$ EC _ priv _ seq=$ EC _ priv _ key-to asn1(;
//十六进制的私钥和公钥
$ priv _ key _ hex=bin 2 hex($ EC _ priv _ seq-at(1)-asOctetString()-string));
$ priv _ key _ len=strlen($ priv _ key _ hex)/2;
$ pub _ key _ hex=bin 2 hex($ EC _ priv _ seq-at(3)-as tagged)-as explicit)-asBitString(字符串) )。
$ pub _ key _ len=strlen($ pub _ key _ hex)/2;
//从公钥导出以太网地址
//每个东部中央邮(政)区公钥总是以0x04开头。
//为了正确混列,必须删除开头0x04
$ pub _ key _ hex _ 2=substr($ pub _ key _ hex,2);
$ pub _ key _ len _ 2=strlen($ pub _ key _ hex _ 2)/2;
//哈希
$ hash=kec cak:3360 hash(hex 2 bin($ pub _ key _ hex _ 2),256);
//以太网地址的长度为20字节。 (十六进制字符40个字符的长度)
//只需要最后20个字节作为以太网地址
$ wallet _ address=0x .substr ($ hash,-40);
$ wallet _ private _ key=0x .$ priv _ key _ hex
echo rnethwalletaddress: .$ wallet _地址
回显 rnprivatekey: .$ wallet _ private _ key
代码条件
此代码需要PHP 7.0、OpenSSL扩展和服务器端编程语言(专业超文本预处理器的缩写)合成器。安装第三方软件包需要使用服务器端编程语言(专业超文本预处理器的缩写)合成器。
$作曲家安装
生成秘密密钥
以太网标准使用secp256k1曲线生成私钥。在我的教程中,我使用心脏出血函数生成了隐私增强邮件增强的私密电子邮件格式的椭圆曲线
私钥,如下所示:
$config=[
private _ key _ type =OPENSSL _ key type _ EC,
curve_name=secp256k1
];
$ RES=OpenSSL _ pkey _ new($ config);
如果(!$res) {
“回声”错误:无法生成私钥。- .OpenSSL _ error _ string();
退出;
}
//生成私钥
openssl_pkey_export($res,$ priv _ key);
//PEM格式
$ priv _ PEM=PEM:from string($ priv _ key);
之后我需要将私钥转换为ASN1序列,下面是ANS1序列的结构。
ECPrivateKey :=SEQUENCE {
版本整数{ ecprivkeyver 1(1)}(ecprivkeyver 1),
私人密钥八位字节字符串,
参数[0]EC参数{ {命名曲线} }可选,
公钥[1]位字符串可选
}
下面的代码是我如何从ANS1序列结构中查询十六进制字符串中的公钥和私钥。
//然后转换成ASN1结构
$ EC _ priv _ seq=$ EC _ priv _ key-toasn 1();
//十六进制的私钥公钥
$ priv _ key _ hex=bin 2 hex($ EC _ priv _ seq-at(1)-asOctetString()-string());
$ priv _ key _ len=strlen($ priv _ key _ hex)/2;
$ pub _ key _ hex=bin 2 hex($ EC _ priv _ seq-at(3)-as tagged()-as explicit()-asBitString()-string());
$ pub _ key _ len=strlen($ pub _ key _ hex)/2;
衍生以太坊钱包地址
以太坊钱包地址来自公钥。每个东部中央邮(政)区公钥始终以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(hex 2 bin($ pub _ key _ hex _ 2),256);
$wallet_address=0x 。substr($hash,-40);
$wallet_private_key=0x 。$ priv _ key _ hex
现在你有了wallet_private_key作为你以太坊钱包地址的私钥。
如何运行代码
$ PHP GenerateEthereumWallet.php
它将输出以太坊钱包地址及其私钥,如下所示:
ETH钱包地址:0xb2.
私钥:0x73.
======================================================================
分享一些以太坊、EOS、比特币等区块链相关的互动在线编程实用教程:
以太坊,主要介绍使用php进行智能合约开发交互、账户创建、交易、转账、令牌开发、过滤器和交易等。
用php开发比特币的教程。本课程面向初学者,涵盖比特币的核心概念,如区块链存储、去中心化共识机制、密钥和脚本、交易和UTXO等还详细解释了如何在Php代码中集成比特币支持功能,如创建地址、管理钱包、构造裸交易等。是Php工程师不可多得的比特币开发课程。
Python以太坊,主要供python工程师使用web3.py开发区块链以太坊。
java以太坊开发教程,主要为Java和android程序员开发区块链以太坊web3j详细讲解。
以太坊入门教程,主要介绍智能合约和dapp应用开发,适合初学者。
以太坊开发高级教程主要介绍了使用node.js、mongodb、区块链、ipfs的去中心化电商DApp实战,适合高级。
# C以太坊,主要讲解如何使用C#开发基于。Net,包括帐户管理、状态和交易、智能合同开发和交互、过滤和交易等。
EOS教程。本课程帮助您快速开始开发EOS区块链的分散式应用程序。涵盖了EOS工具链、账户和钱包、发放令牌、智能合约的开发和部署、使用代码与智能合约的交互等核心知识点。最后,综合运用所有知识点,开发出笔记DApp。
Java比特币开发教程。本课程面向初学者,涵盖比特币的核心概念,如区块链存储、去中心化共识机制、密钥和脚本、交易和UTXO等还详细解释了如何在Java代码中集成比特币支持功能,如创建地址、管理钱包、构造裸交易等。是Java工程师不可多得的比特币开发学习课程。
王辉的原文翻译。转载请注明出处。以下是原文。