csecp256k1比特币
① 以太坊架构是怎么样的
以太坊最上层的是DApp。它通过Web3.js和智能合约层进行交换。所有的智能合约都运行在EVM(以太坊虚拟机)上,并会用到RPC的调用。在EVM和RPC下面是以太坊的四大核心内容,包括:blockChain, 共识算法,挖矿以及网络层。除了DApp外,其他的所有部分都在以太坊的客户端里,目前最流行的以太坊客户端就是Geth(Go-Ethereum)
② 比特币钱包地址是如何得到的不是比特币地址而是钱包地址!
首先,你应该在大脑中想象出一个“钱包”的概念。你的bitcoin都放在你的“钱包”中一个钱包可以包含很多很多......很多个地址。地址的形式就是形如。
利用比特币钱包中生成的比特币地址你可以接收来自他人的比特币,你也可以将你帐户上的比特币转到他人的比特币地址上面。比特币地址就像银行卡号一样,具有支付、转账、提现功能,但在转账时,你只有知道别人的比特币地址才能进行比特币转账。
如果我们把比特币钱包简单比作成银行卡账户的话,那么比特币钱包地址就可以看成是银行卡账号。不同的是,比特币地址是可以不存储在网络上的,更是可以独立于你的钱包而存在的。
(2)csecp256k1比特币扩展阅读:
比特币地址是一串由 26位到34位字母和数字字符串组成的。 看上去像一堆乱码一样,说白了这个就像你的银行卡卡号一样。 通过区块链查可以查每个比特币地址的所有转账记录,公开透明。
比特币钱包地址生成:通过随机选出256位二进制数字,形成私钥,然后通过加密函数来生成地址。这个生成方向是单向的。也就是你知道了地址是无法通过解密方法来计算出私钥的。就目前的人类计算机运算能力无法破解,你可以很放心地把地址公布到网上。
参考链接:比特币|网络
③ 为什么区块链私钥 中的字母只有a-f之间
私钥:实际上是一组随机数,关于区块链中的随机数我们已经介绍过了
公钥:对私钥进行椭圆曲线加密算法生成,但是无法通过公钥倒推得到私钥。公钥的作用是在和对方交易时,使用自己的私钥加密信息,然后对方使用自己的公钥解密获得原始信息,这个过程俗称签名。
地址:由于公钥太长,在交易中不方便使用,就对公钥哈希进行SHA256、RIPEMD160、Base58算法加密生成地址
首先使用随机数发生器生成一个『私钥』。后续的公钥、地址都会由私钥生成,所以一句话概括私钥的重要性:"谁掌握了私钥, 谁就掌握了该钱包的使用权!"
『私钥』经过椭圆曲线算法(SECP256K1)算法加密生成了'公钥'。这是一种非对称单向加密算法,知道私钥可以算出公钥,但知道公钥却无法反向算出私钥
『公钥』经过单向Hash算法(SHA256、RIPEMD160)生成『公钥Hash』
将一个字节的地址版本号连接到『公钥哈希』头部(对于比特币网络的pubkey地址,这一字节为“0”),然后对其进行两次SHA256运算,将结果的前4字节作为『公钥哈希』的校验值,连接在其尾部。
将上一步结果使用BASE58进行编码(比特币定制版本),就得到了『钱包地址』。
④ 离线生成的比特币地址是如何避免冲突的
BTC的地址生成过程如下,完整的可以查一下比特币中文维基:
比特币地址的生成过程
(说明: 有些数字以"0x"开头,意思是此数字使用十六进制表示法。"0x"本身没有任何含义,它是C语言流传下来的,约定俗成的写法,比如0xA就是十进制的10。另外,1个字节 = 8位二进制 = 2位十六进制)。
第一步,随机选取一个32字节的数、大小介于1 ~ 0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4141之间,作为私钥。
第二步,使用椭圆曲线加密算法(ECDSA-secp256k1)计算私钥所对应的非压缩公钥。 (共65字节, 1字节 0x04, 32字节为x坐标,32字节为y坐标)关于公钥压缩、非压缩的问题另文说明。
第三步,计算公钥的 SHA-256 哈希值
第四步,取上一步结果,计算 RIPEMD-160 哈希值
第五步,取上一步结果,前面加入地址版本号(比特币主网版本号“0x00”)
00
第六步,取上一步结果,计算 SHA-256 哈希值
第七步,取上一步结果,再计算一下 SHA-256 哈希值(哈哈)
第八步,取上一步结果的前4个字节(8位十六进制)
D61967F6
第九步,把这4个字节加在第五步的结果后面,作为校验(这就是比特币地址的16进制形态)。
00D61967F6
第十步,用base58表示法变换一下地址(这就是最常见的比特币地址形态)。
⑤ git和区块链的区别
一、相似性
分布式
Git 确保每个代码仓库在本地保留完整的项目库,而不仅仅是自己在工作的这个分支和自己的提交历史。同时也保留了最近这次 pull 下来后的所有快照和索引信息。
区块链上,每个节点在本地保存完整数据库,而不仅仅是自己的交易信息。
可追溯性
Git commit 链上,每个 commit 对象都包含父级对象(上一次 commit 的对象,除了第一个 commit ),对之前的记录全部可追溯。
区块链上,每个区块都包含前一个区块的索引(除了创世区块),可以追溯之前所有有效交易。
不可篡改
Git 的 commit 链中,每个对象本身在存储前都计算校验和,然后以校验和来引用。一旦修改,校验和就会不对, 这意味着不可能在 Git 不知情时更改任何文件内容或目录内容。
Git 用以计算校验和的机制叫做 SHA-1 散列( hash,哈希)。 这是一个由 40 个十六进制字符( 0-9 和 a-f )组成字符串,基于 Git 中文件的内容或目录结构计算出来。SHA-1 哈希看起来是这样:区块链中,每个区块包含上个区块 ID,本区块 ID 两个 SHA-256 散列,这两个散列都是基于区块内容计算出来。一旦修改内容,则散列将变化,和其他节点的链不一致,最终不能加入到最长链中,因此无法真正篡改内容。
二、差异性
集体共识和中央节点意志: 1 - 区块链是基于集体共识( POW/POS)来 merge,形成最长链,最长链即为主链。
2 - 而 Git 体系里,通过仓库托管平台来进行多节点合作时,是平台项目的管理者掌握了 merge 的权力,体现的是中央节点的意志。
密码学
1 - 比特币区块链中,密码学主要用到了以下方式
在比特币区块链的整个体系中,大量使用了公开的加密算法,如 Merkle Tree 哈希数算法,椭圆曲线算法、哈希算法、对称加密算法及一些编码算法。各种算法在比特币区块链中的作用如下:
a)哈希算法
比特币系统中使用的两个哈希函数分别是:1.SHA-256,主要用于完成 PoW (工作量证明)计算; 2.RIPEMD160,主要用于生成比特币地址。
b)Merkle 哈希树
基于哈希值的二叉树或多叉树,在计算机领域,Merkle 树大多用来进行完整性验证处理,在分布式环境下,其进行完整性验证能大量减少数据传输和计算的复杂程度。
c)椭圆曲线算法
比特币中使用基于 secp256k1 椭圆曲线数学的公钥密码学算法进行签名与验证签名,一方面可以保证用户的账户不被冒名顶替,另一方面保证用户不能否认其所签名的交易。用私钥对交易信息签名,矿工用用户的公钥验证签名,验证通过,则交易信息记账,完成交易。
d)对称加密算法
比特币官方客户端使用 AES (对称分组密码算法)加密钱包文件,用户设置密码后,采用用户设置饿密码通过 AES 对钱包私钥进行加密,确保客户端私钥的安全。
e)Base58 编码
Base58 是比特币使用的一种独特的编码方式,主要用于产生比特币的钱包地址,其类似于古典密码学里的置换算法机制,目的是为里增加可读性,把二进制的哈希值变成了我们看到的地址“ ”。
2 - Git:主要用了 SSH 秘钥来进行远程登录验证,用了 SHA-1 来进行代码内容校验和。
SSH 是 Secure Shell 的缩写,由 IETF 的网络工作小组( Network Working Group )所制定,是一种专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。
SSH 传输的过程如下: (1)远程主机收到用户的登录请求,把自己的公钥发给用户。 (2)用户使用这个公钥,将登录密码加密后,发送回来。 (3)远程主机用自己的私钥,解密登录密码,如果密码正确,允许用户登录。
⑥ 比特币地址是怎么产生的
比特币使用椭圆曲线算法生成公钥和私钥,选择的是secp256k1曲线。生成的公钥是33字节的大数,私钥是32字节的大数,钱包文件wallet.dat中直接保存了公钥和私钥。我们在接收和发送比特币时用到的比特币地址是公钥经过算法处理后得到的,具体过程是公钥先经过SHA-256算法处理得到32字节的哈希结果,再经过RIPEMED算法处理后得到20字节的摘要结果,再经过字符转换过程得到我们看到的地址。这个字符转换过程与私钥的字符转换过程完成相同,步骤是先把输入的内容(对于公钥就是20字节的摘要结果,对于私钥就是32字节的大数)增加版本号,经过连续两次SHA-256算法,取后一次哈希结果的前4字节作为校验码附在输入内容的后面,然后再经过Base58编码,得到字符串。乔曼特区块链专业站链乔教育在线是从事区块链相关培训,且获得教育部认证的区块链专业培训工作站。
⑦ bitcoin私钥是如何产生的
比特币地址和私钥是怎样生成的?比特币使用椭圆曲线算法生成公钥和私钥,选择的是secp256k1曲线。生成的公钥是33字节的大数,私钥是32字节的大数,钱包文件wallet.dat中直接保存了公钥和私钥。我们在接收和发送比特币时用到的比特币地址是公钥经过算法处理后得到的,具体过程是公钥先经过SHA-256算法处理得到32字节的哈希结果,再经过RIPEMED算法处理后得到20字节的摘要结果,再经过字符转换过程得到我们看到的地址。这个字符转换过程与私钥的字符转换过程完成相同,步骤是先把输入的内容(对于公钥就是20字节的摘要结果,对于私钥就是32字节的大数)增加版本号,经过连续两次SHA-256算法,取后一次哈希结果的前4字节作为校验码附在输入内容的后面,然后再经过Base58编码,得到字符串。
⑧ 私钥字符串如何转成PrivateKey对象
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.Cipher;
import com.icardpay.tds.stp.fastpay.common.Convertor;
import org.apache.commons.codec.binary.Base64;
import sun.misc.BASE64Decoder;
import tangdi.engine.context.Log;
/**
* RSAHelper - 对RSA 签名&验签/分段加密&分段解密 的包装 签名算法: "SHA1withRSA", 私钥进行签名; 公钥进行验签.
* 加密算法: "RSA/ECB/PKCS1Padding", 公钥进行加密; 私钥进行解密.
*
* [localPrivKey]是自己的私钥, 自己的公钥给通信对方. [peerPubKey]是对方的公钥, 对方的私钥在对方那边. 为了方便,
* 这里假定双方的密钥长度一致, 签名和加密的规则也一致.
*
* 以`Base64Str`结尾的参数表示内容是Base64编码的字符串, 其他情况都是raw字符串.
*/
public class RSAHelper {
private static RSAHelper instance = null;
public static final String KEY_ALGORITHM = "RSA";
public static final String SIGNATURE_ALGORITHM = "SHA1withRSA";
public static final String CIPHER_ALGORITHM = "RSA/ECB/PKCS1Padding"; // 加密block需要预留11字节
public static final int KEYBIT = 2048;
public static final int RESERVEBYTES = 11;
private static PrivateKey localPrivKey;
private static PublicKey peerPubKey;
private RSAHelper() {
}
public static RSAHelper getInstance(){
if(instance == null){
//双重检查加锁,只有在第一次实例化时,才启用同步机制,提高了性能。
synchronized(RSAHelper.class){
if(instance == null){
String localPrivKeyBase64Str = CmbcProps.getInstance().getConfigItem("OTHERLOCALPRIVKEY", "");
String peerPubKeyBase64Str = CmbcProps.getInstance().getConfigItem("OTHERPEERPUBKEY", "");
try {
/**
* 初始化自己的私钥,对方的公钥以及密钥长度.
* localPrivKeyBase64Str
* Base64编码的私钥,PKCS#8编码. (去掉pem文件中的头尾标识)
* peerPubKeyBase64Str
* Base64编码的公钥. (去掉pem文件中的头尾标识)
*/
BASE64Decoder base64Decoder = new BASE64Decoder();
byte[] buffer1 = base64Decoder.decodeBuffer(localPrivKeyBase64Str);
PKCS8EncodedKeySpec keySpec1 = new PKCS8EncodedKeySpec(buffer1);
KeyFactory keyFactory1 = KeyFactory.getInstance(KEY_ALGORITHM);
localPrivKey = keyFactory1.generatePrivate(keySpec1);
byte[] buffer2 = base64Decoder.decodeBuffer(peerPubKeyBase64Str);
KeyFactory keyFactory2 = KeyFactory.getInstance(KEY_ALGORITHM);
X509EncodedKeySpec keySpec2 = new X509EncodedKeySpec(buffer2);
peerPubKey = keyFactory2.generatePublic(keySpec2);
/**
* 实例化对象
*/
instance = new RSAHelper();
} catch (NoSuchAlgorithmException e) {
Log.info("无此算法");
} catch (InvalidKeySpecException e) {
Log.info("公钥非法");
} catch (IOException e) {
Log.info("公钥数据内容读取错误");
} catch (NullPointerException e) {
Log.info("公钥数据为空");
} catch (Exception e) {
Log.error(e, "初始化密钥失败");
}
}
}
}
⑨ 求解模平方根的算法(答得完整我会再追加分数)
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
#!/usr/bin/python
#coding=gbk
import math
def quick_algorithm(a,b,c): #y=a^b%c,a的b次幂余除c
a = a % c
ans = 1
#这里我们不需要考虑b<0,因为分数没有取模运算
while b != 0: #费马小定理
if b & 1:
ans = (ans * a) % c
b>>=1
a = (a * a) % c
return ans
def IsHaveMoSqrt(x,P):#是否有模平方根y*y=x mod p,已知x,p,判断是否存在y
ret = quick_algorithm(x,(P-1)//2,P)
if ret==1:
return True
else:
return False
def GetMoSqrt(x,P):#求模平方根y*y=x mod p,已知x,p求y
if(IsHaveMoSqrt(x,P)==1):
t=0
s=P-1#P-1=(2^t)*s //s是奇数
while s%2==0:
s=s//2
t=t+1
if(t==1):
ret = quick_algorithm(x,(s+1)//2,P)
return (ret,P-ret)
elif (t>=2):
x_=quick_algorithm(x,P-2,P)
n=1
while(IsHaveMoSqrt(n,P)==1):
n=n+1
b=quick_algorithm(n,s,P)
print(b)
ret = quick_algorithm(x,(s+1)//2,P)#t-1
t_=0
while(t-1>0):
if(quick_algorithm(x_*ret*ret,2**(t-2),P)==1):
ret=ret
else:
ret=ret*(b**(2**t_))%P
t=t-1
t_=t_+1
return (ret,P-ret)
else:
return (-2,-2)
else:
return (-1,-1)
def Secp256k1GetYByX(x):#y^2=x^3+7 (mod p)根据x求y
a=(x*x*x+7)%
ret = GetMoSqrt(a,)
return ret
if __name__ == "__main__":
if True:
x=#私钥为1,对应的公钥x
ret = Secp256k1GetYByX(x)#secp256k1,根据x求y
print("x=%x" % (x))
print("y=%x" % (ret[0]))
print("y=%x" % (ret[1]))
print("")
x=1#x最小值
ret = Secp256k1GetYByX(x)#secp256k1,根据x求y
print("x=%x" % (x))
print("y=%x" % (ret[0]))
print("y=%x" % (ret[1]))
print("")
x=-3#x最大值
ret = Secp256k1GetYByX(x)#secp256k1,根据x求y
print("x=%x" % (x))
print("y=%x" % (ret[0]))
print("y=%x" % (ret[1]))
print("")
input()
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
⑩ 谁能最简单的详解椭圆曲线算法,secp256k1 是如何生成公钥和私钥的
最简单的描述,K=kG作者重新定义了椭圆曲线的加法和乘法。并且保证不可逆。之后通过一系列复杂的计算算出了公钥和加密算法。比如y^2=Ax^3+Bx^2+Cx+D然后Alice计算出来一个参数(x1,y1) 告诉A,B,C,D到Bob,Bob对应的计算出来(x2,y2)然后双方通讯,就可以使用公钥私钥对进行加解密了。PS:对不起。具体细节我把书送给老师了。手头没有资料可以查PS:开始了解这个算法的时候我也看了ECC加密算法入门介绍。到现在都不懂。我也不是数学系的。PS:我很后悔当时没有把这个书上的东西记下来。现在只有一点皮毛的。那本书是《深入浅出密码学――常用加密技术原理与应用(安全技术经典译丛)》(美)帕尔,(美)佩尔茨尔著,马小婷译PS:最后我很讨厌很简单的东西说的很复杂。在上面这本书大概几面纸加上最基础不超过两位数的算例就解决的问题,上面硬是讲的超级复杂。