首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在php中以十六进制方式签署ECDSA签名并编码为DER格式?

如何在php中以十六进制方式签署ECDSA签名并编码为DER格式?
EN

Stack Overflow用户
提问于 2021-09-11 22:45:11
回答 1查看 1.7K关注 0票数 2

如何用Keccak256密钥对包括ETH、secp256k1 (ECDSA)散列地址签名在内的Tx数据进行签名,并以十六进制编码DER格式,并在php中进行验证?

我只想使用随附的php库,openssl和其他库,使secp256k1私钥和公钥,签名,并转换成DER格式的hex,以制作我的密码硬币样本。

以太地址由secp256k1 EDSA键创建,用Keccak256 (sha-3-256)哈希算法对私钥生成的256 bits/64 character公开密钥进行哈希运算,然后从十六进制哈希字符串中取出最后40个字符,添加校验和,并在哈希字符串中添加x0前缀。

该示例在github.com/simplito/elliptic-php repo中显示为elliptic-php/lib/EC/Signature.php中的toDER()函数。这个库正在使用BN-php,但我只想使用php库、openssl和其他库。

代码语言:javascript
运行
AI代码解释
复制
// https://github.com/simplito/elliptic-php ECDSA sample
<?php
use Elliptic\EC;
// Create and initialize EC context
// (better do it once and reuse it)
$ec = new EC('secp256k1');

// Generate keys
$key = $ec->genKeyPair();

// Sign message (can be hex sequence or array)
$msg = 'ab4c3451';
$signature = $key->sign($msg);

// Export DER encoded signature to hex string
$derSign = $signature->toDER('hex');

secp256k1 openssl_sign() 函数可以生成新的openssl_sign()私钥和公钥,但不能将公钥转换为E 231 hex E 135的公钥,通过散列E 236 keccak256 E 140算法进行寻址。e 241

签名Tx散列需要从JSON字符串Tx数据中的/到ETH地址,需要使用{address:{to:address1,from:address2},amount:0,timestamp:timestamp tx, hash:sha256hash, previousHash:hash, difficulty:2...}和openssl_pkey_new() openssl_pkey_export()生成私钥和公钥才能生成ETH地址。

因为,openssl_pkey_new() openssl_pkey_export() for OPENSSL_KEYTYPE_EC返回DER bin键,我需要将它们转换为十六进制。

我尝试过openssl_pkey_new()和openssl_sign()函数,但不能用简单的函数转换成hex格式的DER格式。

openssl_pkey_new()函数来生成新的secp256k1密钥对,只在生成256位ECDSA私钥问题中显示。

代码语言:javascript
运行
AI代码解释
复制
$config = [
    "config" => getenv('OPENSSL_CONF'),
    '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, NULL, $config);
// Get The Public Key
$key_detail = openssl_pkey_get_details($res);
$pub_key = $key_detail["key"];

echo "priv_key:<br>".$priv_key;
echo "<br><br>pub_key:<br>".$pub_key;

链接

用钥匙签字。

代码语言:javascript
运行
AI代码解释
复制
openssl_sign($hashdata, $signature, $private_key);

是否有任何方法,使用php库,将密钥转换为DER的十六进制?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-18 03:57:16

好吧,现在我知道你想要什么了,我已经调查过了,不幸的是,我觉得你运气不好。首先要澄清的是,您希望在DER和密钥格式中签名,这取决于您的软件,但是对于Ethereum帐户地址,您不想要DER中的密钥。具体而言,地址是通过以下方式计算的:

  1. 用原始的X,Y坐标表示公匙点,没有像DER这样的元数据,甚至没有像X9.62这样的单个字节,也没有像base64或十六进制那样的编码
  2. 取一个Keccak256散列,并取最后20个字节,可以用十六进制表示(例如,显示),前缀为0x,总共42个字符。

对于步骤1,OpenSSL所使用的密钥,以及php的内置模块,都是PEM格式,正如您在示例中看到的那样,它由一个ASN.1 (DER或有时BER)主体组成,该主体在base64中编码,带有换行和头/尾线。具体来说,公钥是由RFC7468第13节定义的格式,其内容是X.509和PKIX定义的SubjectPublicKeyInfo结构,即特定算法的内容在其他标准中定义的RFC5280 4.1.2.7;这里的例子X9风格的EC是用RFC3279 2.3.5定义的,并由引用X9.62和SEC1的RFC5480 2.2简化。(呜呜!)虽然这些标准允许多个选项,但OpenSSL在PHP中总是使用X9.62--未压缩的点格式和DER编码,因此对于这条曲线,您所需的Ethereum数据只是从PEM解码的最后64个字节:

代码语言:javascript
运行
AI代码解释
复制
$der=base64_decode(str_replace(array("-----BEGIN PUBLIC KEY-----\n","-----END PUBLIC KEY-----\n"),"",$pub_key));
$raw=substr($der,-64);

但是第二步是个问题。虽然在SHA3和FIPS202中标准化的握手是Keccak的实例,但是散列使用是Keccak的一个不同的、非标准的实例,OpenSSL没有实现它,因此php本身也不实现(不添加库)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69149095

复制
相关文章
参与者模式
JavaScript中的参与者模式,就是在特定的作用域中执行给定的函数,并将参数原封不动的传递,参与者模式不属于一般定义的23种设计模式的范畴,而通常将其看作广义上的技巧型设计模式。
WindRunnerMax
2020/12/25
6300
周志华Deep Forrest论文参与者答网友问,或6月1日开源
【新智元导读】新智元之前发布周志华老师的Deep Forrest论文引起了广泛关注和讨论。本文作者Ji Feng正是该论文的参与者,他在知乎上对这篇论文的评论做了几点评价,例如:没有BP到底行不行?端到端不是模型能够work的必要条件。 【Ji Feng】:作为论文参与者之一,我做的很有限,在这里擅自谈谈我个人对周老师gcForest的一点愚钝看法。这里声明:所有观点仅仅代表我个人。 先说几点个人的结论: 1. 这是一个Deep Model,只不过building blocks是决策树。 这篇工作不是来
新智元
2018/03/28
7330
设计模式:参与者风格
参与者风格将问题分解为问题域相关的对象,每个对象中存在一个队列,并且暴露唯一的send接口用于给队列添加消息。对象轮循队列,并根据取出的不同消息执行不同的操作。
超级大猪
2020/09/18
2650
如何在 React 中点击显示或隐藏另一个组件?
React 是一种流行的 JavaScript 库,用于构建动态用户界面。在一个 React 应用程序中,有时需要一个按钮或链接来触发显示或隐藏一个相关的组件。这种需求可以通过使用 React 状态管理和事件处理机制来实现。
网络技术联盟站
2023/06/07
5.5K0
nuxt 为单独的页面或组件 注入js
代码如下 head() { return { script: [ { charset: 'utf-8', src:'htt
拿我格子衫来
2022/01/24
1.6K0
nuxt 为单独的页面或组件 注入js
主要参与者解决开源许可问题
红帽,谷歌,Facebook和IBM表示,他们将在最新的GNU通用公共许可协议GPLv3中将错误标准应用于其所有开源许可,甚至包括根据较早的GPL协议授予的许可。
田冠宇
2020/12/25
6210
Vue动画之多个元素或组件的动画效果
        前面我们看的是单个元素的过渡效果,我们看一下多个元素或者组件的过渡
十月梦想
2018/10/09
1.9K0
如何将Alexa添加到Raspberry Pi(或任何Linux设备)
我们的Amazon Alexa虚拟设备项目旨在提供将Alexa添加到任何Linux设备(包括Raspberry Pi板等嵌入式系统)的功能。
用户4122690
2020/03/14
1.6K0
如何将Alexa添加到Raspberry Pi(或任何Linux设备)
组件分享之后端组件——基于Golang实现的以并行线程计算或分发到机器集群组件GLOW
近期正在探索前端、后端、系统端各类常用组件与工具,对其一些常见的组件进行再次整理一下,形成标准化组件专题,后续该专题将包含各类语言中的一些常用组件。欢迎大家进行持续关注。
cn華少
2022/06/27
5100
组件分享之后端组件——基于Golang实现的以并行线程计算或分发到机器集群组件GLOW
Vue父子组件之间的传值及父子组件之间相互调用属性或方法
父组件向子组件传值是通过属性的方式 传值,传的值可以是任意类型,甚至可以是父组件的方法或者父组件对象本身。为方便理解可以简单将父组件向子组件传值按以下步骤实现。
赵云龙龙
2020/02/24
16.5K0
IDC转型成为云服务重要参与者
“云”是生活在数据中心的,依赖于数据中心存在。在当今不断变化的环境中,更多业务和数据放在数据中心,现在数据中心几乎被用于存储所有的东西。事实上,今天几乎所有的新技术和应用部署都需要一个位置,这个位置就是数据中心。技术先进的数据中心能够为您的组织提供安全的云计算服务。 虽然越来越多的工作负载是基于云的,提到云总是和虚拟化关联在一起,但在数据中心中仍然有一个非常真实的物理世界,一排排的机架和大大小小的服务器来存储和管理所有的信息。在为云计算服务规划和构建数据中心时管理者必须考虑以下几个重要的细节: 物理资源
静一
2018/03/23
1.3K0
IDC转型成为云服务重要参与者
RPA生态运转体系之参与者的角色配置
众所周知,在RPA生态中,RPA厂商主要负责提供RPA技术和服务,与其他生态参与者提供的技术、产品、服务、方案及渠道共同服务企业客户。
蕉黄
2019/12/19
4130
RPA生态运转体系之参与者的角色配置
「SQL面试题库」 No_98 活动参与者
可以以任何顺序返回结果,Activities 表的每项活动的参与者都来自 Friends 表
不吃西红柿
2023/10/16
1440
手机chrome禁止加载图片_com组件未加载或被禁止
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/01
8490
LeetCode MySQL 1355. 活动参与者(any函数)
可以以任何顺序返回结果,Activities 表的每项活动的参与者都来自 Friends 表
Michael阿明
2021/02/19
3150
组件分享之后端组件——用于将日志写入滚动文件的组件包lumberjack
近期正在探索前端、后端、系统端各类常用组件与工具,对其一些常见的组件进行再次整理一下,形成标准化组件专题,后续该专题将包含各类语言中的一些常用组件。欢迎大家进行持续关注。
cn華少
2022/05/13
5170
组件分享之后端组件——对其GORM增加多数据库支持功能的组件dbresolver
近期正在探索前端、后端、系统端各类常用组件与工具,对其一些常见的组件进行再次整理一下,形成标准化组件专题,后续该专题将包含各类语言中的一些常用组件。欢迎大家进行持续关注。
cn華少
2022/05/15
5750
组件分享之后端组件——docconv组件将文档转换为纯文本
近期正在探索前端、后端、系统端各类常用组件与工具,对其一些常见的组件进行再次整理一下,形成标准化组件专题,后续该专题将包含各类语言中的一些常用组件。欢迎大家进行持续关注。
cn華少
2022/03/06
7710
点击加载更多

相似问题

从独立实体更新DB的正确方法是什么?

13

用实体更新列表的正确方法是什么?

20

如何在ASP.NET MVC中通过AJAX正确调用POST操作方法

11

使用实体框架添加或更新实体的正确方法是什么

14

使用NHibernate以正确的方式更新实体集合

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档