Hi 游客

更多精彩,请登录!

比特池塘 区块链前沿 正文

Neo中hash算法,加密算法使用介绍

深圳林妙可
141 0 0
区块链是基于加密算法,共识算法,p2p网络和经济激励的一个系统,加密算法在里面起到了非常关键的作用,总结一下Neo使用到的加密算法吧。
0 t5 b) R+ y6 f% z- L$ J
: P+ a- d% b# {2 W关于区块链中密码学的介绍,yeasy大牛的文章已经介绍的非常好,下文主要通过和Neo结合,加上一些自己的理解,去讲述一下加密算法的使用方法。! t2 J6 I' M( v0 G3 {

: H* d; u6 \) J( i+ {8 JHash 算法
- G+ F- e: {" P7 W- Q2 E0 y- m6 u8 p
$ d, H/ y3 U% A5 g$ W" P+ x0 WHash (哈希或散列)算法是信息技术领域非常基础也非常重要的技术。它能任意长度的二进制值(明文)映射为较短的固定长度的二进制值(Hash 值),并且不同的明文很难映射为相同的 Hash 值。5 d- L( B* Z  ]: z$ a
/ k! k6 p' K6 H  h# y, R
hash函数的作用* W8 r6 W8 X# D& w7 E

3 t. l" k; r% a' n4 W注意上一篇文章说明了如何将hash后的字符串保存到Neo的UInt256类型,其中一个前提就是结果集合在[0-15]之间。! ?! s) j% ~0 q+ d5 J5 r& s! i; O

5 {0 R3 {9 i4 s4 q哈希完全不等于加密,很多时候开发人员都对用户表中的密码进行哈希后保存,实际上不叫做加密,只是相当于把密码的“特征指纹”保存下来,而对非法攻击者来说,在不知道真实的“密码”的情况下,得到有相同指纹的密码是极为困难的。
1 M1 ?1 Y; L0 q8 _) X# b2 {
- d) G+ k1 Z0 h  a8 |& T$ }一个优秀的 hash 算法,将能实现:
; w* Y9 y, s/ K; [: I. p! }
/ U/ S+ T# N9 R8 I/ h2 P3 p: d正向快速:给定明文和 hash 算法,在有限时间和有限资源内能计算出 hash 值。
) k2 ?6 x; Y; x# @7 {9 B" k" r0 W" Z# G4 F5 X# |/ S6 [( |4 u
逆向困难:给定(若干) hash 值,在有限时间内很难(基本不可能)逆推出明文。
" p+ m* o2 t+ F, h$ o8 I; T( G% }# M0 v8 K+ f, B+ _4 b) j- q  p
输入敏感:原始输入信息修改一点信息,产生的 hash 值看起来应该都有很大不同。; m5 R0 I- n, u. y1 B1 Y7 I
& Q; `4 v7 h5 p1 |1 {3 }9 N
冲突避免:很难找到两段内容不同的明文,使得它们的 hash 值一致(发生冲突)。+ V- y4 k5 L6 b# k

5 x' Z' N; M5 q1 L0 B0 J目前,一般认为 MD5 和 SHA1 已经不够安全,推荐至少使用 SHA2-256 算法。$ K& Z1 R" A! d( P0 [
+ \) e9 Z% Z, I5 B; Q
一般的,Hash 算法都是算力敏感型,意味着计算资源是瓶颈,主频越高的 CPU 进行 Hash 的速度也越快。  m" V$ X  _7 L9 a9 W

! ~5 H: {7 g% r0 G5 t, x: u也有一些 Hash 算法不是算力敏感的,例如 scrypt,需要大量的内存资源,节点不能通过简单的增加更多 CPU 来获得 hash 性能的提升。2 t) U" V  @# K' Q( m; l+ C' i

% P5 ]3 ]+ |! M( U: R6 f+ d2 ?Neo中的hash算法9 y) x$ p) A& [% F6 K
$ R) `3 @( v) \2 f& b
scrypt
) p/ ]* ?5 Z0 s& p, }3 B
; K4 F4 |$ B& t# i. I( ?' cscrpyt算法是由著名的FreeBSD黑客 Colin Percival为他的备份服务 Tarsnap开发的,当初的设计是为了降低CPU负荷,尽量少的依赖cpu计算,利用CPU闲置时间进行计算,因此scrypt不仅计算所需时间长,而且占用的内存也多,使得并行计算多个摘要异常困难,因此利用rainbow table进行暴力攻击更加困难。scrypt没有在生产环境中大规模应用,并且缺乏仔细的审察和广泛的函数库支持。所以scrpyt一直没有推广开,但是由于其内存依赖的设计特别符合当时对抗专业矿机的设计,成为数字货币算法发展的一个主要应用方向。% z5 @' ?4 Z. E$ L" b4 D% n
% v5 ^8 B& X) M( h, U
scrypt的参数
3 M! J* B4 B0 r# B; z: }6 D+ k. g. y
1 J9 R0 |8 `( N& ]9 e0 Q0 Zhttps://stackoverflow.com/questi ... scrypt-work-factors; f: E/ ]* x. D, M7 g2 l) @( s) z
( n& t7 T3 G2 G
Cpercival mentioned in his slides from 2009 something around
! c, W) W( _2 m: ?: _
( r5 V( C! ^+ o/ s4 e. ](N = 2^14, r = 8, p = 1) for
, o+ ]3 S+ y3 u% q5 d4 R. I& R- O" v1 r& c
scrypt特点
( V, S1 V; I3 q: ^
* p1 G, j( O  |. |' K: b1 J: Hscrpyt的出名主要是因为莱特币为了抵抗比特币矿机采用的一个算法,可以指定内存和cpu的使用量,可以用参数确定hash的时间。
8 z: Z! a) B4 q: \( l1 b5 {
( Q/ ^, m7 x9 c5 ONeo中如何使用scrypt
# {. U) ^0 _) x/ g3 i& J  O  o, j- A5 Z- ]" l
// in NEP6Account
$ u+ H8 O# P4 ^% `0 w$ T1 K6 d* A) ]! q, i/ N' a4 \
   public NEP6Account(NEP6Wallet wallet,
- |; W2 |6 t) r3 c4 j
: V) q8 v0 i* S$ _/ P4 c* a. T! p              UInt160 scriptHash, KeyPair key, string password)
+ O# Q! p* I/ \+ {2 G4 t+ S( b& e3 N. B# U  b
            : this(wallet,
" L0 ^, Y: M& [% Z% M% _; b1 c
3 G& k" [$ K  h/ N" {              scriptHash,  o' w  O" [% w% z  R
9 I5 @  V0 R; f# J% l" b! s
              key.Export(password, wallet.Scrypt.N, wallet.Scrypt.R, wallet.Scrypt.P))
4 k. e- T7 Z8 q% Q. y2 s. X  ?2 M0 a$ _+ \
        {9 _, j( d; u( L; X# k( m( ?, l+ h

: T; m3 v+ ~- {6 }: c            this.key = key;
2 }" g/ ~! ]4 G1 D
  K& o0 Q! a; w! K        }; a$ B0 d3 Q# `* r6 `
- Z/ m% L# G4 W
// in class KeyPair$ d1 g( S* O! \0 ], c7 i1 R
# y, e) c3 U2 N3 H# d. `! S
public string Export(string passphrase, int N = 16384, int r = 8, int p = 8)& n) l$ X$ e  E( s5 Z; L7 P2 F
  ^6 G6 U7 U. B) m
{
% @, G1 h0 h4 j4 q8 v7 e" P
. b0 g% y: Y, n    using (Decrypt())' |+ g. P4 G, V

9 {% X4 Z2 o" X' g( H- e3 B4 ^1 n    {5 M  y+ w$ X: m( A* |/ f: |* ~
0 w9 n% Z& v: h+ t
        UInt160 script_hash = Contract.
; B1 W! ^) S2 h5 V1 @
+ v) z5 B8 E$ {3 q" }% e* b            CreateSignatureRedeemScript(PublicKey).ToScriptHash();
% ^4 W% Z1 z; V4 n/ X
) o+ I$ h$ F; i3 F  H) ?' N: q$ {        
4 D, o! S% v. d. U, n, I+ X* j9 O0 {" d/ c/ t# [) Y6 y' |
        string address = Wallet.ToAddress(script_hash);
9 t6 K8 ?2 y$ m- a/ j/ B6 @$ V
6 H6 f# c' Z% n2 j' x- D. D: y' V        byte[] addresshash = Encoding.ASCII.GetBytes(address)0 f2 _7 r+ x( a6 ^; n
" ]) ?* U6 }6 [
            .Sha256().Sha256().Take(4).ToArray();  ]" T% o* m, [+ a) A; M  k3 f# n
, a+ a8 B7 |0 f: A4 i' H
        
3 E) C) P( T. v: s; B) C
* ^5 H5 D1 O4 g, o        byte[] derivedkey = SCrypt.DeriveKey(
$ U" f$ @/ S, |7 t9 u
+ ]; O2 y3 @2 G2 {            Encoding.UTF8.GetBytes(passphrase), addresshash, N, r, p, 64);
8 w% u/ ^/ @( t0 R% I1 x0 ^* Q, n( `0 p2 \4 J
        
2 @4 H) T" S4 j" |2 i
; Q: u& B( d- ?. C' U0 p* v7 L6 G! ^6 b        byte[] derivedhalf1 = derivedkey.Take(32).ToArray();* [/ T5 |. }0 w! L1 X- b
$ _& N0 y' V* b. [' L$ ?
        byte[] derivedhalf2 = derivedkey.Skip(32).ToArray();
4 O$ J& |" @* G' J5 @  o" G/ D1 f3 {1 R/ c+ \$ C, r
        
0 P5 u, a! p: k
' H$ X9 Z1 l2 |# W        byte[] encryptedkey = XOR(PrivateKey, derivedhalf1)
! N- V1 B5 k: ?: R5 q, v
7 p! {/ u/ D% y5 {! C            .AES256Encrypt(derivedhalf2);
8 U8 r5 i0 }" f- {) H& u8 N8 }8 C$ w: t6 P
        
! ?- w! N0 U4 e# \! f, J
+ A+ T( {1 D" V# p  {        byte[] buffer = new byte[39];/ O1 B& N, H" |% r% P7 m( E$ |6 \% [
$ L9 u% S; t) D8 z
        buffer[0] = 0x01;
) T- N+ v2 M2 E1 c* n  H
+ z8 m1 K* l# C4 R% H5 P        buffer[1] = 0x42;
: O8 z* G) M, j. d
5 L  r( Z, u! Z3 x% j  \        buffer[2] = 0xe0;
  M: U3 A1 V5 u9 u. |
7 W* ~  a* d) S8 ~        Buffer.BlockCopy(addresshash, 0, buffer, 3, addresshash.Length);
  S8 P3 W2 R9 B4 h) Z# u7 i1 j! L2 N, R
        Buffer.BlockCopy(encryptedkey, 0, buffer, 7, encryptedkey.Length);9 ^, P  Z4 n4 b

1 Q+ b, ^2 x8 X4 M5 f        return buffer.Base58CheckEncode();6 Q; E2 j. W# ?" G4 J! v- O- P

( M; j& Z* s$ y& R# Z    }8 g8 q7 W. p, J% _' x% l
& r1 a8 [/ a: H
}8 O4 t9 g0 Q- Q5 g( M) Z5 ~

) ~" D. u1 ?) N, }4 G可见SCrypt.DeriveKey方法参与了加密密钥的生成过程。后面解密也必然使用到了这个hash算法。所以该hash算法参与了加密过程,而加密密钥用AES256Encrypt生成。可以确定的是,使用该算法的逆过程,可以解密出密钥来,这个比WIF要安全。
) J! C" G  J7 ?: Y# I# A4 z# O) w2 a( ^  V  m
Murmur3' [7 _8 m  D. t% H! Z# S
$ f! G( @: S  u- p. }4 o" B% q4 Y( A
MurmurHash 是一种非加密型哈希函数,适用于一般的哈希检索操作。[1][2][3]由Austin Appleby在2008年发明,[4][5] 并出现了多个变种,[6] 都已经发布到了公有领域(public domain)。与其它流行的哈希函数相比,对于规律性较强的key,MurmurHash的随机分布特征表现更良好。[7]
1 G! Z7 U' e# m4 C- w
2 @9 O  C; R# b: c2 xMurmur3特点! {' X& z3 t2 W# d9 \2 R
1 l  B: u  E8 F: I$ e  ?  ?
1.碰撞率低1 \1 D. w  T2 y$ l0 k

6 S$ k1 P% a3 W" |8 _7 _/ D2.计算速度快' ~5 v% `+ K# ~8 d. f
# k6 C, c& ?% T( t- b  r
3.擅长大文件的hash0 {7 d$ ]* S! Z8 c2 X2 \7 X) C

" a0 f- a  Z8 S# M! j. P* UNeo中如何使用Murmur3
8 O; m/ p5 d0 R1 B5 R6 X+ s. t  f% R  Q$ _& G/ ~% ?+ `
Neo中Murmur3
- n+ _# @. d: g
& C2 Z% N6 q1 {; A1 T- yMurmur3的具体算法,以后再研究,现在大致知道,Neo用Murmur3生成key,也在BloomFilter中使用了。
$ n) ~# `8 M# u6 F% {1 K. B) R- n! d$ M6 O# p8 Z
RIPEMD-160
! f9 U/ l# S7 h: S
' |0 J3 V2 [4 FNeo中用这个算法来生成短一点的hash值,script hash就是用了这个算法。! h0 p  e  `/ K* B& x4 n
, n1 D8 n0 I' q4 [0 y1 a, q1 Q
// in neo-compiler/neo/neo/Core/Helper.cs
. I6 E  ]3 t& j$ @' d4 J0 q0 V3 p, W
public static UInt160 ToScriptHash(this byte[] script)
5 |! {4 e- I/ q5 d$ l- [: j5 _- e
2 \* }3 e! o" O" |        {7 Y1 C8 r) p: X. l$ F: g3 H* b

! U+ y$ V8 }4 `5 o2 }1 y" ^            return new UInt160(Crypto.Default.Hash160(script));5 I/ n" I7 `( S& p* {; \

5 K) O5 s/ R$ d1 l4 [        }3 `! T  t% U. K, {1 y: G
. k1 x3 k; J: ?0 M8 a
RIPEMD-160算法的特点
9 @; P2 W7 p! ^1 H& v( \# k, h$ W3 I- Y/ {0 M
RIPEMD-160能表现出理想的 雪崩效应 (例如将 d 改成 c,即微小的变化就能产生一个完全不同的哈希值):+ S1 X1 V7 ?4 E1 x" ~8 Z3 R

4 ?0 g! g! Z6 H: D- `) U加密算法体系, E) j3 X) h1 X0 D/ f, c
* J4 u# G9 A* P! N; q+ d
现代加密算法的典型组件包括:加解密算法、加密密钥、解密密钥。其中,加解密算法自身是固定不变的,一般是公开可见的;密钥则往往每次不同,并且需要保护起来,一般来说,对同一种算法,密钥长度越长,则加密强度越大。
8 \3 ^5 p! _! V& Z
' s9 a7 j. e$ a$ o* i加密过程中,通过加密算法和加密密钥,对明文进行加密,获得密文。7 S& b7 b& M& c+ K) V$ s
7 q4 {' D- s7 [2 B& `6 B! Y  }2 z
解密过程中,通过解密算法和解密密钥,对密文进行解密,获得明文。
# S4 |3 n, Q  J! m5 o# e/ C! ^) ~7 s" E1 E. X. i3 g2 X
根据加解密的密钥是否相同,算法可以分为对称加密(symmetric cryptography,又称公共密钥加密,common-key cryptography)和非对称加密(asymmetric cryptography,又称公钥加密,public-key cryptography)。两种模式适用于不同的需求,恰好形成互补,很多时候也可以组合使用,形成混合加密机制。; ^) D' b1 l9 [0 G) T/ o

8 B+ L& D8 y( q6 x: I( L& e并非所有加密算法的强度都可以从数学上进行证明。公认的高强度加密算法是在经过长时间各方面实践论证后,被大家所认可,不代表其不存在漏洞。但任何时候,自行发明加密算法都是一种不太明智的行为。
4 t- L) ~9 A. K: N, m$ S2 ?/ l2 x! J& m% d; ~
对称加密$ ?3 _% C$ u- O& \
4 F1 v0 ^2 R6 m( Q
顾名思义,加解密的密钥是相同的。8 G/ l+ U9 I) P, M
7 |( E1 s! x5 D/ c' n
对称加密优缺点6 z4 y' g0 q3 C& A+ m, c, F/ I
% g" B, G7 s! k8 G
优点是加解密效率高(速度快,空间占用小),加密强度高。6 e1 g8 l# _" ^% w7 W9 Q: U

5 x3 X2 j) ~' Q1 N+ H4 i- |% u缺点是参与多方都需要持有密钥,一旦有人泄露则安全性被破坏;另外如何在不安全通道下分发密钥也是个问题。
5 G- ?: D' o% X" O/ {5 p5 ?
, P$ k& r6 x9 U适用于大量数据的加解密;不能用于签名场景;需要提前分发密钥。  Z# X  r# V+ N) I
! R3 y/ }4 E& y  ]" q4 ^
对称加密实现
, f3 ?0 G3 m2 P9 V0 Z' N* I* I: L0 O% B1 C+ ~- F9 v  v3 L0 H) t
对称密码从实现原理上可以分为两种:分组密码和序列密码。前者将明文切分为定长数据块作为加密单位,应用最为广泛。后者则只对一个字节进行加密,且密码不断变化,只用在一些特定领域,如数字媒介的加密等。4 J! e) e. ]: [  A& l7 m, u
, m  N3 p; P9 ^
代表算法包括 DES、3DES、AES、IDEA 等。9 e) |* a7 o+ P8 E) t' [

4 K4 ^/ w; \  H: v7 t/ O, ~& ZDES(Data Encryption Standard):经典的分组加密算法,1977 年由美国联邦信息处理标准(FIPS)所采用 FIPS-46-3,将 64 位明文加密为 64 位的密文,其密钥长度为 56 位 + 8 位校验。现在已经很容易被暴力破解。
/ b3 v6 T, s* @' F: o
0 g* ~0 y" `: Y. n( m9 z9 {( ?3DES:三重 DES 操作:加密 –> 解密 –> 加密,处理过程和加密强度优于 DES,但现在也被认为不够安全。/ y8 r7 ]# u  i$ X) s) U. P! B8 B6 E
. Q6 d: X8 V0 ^% d3 d: G  N
AES(Advanced Encryption Standard):美国国家标准研究所(NIST)采用取代 DES 成为对称加密实现的标准,1997~2000 年 NIST 从 15 个候选算法中评选 Rijndael 算法(由比利时密码学家 Joan Daemon 和 Vincent Rijmen 发明)作为 AES,标准为 FIPS-197。AES 也是分组算法,分组长度为 128、192、256 位三种。AES 的优势在于处理速度快,整个过程可以数学化描述,目前尚未有有效的破解手段。6 j8 V2 X- u7 @0 Q

7 j8 l4 ~9 K' e: J4 r% B注:分组加密每次只能处理固定长度的明文,因此过长的内容需要采用一定模式进行加密,《实用密码学》中推荐使用 密文分组链接(Cipher Block Chain,CBC)、计数器(Counter,CTR)模式。6 c/ L9 d" `+ w
- C4 `4 {/ h9 R% e- b+ G
Neo中的AES; R) Z& F" P  r/ z
4 s: v, i! b" V8 j" c5 F
在钱包的加解密中,使用了该算法。
& |/ A5 e- Y9 H, `' [( h( f+ z; S9 J/ g7 i4 ]1 ?' b
下图的代码在/neo/Wallets/Wallet.cs中,NEP是neo enhancement proposal的意思。参数nep2就是符合这个格式的一个Neo钱包文件。0 X* S0 F/ r% Z' i! {8 ]; d

+ M" D5 M$ u4 A; D8 y  H" X拿到私钥5 U. m! ^& {" \$ j) A# ~  H
" I3 c% c( |, l
具体的过程,后面再仔细研究分享出来。
" n6 u  {4 b# h2 v5 F! o; C/ X5 E* W4 ^* q0 B
非对称加密
% ?& g8 \& }8 x$ M
' A& P* R  F9 y2 E1 k+ O4 [非对称加密是现代密码学历史上最为伟大的发明,可以很好的解决对称加密需要的提前分发密钥问题。顾名思义,加密密钥和解密密钥是不同的,分别称为公钥和私钥。公钥一般是公开的,人人可获取的,私钥一般是个人自己持有,不能被他人获取。
. u$ l. _" H) H% \" l3 |
0 c/ e, {$ a- Z9 X1 O非对称加密优缺点, T" e! c4 V( ]9 s$ |
' g' ^, l2 g! {. f: I; G8 Q7 k
优点是公私钥分开,不安全通道也可使用。) t: I( H/ h. O- Q; r
$ I! p5 t& s! y+ }$ g" H, z
缺点是加解密速度慢,一般比对称加解密算法慢两到三个数量级;同时加密强度相比对称加密要差。6 j3 B/ T3 E% `" ^' V6 J
5 `9 G. {9 n1 }7 X' u4 n
非对称加密代表算法
& w1 x8 ^8 ^/ m- j! B* L& f5 [8 {* D
. m7 q+ z7 P. N. [: I/ O非对称加密算法的安全性往往需要基于数学问题来保障,目前主要有基于大数质因子分解、离散对数、椭圆曲线等几种思路。* e; V4 ?* ^3 K6 j4 P4 q9 b
# d4 }0 T* l4 D* M, p
代表算法包括:RSA、ElGamal、椭圆曲线(Elliptic Curve Crytosystems,ECC)系列算法。
5 x4 a5 @' G0 p8 C* W7 t
* u- u2 h7 N, i6 `RSA:经典的公钥算法,1978 年由 Ron Rivest、Adi Shamir、Leonard Adleman 共同提出,三人于 2002 年获得图灵奖。算法利用了对大数进行质因子分解困难的特性,但目前还没有数学证明两者难度等价,或许存在未知算法在不进行大数分解的前提下解密。
3 T) H9 k9 _8 G) X( y: {' v9 d1 }5 V) E
Diffie-Hellman 密钥交换:基于离散对数无法快速求解,可以在不安全的通道上,双方协商一个公共密钥。
; y) i" Q' r; O* M8 A; z, U, D  E+ t5 k" R5 c
ElGamal:由 Taher ElGamal 设计,利用了模运算下求离散对数困难的特性。被应用在 PGP 等安全工具中。! O" o: `  y3 u) \3 q
, X& Y# h, z: v( e8 u
椭圆曲线算法(Elliptic curve cryptography,ECC):现代备受关注的算法系列,基于对椭圆曲线上特定点进行特殊乘法逆运算难以计算的特性。最早在 1985 年由 Neal Koblitz 和 Victor Miller 分别独立提出。ECC 系列算法一般被认为具备较高的安全性,但加解密计算过程往往比较费时。一般适用于签名场景或密钥协商,不适于大量数据的加解密。: X$ p% _8 [1 q5 W/ y7 X

9 |$ O" n: m( J! ]2 i7 hRSA 算法等已被认为不够安全,一般推荐采用椭圆曲线系列算法。
0 }3 I' r/ T7 ]! Z, d6 n1 [& }% i' f% v+ ?* C( {6 @' @& K( g
Neo中的数字签名算法
+ m  }! Z& C& G, h: s" z
: r3 v' ]% g! F1 L) E* x- j" V+ Q在Neo中,也使用了非对称加密算法,我们通过代码来看看是如何使用的。. @: |8 [. G5 L; G5 P

0 F5 P  C$ q" T/ R6 `public virtual WalletAccount Import(X509Certificate2 cert)
' N7 b6 n$ w2 q. W. u0 S1 {, X
4 p$ `1 a, _: c  I) d8 r5 |        {
- X0 A: R3 X' O. E# O2 i3 T; w+ ?. \
            byte[] privateKey;
/ a! B0 X; u: [
; r) \4 r# N3 m9 B            using (ECDsa ecdsa = cert.GetECDsaPrivateKey())
+ \1 v3 G3 {% a6 v* h" _! p. n# p
            {8 Y! B& C) S5 j3 f

* {5 w, C1 r* }+ @! j0 D' I                privateKey = ecdsa.ExportParameters(true).D;0 [! O' \' c1 Z8 _4 s7 s6 [
3 [3 A2 Z! ?. N# ]" j
            }
. e. u! Q0 ?' L# ~, R$ F( }' B3 ?
0 [! u, J, O0 R* p            WalletAccount account = CreateAccount(privateKey);( f! E9 w. ^  x5 M

$ I5 O& s  Y; c! Y* T/ v! i# X            Array.Clear(privateKey, 0, privateKey.Length);
4 l# K+ f6 Y. e  O; G3 T: u7 U- `2 `0 \- H0 K6 s$ q4 O& l
            return account;
+ m5 a: \0 s5 g0 p- O
# q4 P+ C' q4 {: z8 _2 n: Q1 a3 g        }
" H- N. y7 v/ ]# H, d! h3 f' E
$ Q+ c3 N! K6 h% Y! z2 U8 P% IX509Certificate2是数字证书,和我们在https里面使用的是一样的,从里面拿出私钥后,创建钱包。
" R+ j% U: L, K( N8 q( i9 c1 F: h8 i1 n. ^" ]! A
总结( ]. M5 @. V2 o! \6 m

5 v, B: n& C9 Q( ~% P目前只是简单的介绍了一下Neo中加密算法的使用情况,这些加密算法的原理和实现也是很有意思的,后面看看怎么实现的,再分享出来。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

深圳林妙可 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    33