比特币交易怎么验证签名(比特币身份验证)

麦斯财经 129 0

比特币的加密(秘钥、地址、脚本验证)

生成方式:

P2PKH的交易脚本

举个真实的例子:

ScriptSig:

PUSHDATA(72)[3045022100f8df16671995baaecab5a8d91fc3c78f22c156918cefb90dd1092fcd8578567d022041395667d7e99d131bffcb908904a2417cfb74b46df8bded2517a02beda0279701] PUSHDATA(33)

[021fc349da71680b2482e4c307adbd7aa2fc16d2cd564843ab873a8efff748d87b]

这里面的一个scriptSig由2部分组成,第一部分是签名,第二部分是公钥,PUSHDATA(N),表示要压入栈顶的byte,1个byte表示2个字符,PUSHDATA(72)表示压入144个字符

Output Scripts

HASH160 PUSHDATA(20)[d3ecd0e0d42d4b617767d9d1b966216c77ebb513] EQUAL

DUP HASH160 PUSHDATA(20)[7c45023433aea27b48251d4c5a52b1d73caba74e] EQUALVERIFY CHECKSIG

第二个找零output地址因为是P2PKH开头的,所以格式和描述的一样

结合多重签名一起使用

scriptSig: ..signatures... serialized script

scriptPubKey: OP_HASH160 scriptHash OP_EQUAL

表示一共有n个参与方,只要有m个参与方同意了这笔交易,则这笔交易就生效了,具体的规则是通过scriptHash里面的脚本内容决定的

m-of-n multi-signature transaction:

scriptSig: 0 sig1 ... script

script: OP_m pubKey1 ... OP_n OP_CHECKMULTISIG

ScriptSig:

0[] PUSHDATA(72)[30450221009b37b97eb11341a5fa69d191312df12a41449cf922dbf8e72e93eb6ca7515cb60220759126a28f69525903da3e79e873c59ee7355b6a4874eed06ed6f616712ee51201] PUSHDATA(71)[304402202da30a860b7a2ee3cf614aae2ae8fb5a75de3ea9d5274701ef0ceebc94f75801022063155b788bfb7cada4e8050992b23340d9324306fbd6a201a169ff4a676ea9d701] PUSHDATA1[52210246ccf4de0c54cc7f3354cdd993c2c50cf965fd82238b89659fbd73a1b4bf05a121024fc59f72272a897fe43803374969f396058152fe4765a8d15216f94624257b1b21022593bc69ecbf3bbcc3c58082267cb49dadaf4ca8dbf1b2297338a9d628c4297653ae]

HASH160 PUSHDATA(20)[d3ecd0e0d42d4b617767d9d1b966216c77ebb513] EQUAL

结合P2SH的新特征

目前比特币支持两种类型的交易:Pay-to-PubkeyHash、Pay-to-Script-Hash

验证一笔P2PKH交易的一个输入是否合法:

总结:先验证这笔output是不是属于该用户,再验证该用户的签名是否有效

参考:

初级版的比特币交易

什么是数字签名?

数字签名是用于验证数字和数据真实性和完整性的加密机制。我们可以将其视为传统手写签名方式的数字化版本,并且相比于签字具有更高的复杂性和安全性。

简而言之,我们可以将数字签名理解为附加到消息或文档中的代码。在生成数字签名之后,其可以作为证明消息从发送方到接收方的传输过程中没有被篡改的证据。

虽然使用密码学保护通信机密性的概念可以追溯到古代,但随着公钥密码学(PKC)的发展,数字签名方案在20世纪70年代才成为现实。因此,要了解数字签名的工作原理,我们首先需要了解散列函数和公钥加密的基础知识。

哈希是数字签名中的核心要素之一。哈希值的运算过程是指将任意长度的数据转换为固定长度。这是通过称为散列函数的特殊运算实现的。经过散列函数运算而生成的值称为哈希值或消息摘要。

当哈希值与加密算法相结合,即使用加密散列函数的方法来生成散列值(摘要),该值可作为唯一的数字指纹。这意味着对于输入数据(消息)的任何更改都会导致有完全不同的输出值(散列值)。这就是加密散列函数被广泛用于验证数字和数据真实性的原因。

公钥加密或PKC是指使用一对密钥的加密系统:公钥和私钥。这两个密钥在数学上是相关的,可用于数据加密和数字签名。

作为一种加密工具,PKC相比于对称加密具有更高的安全性。对称加密系统依赖于相同的密钥进行加密和解密信息,但PKC则使用公钥进行数据加密,并使用相应的私钥进行数据解密。

除此之外,PKC还可以应用于生成数字签名。本质上,该过程发送方使用自己的私钥对消息(数据)的哈希值进行加密。接下来,消息的接收者可以使用签名者提供的公钥来检查该数字签名是否有效。

在某些情况下,数字签名本身可能包括了加密的过程,但并非总是这样。例如,比特币区块链使用PKC和数字签名,而并不像大多数人所认为的,这个过程中并没有进行加密。从技术上讲,比特币又部署了所谓的椭圆曲线数字签名算法(ECDSA)来验证交易。

在加密货币的背景下,数字签名系统通常包含三个基本流程:散列、签名和验证。

第一步是对消息或数据进行散列。通过散列算法对数据进行运算,生成哈希值(即消息摘要)来完成的。如上所述,消息的长度可能会有很大差异,但是当消息被散列后,它们的哈希值都具有相同的长度。这是散列函数的最基本属性。

但是,仅仅将消息进行散列并不是生成数字签名的必要条件,因为也可以使用私钥对没有进行过散列的消息进行加密。但对于加密货币,消息是需要经过散列函数处理的,因为处理固定长度的哈希值有助于加密货币的程序运行。

对信息进行散列处理后,消息的发件人需要对其消息进行签名。这里就用到了公钥密码学。有几种类型的数字签名算法,每种算法都有自己独特的运行机制。本质上,都是使用私钥对经过散列的消息(哈希值)进行签名,然后消息的接收者可以使用相应的公钥(由签名者提供)来检查其有效性。

换句话说,如果在生成签名时不使用私钥,则消息的接收者将不能使用相应的公钥来验证其有效性。公钥和私钥都是由消息的发送者生成的,但仅将公钥共享给接收者。

需要注意的是,数字签名与每条消息的内容相关联。因此,与手写签名所不同,每条消息的数字签名都是不同的。

让我们举一个例子说明下整个过程,包括从开始直到最后一步的验证。我们假设Alice向Bob发送一条消息、并将该消息进行散列得到哈希值,然后将哈希值与她的私钥结合起来生成数字签名。数字签名将作为该消息的唯一数字指纹。

当Bob收到消息时,他可以使用Alice提供的公钥来检查数字签名的有效性。这样,Bob可以确定签名是由Alice创建的,因为只有她拥有与该公钥所对应的私钥(至少这与我们所假设的一致)。

因此,Alice需要保管好私钥至关重要。如果另一个人拿到了Alice的私钥,他们就同样可以创建数字签名并伪装成Alice。在比特币的背景下,这意味着有人可以使用Alice的私钥,并可在未经她知晓的情况下转移或使用她的比特币。

数字签名通常用于实现以下三方面目标:数据完整性、身份验证和不可否认性。

数字签名可以应用于各种数字文档和证书。因此,他们有几个应用程序。一些最常见的案例包括:

数字签名方案面临的主要挑战主要局限于以下三方面因素:

简而言之,数字签名可以理解为是一种特定类型的电子签名,特指使用电子化的方式签署文档和消息。因此,所有数字签名都可认为是电子签名,但反之并非如此。

它们之间的主要区别在于身份验证方式。数字签名需要部署加密系统,例如散列函数、公钥加密和加密技术。

散列函数和公钥加密是数字签名系统的核心,现已在各种案例中使用。如果实施得当,数字签名可以提高安全性,确保完整性,便于对各类数据进行身份验证。

在区块链领域,数字签名用于签署和授权加密货币交易。它们对比特币尤为重要,因为数字签名能够确保代币只能由拥有相应私钥的人使用。

虽然我们多年来一直使用电子和数字签名,但仍有很大的发展空间。如今大部分的公文仍然还是基于纸质材料,但随着更多的系统迁移到数字化中,我们还会看到更多的数字签名方案。

比特币交易怎么验证签名(比特币身份验证)-第1张图片

区块链入门(比特币为例)

区块链主要解决的交易的信任和安全问题,通过每个独立的节点的去中心化实现不可篡改(依赖分布式节点的共识机制),通过非对称交易算法实现仅公开交易信息,对交易人信息保密。

辅助理解:某种程度的逆运算

挖矿就是获取新的交易信息的记账权的过程。

比特币记账(记录交易信息,也就是挖矿)的过程,也是比特币发行的过程,会奖励第一个完成挖矿计算的节点一定数量的比特币。

挖矿的规则:

注意事项:

一条成功计算成功的信息摘要:首位18位连续为0的哈希值

涉及3个算法:

账号和秘钥是不可逆推算的,秘钥是可以推算出账号的,但是账号是无法推算秘钥的,这样张三亮出私钥,就可以证明是张三账号的持有者,但是别人知道张三账号,却无法推算出张三的私钥。

在验证阶段,通过夹杂私钥生成的签名摘要+账号信息,必须要可以验证是否能匹配成功,这就需要加密算法的设计,这三个算法必须有设计上面的关联性

用户张三给李四的账号发起一笔转账为例。

用户张三,在系统中申请一个用户账号,创建的同时会收到一个私钥(通过私钥证明自己是张三)。

假设张三现在已经有10比特币,要转账给李四。

那么张三利用通过自己账号来发起一笔交易

发起人:账号张三

接收人:账号李四

转账金额:10比特币

这笔交易要广播出来,就有几个问题

为了方便节点之间更快的完成交易信息的核对,可以对交易信息进行哈希运算,这样李四和王二比对交易信息的时候,比如比对这个交易信息的时候,只需要比对哈希值就可以知道是不是同一笔交易,交易信息是否完全一样,而不需要比对 发起人账号、收款人账号、转账金额等这些信息

哈希运算:Hash(交易信息(出账人账号,紧张人账号李四,转账金额10比特币)) 获得交易摘要

签名信息不可伪造是因为签名的参数涉及到私钥

签名的哈希运算:sign(交易摘要信息,私钥) --签名摘要

开始广播,现在有一个交易信息:信息为***,信息签名为:签名摘要,大家可以开始验证,验证成功请记账。

验证的过程:verify(签名信息,出账人账号),现实生活场景中的签名字迹和签名人的姓名,是否对的上。

最后王二、麻子等等村民都收到了这个广播,但是王二速度最快完成了记账,马上通过村里的广播广而告之,我对这笔交易率先记账成功了

(因为大家的账本都只记录交易信息,不记录余额的,假设张三频繁的发送转账,要统计几年的交易记录后的余额,也是要考验村民的计算能力的(为了方便理解,你可以这么认为,实际上是挖矿的过程)),

你们村民你们就不要再算了,因为我是第一个完成校验计算的,张三的余额是够的,李四的账号也是存在的,我宣布该笔交易有效,同时我有权利获得了相应的奖励,大家一起开始记录,我的账户获得奖励1个比特币,同时你们复制我的结果,当然还有我的计算过程编号。

整个交易才算完成。

只要大家都记账了这个操作就可以了,因为是虚拟货币,类似于银行转账,而不是纸币交易,只需要在银行的系统中张三账号的余额-10,李四的账号+10即可,只不过这里的银行账本是比特币所有节点的账本都做修改。

另外,从安全角度来说,还保护了张三和李四的真实信息的隐私,因为大家看到的只是张三的账号、李四的账号,这只是两个神奇的数字,并不知道发起人是张三,收款人是李四。但是可以确认,这个交易是持有张三账号的人发起的,而不是其它人伪造的,至于张三到底是谁,住在哪里,哪个国家的,就不得而知了。

【以太坊易错概念】nonce, 公私钥和地址,BASE64/BASE58,

以太坊里的nonce有两种意思,一个是proof of work nonce,一个是account nonce。

在智能合约里,nonce的值代表的是该合约创建的合约数量。只有当一个合约创建另一个合约的时候才会增加nonce的值。但是当一个合约调用另一个合约中的method时 nonce的值是不变的。

在以太坊中nonce的值可以这样来获取(其实也就是属于一个账户的交易数量):

但是这个方法只能获取交易once的值。目前是没有内置方法来访问contract中的nonce值的

通过椭圆曲线算法生成钥匙对(公钥和私钥),以太坊采用的是secp256k1曲线,

公钥采用uncompressed模式,生成的私钥为长度32字节的16进制字串,公钥为长度64的公钥字串。公钥04开头。

把公钥去掉04,剩下的进行keccak-256的哈希,得到长度64字节的16进制字串,丢掉前面24个,拿后40个,再加上"0x",即为以太坊地址。

整个过程可以归纳为:

2)有些网关或系统只能使用ASCII字符。Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法,而且base64特别适合在http,mime协议下快速传输数据。Base64使用【字母azAZ数字09和+/】这64个字符编码。原理是将3个字节转换成4个字节(3 X 8) = 24 = (4 X 6)

当剩下的字符数量不足3个字节时,则应使用0进行填充,相应的,输出字符则使用'='占位,因此编码后输出的文本末尾可能会出现1至2个'='。

1)Base58是用于Bitcoin中使用的一种独特的编码方式,主要用于产生Bitcoin的钱包地址。相比Base64,Base58不使用数字"0",字母大写"O",字母大写"I",和字母小写"l",以及"+"和"/"符号。

Base58Check是一种常用在比特币中的Base58编码格式,增加了错误校验码来检查数据在转录中出现的错误。 校验码长4个字节,添加到需要编码的数据之后。校验码是从需要编码的数据的哈希值中得到的,所以可以用来检测并避免转录和输入中产生的错误。使用 Base58check编码格式时,编码软件会计算原始数据的校验码并和结果数据中自带的校验码进行对比。二者不匹配则表明有错误产生,那么这个 Base58Check格式的数据就是无效的。例如,一个错误比特币地址就不会被钱包认为是有效的地址,否则这种错误会造成资金的丢失。

为了使用Base58Check编码格式对数据(数字)进行编码,首先我们要对数据添加一个称作“版本字节”的前缀,这个前缀用来明确需要编码的数 据的类型。例如,比特币地址的前缀是0(十六进制是0x00),而对私钥编码时前缀是128(十六进制是0x80)。 表4-1会列出一些常见版本的前缀。

接下来,我们计算“双哈希”校验码,意味着要对之前的结果(前缀和数据)运行两次SHA256哈希算法:

checksum = SHA256(SHA256(prefix+data))

在产生的长32个字节的哈希值(两次哈希运算)中,我们只取前4个字节。这4个字节就作为校验码。校验码会添加到数据之后。

结果由三部分组成:前缀、数据和校验码。这个结果采用之前描述的Base58字母表编码。下图描述了Base58Check编码的过程。

相同:

1) 哈希算法、Merkle树、公钥密码算法

2)全新的 SHA-3 加密标准 —— Keccak

3)在线加密算法

4)比特币地址生成算法详解

5)Base58Check编码实现示例

6) 比特币交易中的签名与验证

什么是比特币的数字签名?

比特币中的数字签名,是交易中的发起方产生的,为了保证这笔交易确实是由此人发起,并且数据在传输时没有被篡改。数字签名简单点来说,就是完整的交易信息,通过数字摘要技术压缩成固定格式的字符串,然后通过非对称加密技术,生成一个私钥。将完整的交易信息和数字签名传送给矿工,矿工用交易发起方的公钥对数字签名进行解密,解密成功,就将此交易数据写到区块中。

比特币是怎么交易的,你们了解吗

owner1 ---转账---- owner2

owner1 用owner2公钥加密转账信息 (所以只有owner2用自己的私钥能解密)

owner1 用owner1私钥对加密转账信息进行签名,并把owner1的公钥放在签名后一并广播出去

owner2(包括其他人)接收到信息,用owner1的公钥对信息进行解密(解签名),能解出来就证明了这条加密的交易信息确实来自于owner1

owner2 用owner2的私钥对加密的转账信息进行解密,得到转账信息

简单说,就是owner2收到owner1的交易信息,要先验证这个消息是不是真的owner1的(通过签名算法)。再看看自己能否解开这个加密的交易信息,如果能,说明这个交易信息确实是给自己的。

上述文章内容就是麦斯财经整理的比特币交易怎么验证签名和比特币身份验证的相关解答,希望能够帮助到大家;如果大家还想了解更多财经资讯知识,记得收藏关注本站。

标签: 比特币交易怎么验证签名

抱歉,评论功能暂时关闭!

微信号已复制,请打开微信添加咨询详情!