PGP 遇上比特币

news2024/11/24 20:45:31

重复使用 PGP 密钥作为比特币密钥

介绍

在数字安全领域,密码学在确保数据的完整性和真实性方面发挥着至关重要的作用。 一种广泛使用的加密技术是使用 Pretty Good Privacy (PGP1)。 PGP 为安全通信(例如电子邮件、文件传输和数据存储)提供加密和身份验证。

PGP 可以使用与比特币相同的椭圆曲线,称为 secp256k1,因此可以与比特币兼容并利用。 现有的 PGP 椭圆密钥密钥对可以重复用作比特币密钥对,因此我们可以

  • 将比特币发送到从 PGP 公钥派生的地址。 只有用 PGP 私钥花费比特币。

  • 对可信任的来自 PGP 用户的消息进行签名。

在本文中,我们将深入研究可信预言机使用 secp256k1 椭圆曲线生成 PGP 签名的示例,该签名使用 sCrypt 在链上进行验证和使用。

生成 PGP 签名

第一步是确保您的机器安装了 GnuPG。 这是一个使用非常广泛的程序,您的系统上可能已经安装了它。

生成私钥

运行以下命令:

gpg --full-gen-key --expert

这将运行一个交互式提示来生成您的密钥。 当它要求您选择 ECC 密钥进行签名时,使用“secp256k1”作为曲线。

完成后,您的系统上将存储一个新密钥。 要列出所有密钥,请运行以下命令:

gpg --list-keys --with-fingerprint

创建签名

由于我们将在比特币中验证的签名需要采用原始形式 (r, s),因此我们准备了一个工具,可以从 GnuPG 生成的文件中提取此数据。 使用以下命令从 GitHub 克隆它:

git clone https://github.com/sCrypt-Inc/parse-pgp-sig && cd parse-pgp-sig

该工具是原始工具的一个分支,由 Mark Blundeberg 编写。

现在,让我们对存储在“testmsg”文件中的消息进行签名。 首先,编辑“makesig.sh”中的密钥 ID 以使用您在上一步中创建的密钥的 ID。 然后运行以下命令:

./makesig.sh

这将创建一个名为“testmsg.sig”的文件,其中包含签名。 因为我们还需要公钥,所以我们必须将其导出,如下所示:

gpg --output pubkey.gpg --export <KEY_ID>

最后,运行以下命令:

./parsesig.py

这将以正确的格式打印所需的所有数据,以用于验证。 输出应如下所示:

pubkey.gpg loaded, key ID AF73C8F7B546F94B39317588BC4509E6210D4B78
Public key point coordinates:
x = 48421684640566418104679532805542050894296452248858999768503364580534732096841
y = 27832515582888013475460648727797934257300201948678282835754427898215825506626
Message: b'Hello world!\n'
Message hex: 48656c6c6f20776f726c64210a04001308001d162104af73c8f7b546f94b39317588bc4509e6210d4b7805026453693704ff00000023
Sig:
r: 64359296802826103123327210017080540130282890114880640962625134547151700407256
s: 8795100933587794005356181940782496292717652651227485898667966611241902738847
Signature validity on message: True

在比特币中验证签名

这是一个简单的 sCrypt 智能合约,它可以验证我们刚刚创建的签名。


export class Verify extends SmartContract {
    @prop()
    msg: ByteString

    constructor(msg: ByteString) {
        super(...arguments)
        this.msg = msg
    }

    @method()
    public unlock(sig: Signature, pubKey: Point) {
        // Hash message.
        const hashInt = byteString2Int(
            reverseByteString(sha256(this.msg), 32) + toByteString('00')
        )

        // Verify signature.
        assert(
            SECP256K1.verifySig(hashInt, sig, pubKey),
            'Sig invalid'
        )
    }
}

正如我们所观察到的,已部署的合约将原始消息存储为合约属性。 一旦有人调用“unlock”公共方法,它就会对该消息进行哈希处理并将其转换为整数,然后使用我们的“SECP256K1”库继续验证签名。 您可以从我们的 scrypt-ts-lib 包中导入该库。

使用上面的数据,我们将初始化并调用合约,如下所示:


await Verify.compile()
instance = new Verify(toByteString('48656c6c6f20776f726c64210a04001308001d162104af73c8f7b546f94b39317588bc4509e6210d4b7805026453693704ff00000023'))

...

const sig: Signature = {
    r: 64359296802826103123327210017080540130282890114880640962625134547151700407256n,
    s: 8795100933587794005356181940782496292717652651227485898667966611241902738847n,
}

const pubKey: Point = {
    x: 48421684640566418104679532805542050894296452248858999768503364580534732096841n,
    y: 27832515582888013475460648727797934257300201948678282835754427898215825506626n,
}

const { tx: callTx, atInputIndex } = await instance.methods.unlock(
    sig,
    pubKey,
    {
        fromUTXO: getDummyUTXO(),
    } as MethodCallOptions<Verify>
)

const result = callTx.verifyScript(atInputIndex)

一旦我们验证了该消息,我们就可以在我们的合约中使用它,并确信它来自给定的 PGP 用户。


参考:

  • https://gist.github.com/markblundeberg/af59d7cd234cbdb14dcf9e00f0ea2c17

[1] Hal Finney 是一位早期的比特币贡献者,他从比特币的创造者中本聪那里收到了第一笔比特币交易,他在 PGP 公司工作,在那里他开发了一些最早的 PGP 代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1257999.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

4G执法记录仪在高铁、地铁、机场应急处突中的应用

4G执法记录仪&#xff1a;高铁、地铁、机场紧急应对新利器 随着时代的迅猛发展&#xff0c;公共交通安全管理面临着越来越复杂的挑战。其中&#xff0c;高铁、地铁、机场这类人流密集的区域,要求高效、准确的应急响应与指挥调度机制。在这种背景下&#xff0c;4G/5G执法记录仪…

大数据平台/大数据技术与原理-实验报告--MapReduce编程

实验名称 MapReduce编程 实验性质 &#xff08;必修、选修&#xff09; 必修 实验类型&#xff08;验证、设计、创新、综合&#xff09; 综合 实验课时 2 实验日期 2023.10.30-2023.11.03 实验仪器设备以及实验软硬件要求 专业实验室&#xff08;配有centos7.5系统…

burpsuite issue definitions

https://portswigger.net/burp/documentation/scanner/vulnerabilities-list 先从高危的开始学(四十能学剑&#xff0c;时人无此心)&#xff1a; os command injection todo 未完待续

element 的 Notification 通知,自定义内容

通知事件&#xff1a; // 商户后台通知 MerchantBackgroundNotice() {// 禁止消息通知弹出多条if(this.notifyInstance) {this.notifyInstance.close();}const h this.$createElement; // 创建文本节点this.notifyInstance this.$notify({showClose: false, // 禁止关闭按钮…

Python语言学习笔记之三(字符编码)

本课程对于有其它语言基础的开发人员可以参考和学习&#xff0c;同时也是记录下来&#xff0c;为个人学习使用&#xff0c;文档中有此不当之处&#xff0c;请谅解。 什么是字符编码 计算机从本质上来说只认识二进制中的0和1&#xff0c;字符编码(Character Encoding) 是一种将…

Java(八)(可变参数,Collections,小案例:斗地主游戏小案例:斗地主游戏,Map集合,Stream流)

目录 可变参数 Collections 小案例:斗地主游戏 Map集合 Map的常用方法 map集合的遍历 键找值 键值对 Lambda 表达式 HashMap底层原理 集合的嵌套 Stream流 获取集合或数组的Stream流 Stream流的方法 可变参数 就是一种特殊的形参,定义在方法和构造器的形参列表中,…

视频没有字幕怎么办,怎么给视频增加字幕

文章目录 视频没有字幕怎么办&#xff0c;怎么给视频增加字幕前言软件准备制作字幕1. 导入视频2. 将视频拖拽到轨道3. 生成字幕4. 导出字幕 字幕实时翻译1. 播放视频2. 显示字幕设置3. 双语字幕显示 总结 视频没有字幕怎么办&#xff0c;怎么给视频增加字幕 前言 有时候下载的…

传音荣获2023首届全国人工智能应用场景创新挑战赛“智能家居专项赛”三等奖

近日&#xff0c;中国人工智能学会与科技部新一代人工智能发展研究中心联合举办2023首届全国人工智能应用场景创新挑战赛&#xff08;2023 1st China’s Innovation Challenge on Artificial Intelligence Application Scene&#xff0c;以下简称CICAS 2023)&#xff0c;吸引了…

10 个例子带你学会 AI 编程(含提示词)

大家好&#xff0c;我是伍六七。 AI 编程是一个程序员群体普遍关注的领域&#xff0c;但是真的使用 AI 编程实现提效的还是少数。 有的人没有大模型资源&#xff0c;有的人不知道可以在哪些方面使用 AI 进行提效&#xff0c;还有的人不相信使用 AI 可以提效。 今天&#xff…

国产Ai大模型和chtgpt3.5的比较

下面是针对国产大模型&#xff0c;腾讯混元&#xff0c;百度文心一言&#xff0c;阿里通义千问和chatgpt的比较&#xff0c;最基础的对一篇文章的单词书进行统计&#xff0c;只有文心一言和chatgpt回答差不多&#xff0c;阿里和腾讯差太多了

【机器学习】迁移学习

迁移学习&#xff1a;给定一个有标记的源域和一个无标记的目标域。这两个领域的数据分布不同。迁移学习的目的就是要借助源域的知识&#xff0c;来学习目标域的知识(标签)。或是指基于源域数据和目标域数据、源任务和目标任务之间的相似性&#xff0c;利用在源领域中学习到的知…

【视觉SLAM十四讲学习笔记】第三讲——旋转向量和欧拉角

专栏系列文章如下&#xff1a; 【视觉SLAM十四讲学习笔记】第一讲——SLAM介绍 【视觉SLAM十四讲学习笔记】第二讲——初识SLAM 【视觉SLAM十四讲学习笔记】第三讲——旋转矩阵 【视觉SLAM十四讲学习笔记】第三讲——Eigen库 本章将介绍视觉SLAM的基本问题之一&#xff1a;如何…

【开源】基于JAVA的天然气工程运维系统

项目编号&#xff1a; S 022 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S022&#xff0c;文末获取源码。} 项目编号&#xff1a;S022&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统角色分类2.2 核心功能2.2.1 流程…

Win11修改用户名(超详细图文)

新买的电脑一般预装Windows11系统&#xff08;家庭与学生版&#xff09;&#xff0c;新电脑初次开机使用微软邮箱账号登录&#xff0c;则系统将用户名自动设置成邮箱前5位字符。我的用户名便是一串数字【231xx】&#xff08;qq邮箱前5位&#xff09;&#xff0c;看着很不舒服&a…

Docker搭建个人网盘NextCloud并接入雨云对象存储的教程

雨云服务器使用Docker搭建私有云盘NextCloud并接入雨云对象存储ROS的教程。 NextCloud简介 NextCloud由原ownCloud联合创始人Frank Karlitschek创建的&#xff0c;继承原ownCloud的核心技术又有不少的创新。在功能上NextCloud和ownCloud差不多&#xff0c;甚至还要丰富一些&a…

C语言:输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数

分析&#xff1a; 在主函数 main 中&#xff0c;程序首先定义一个字符变量 c&#xff0c;以及四个整型变量 letters、k、s 和 o&#xff0c;并初始化它们的值为 0。然后使用 printf 函数输出提示信息&#xff0c;让用户输入一行字符。 接下来&#xff0c;程序通过 while 循环结…

编程难点:常见问题及解决方案

目录 1 前言2 学习成本高2.1 学习成本高的问题2.2 学习成本高的解决方法 3 程序bug多3.1 程序bug多的问题 4 程序的性能调试4.1 程序的性能问题4.1 程序的性能调试方法 5 跨平台兼容性差5.1 跨平台兼容问题5.1 跨平台兼容问题的解决方法 6 解决技术难题的方法总结7 总结 1 前言…

pikachu靶场:php反序列化漏洞

pikachu靶场:php反序列化漏洞 文章目录 pikachu靶场:php反序列化漏洞代码审计漏洞利用 代码审计 像这种反序列化的代码基本都是代码审计出的 // 定义一个名为S的类&#xff0c;该类有一个属性$test和一个构造函数 class S{ var $test "pikachu"; // $test是一个…

大数据平台/大数据技术与原理-实验报告--实战HDFS

实验名称 实战HDFS 实验性质 &#xff08;必修、选修&#xff09; 必修 实验类型&#xff08;验证、设计、创新、综合&#xff09; 综合 实验课时 2 实验日期 2023.10.23-2023.10.27 实验仪器设备以及实验软硬件要求 专业实验室&#xff08;配有centos7.5系统的linu…

SIFT尺度不变特征变换

SIFT(Scale-Invariant Feature Transform)是一种用于图像处理和计算机视觉中的特征提取和匹配的算法。它的主要优点是对图像的尺度、旋转和亮度变化具有较强的鲁棒性。 基本原理: Scale-space peak selection: Potential location for finding features.Keypoint Localizat…