Hi 游客

更多精彩,请登录!

比特池塘 区块链前沿 正文

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

深圳林妙可
205 0 0
区块链是基于加密算法,共识算法,p2p网络和经济激励的一个系统,加密算法在里面起到了非常关键的作用,总结一下Neo使用到的加密算法吧。: ]( r* r" I! r

  t, C! B; ^& s9 z: k关于区块链中密码学的介绍,yeasy大牛的文章已经介绍的非常好,下文主要通过和Neo结合,加上一些自己的理解,去讲述一下加密算法的使用方法。
! q# P+ o9 p8 o) k  p- G( K9 r7 q1 T+ U! ?  ~1 p2 q
Hash 算法
3 H# G, S( \+ `$ E
/ _$ ^" \1 v' v2 @! Y' T5 t4 s" J4 WHash (哈希或散列)算法是信息技术领域非常基础也非常重要的技术。它能任意长度的二进制值(明文)映射为较短的固定长度的二进制值(Hash 值),并且不同的明文很难映射为相同的 Hash 值。
0 {* N9 ]& j1 R  }, q# g
9 N: m0 p% x! W% V! A6 yhash函数的作用% R: f0 G. }; s& P' r+ p( B  [# r* Y

+ {* p" Y% w9 e8 i注意上一篇文章说明了如何将hash后的字符串保存到Neo的UInt256类型,其中一个前提就是结果集合在[0-15]之间。
1 {0 o4 q/ X% o9 K
% V" [0 Q6 D+ n5 i哈希完全不等于加密,很多时候开发人员都对用户表中的密码进行哈希后保存,实际上不叫做加密,只是相当于把密码的“特征指纹”保存下来,而对非法攻击者来说,在不知道真实的“密码”的情况下,得到有相同指纹的密码是极为困难的。- f3 m1 e; W) k# Q
' B; q/ m' P0 O& F1 z
一个优秀的 hash 算法,将能实现:0 I* W  g0 I& Q. B$ n+ |

% ], f9 k5 G3 F  _& {正向快速:给定明文和 hash 算法,在有限时间和有限资源内能计算出 hash 值。
" f/ l& J( I. s. f$ C0 O
1 D5 _! D3 x/ d0 [逆向困难:给定(若干) hash 值,在有限时间内很难(基本不可能)逆推出明文。
0 q$ C) t6 W* S( u% n' L1 n2 `4 N6 D& E: ~
输入敏感:原始输入信息修改一点信息,产生的 hash 值看起来应该都有很大不同。
! O+ s: @) H. ?2 K: h1 N) I  o, H  m& N* U  P0 v; K6 l( o
冲突避免:很难找到两段内容不同的明文,使得它们的 hash 值一致(发生冲突)。( L. x7 C& g' S% M

0 z$ h% ~, g: R( h* k3 f! y% u目前,一般认为 MD5 和 SHA1 已经不够安全,推荐至少使用 SHA2-256 算法。
+ O" s- _0 D2 ~& Q+ {) ~( w4 J. M
4 @" w) _. b5 g& Q/ R! c; r一般的,Hash 算法都是算力敏感型,意味着计算资源是瓶颈,主频越高的 CPU 进行 Hash 的速度也越快。
, p. |' m6 R* [3 j4 E% X5 F# N% _; |! F% f$ _  q5 B' X7 T4 q  [# v
也有一些 Hash 算法不是算力敏感的,例如 scrypt,需要大量的内存资源,节点不能通过简单的增加更多 CPU 来获得 hash 性能的提升。+ U' x0 @1 Z1 }. W

) ?# {' _2 E: F. z( k) n" y0 v9 uNeo中的hash算法
; u& s7 _" {# w! F7 C7 B4 O4 a4 g
7 x8 E  s- o6 y: }/ |3 X) C. Sscrypt, G- R6 O9 L( D9 w

7 q5 S2 A" n0 I5 s6 Dscrpyt算法是由著名的FreeBSD黑客 Colin Percival为他的备份服务 Tarsnap开发的,当初的设计是为了降低CPU负荷,尽量少的依赖cpu计算,利用CPU闲置时间进行计算,因此scrypt不仅计算所需时间长,而且占用的内存也多,使得并行计算多个摘要异常困难,因此利用rainbow table进行暴力攻击更加困难。scrypt没有在生产环境中大规模应用,并且缺乏仔细的审察和广泛的函数库支持。所以scrpyt一直没有推广开,但是由于其内存依赖的设计特别符合当时对抗专业矿机的设计,成为数字货币算法发展的一个主要应用方向。) V5 Y) F% A7 \7 I! }

+ B$ |' {, ]+ H' lscrypt的参数
, H1 ^' s  z" F  z& r% V9 i% B# L# K
https://stackoverflow.com/questi ... scrypt-work-factors2 m( Z* k; i# @& v+ P7 \1 F

" N' m  g+ s) g+ Z/ D) q, [Cpercival mentioned in his slides from 2009 something around  [, {7 h/ x& b5 C7 ~! _6 V* X
+ T$ c4 L5 }: x. c6 ]* [6 ~! D, J7 j
(N = 2^14, r = 8, p = 1) for, l9 b: R, A  X% Q* a: _+ U
2 O5 M8 w- M6 D( W/ ~
scrypt特点. p% y# w" v4 v" n7 n
( C. v0 l; b3 {
scrpyt的出名主要是因为莱特币为了抵抗比特币矿机采用的一个算法,可以指定内存和cpu的使用量,可以用参数确定hash的时间。6 \5 O2 o2 s6 J
8 B; V5 h: ?3 c- |8 y, x
Neo中如何使用scrypt
( `; D; H6 y- S3 c- h4 ]* E% \) M+ @* f$ G$ K$ O! w, \2 G9 C3 `
// in NEP6Account
" B( a+ s$ m. z
2 ^% t3 d9 i, W. L$ z' j   public NEP6Account(NEP6Wallet wallet,6 j& \  Y% E! |; y

  \5 N6 G" u5 F  e- B4 _9 {& ]$ }' s8 F# A              UInt160 scriptHash, KeyPair key, string password)
4 Y9 Z2 N; Q1 P" E: l) C; @8 K/ P, J. K4 D; N
            : this(wallet,0 G" N1 j  n  _( a( P
$ Q0 F( s+ @, u$ D1 {* d+ S( k. C
              scriptHash,- `% G1 s9 @! M

! x: Y1 T2 ^  s) I# T              key.Export(password, wallet.Scrypt.N, wallet.Scrypt.R, wallet.Scrypt.P))7 O3 \4 p" ]+ ^( T/ s; U6 C; l  w8 `
* l4 z5 a; Z' f# H4 Z
        {  H$ d8 D4 p, m

$ e6 u1 C9 q7 d0 Z            this.key = key;3 B6 G, R9 y2 n* L- P3 i
# M8 k0 g5 M, [$ o9 V
        }/ l* g: ]6 q. v8 K  z* _
6 S9 B0 h. c+ `& o  C, S+ J3 `8 X$ b
// in class KeyPair
( T4 f& p1 ]7 N  Y) M* ?5 D- R' G% w8 _) V! _
public string Export(string passphrase, int N = 16384, int r = 8, int p = 8)
3 I* x0 J2 I7 E5 Y4 i/ }8 o& q/ i2 r) g4 q# K
{
2 [" ?2 @; A/ K4 @  K+ @' \/ Q
3 f3 c' \( @8 U# `6 E% O+ @    using (Decrypt())2 C6 V. w: T; o6 q4 D! ^

! J# @/ X6 d. _/ }, h9 a# l) s& Z    {  Y" _6 ^( u- ^% P9 I& ~
2 C/ a; \- ~0 X% j$ X4 R1 b+ z( z+ a, S
        UInt160 script_hash = Contract.
/ v0 V7 O. t9 I& p# u2 R3 j. D
% b) i' r) G7 o& w8 p6 g            CreateSignatureRedeemScript(PublicKey).ToScriptHash();
' b- j) ~4 E- \+ a; F" Y* y
* e% r/ e; |/ w& f( S$ j        
& k1 n2 K+ ^8 |( ~: V! G
. d' o$ I5 g5 V$ F* ~  p- v        string address = Wallet.ToAddress(script_hash);8 I/ M( }" K8 e2 ?: o

& r; f% b3 b  `( P( l4 T        byte[] addresshash = Encoding.ASCII.GetBytes(address)2 B5 A5 @+ v$ _* e( P* J( N: z2 b

) x' e; K) q1 z; @4 l            .Sha256().Sha256().Take(4).ToArray();
! Q) B. M6 y$ W. ]! }; @% g* Z5 i! K7 Z
        
; I1 I1 x; D( a# y4 y
& i. T0 L3 p7 r        byte[] derivedkey = SCrypt.DeriveKey(( b& v# m0 F; U* D8 M. S1 @
# q1 W/ _$ u9 ]* Z  O
            Encoding.UTF8.GetBytes(passphrase), addresshash, N, r, p, 64);
4 F- J* `: V- c4 D) y; X4 t) V4 Z( C8 M: c5 r* h; @2 g
        
7 h6 |, j( t7 B& J. Z
* y3 `4 I. C% {3 h: g        byte[] derivedhalf1 = derivedkey.Take(32).ToArray();5 n" d6 A4 E& g

1 Q9 A& }$ d' P0 \1 U9 g        byte[] derivedhalf2 = derivedkey.Skip(32).ToArray();
/ d$ Y3 E" o: i$ M( Q& c" n2 b9 R% L* G5 i( p4 ?+ ?( N
        
4 U& F& |9 j) C3 T+ t
- l" G+ G% w5 n- p' L: L        byte[] encryptedkey = XOR(PrivateKey, derivedhalf1)  t& ]) z0 Q" \6 W

* V- ]" Y5 u3 S            .AES256Encrypt(derivedhalf2);- p: Q' L. E4 _3 N7 o
6 B9 B. W2 x* U
        8 g. @5 s, h* M5 A2 Y- U

1 J  W6 |! R3 Q1 s3 P) {        byte[] buffer = new byte[39];
& R6 A2 g8 d; A) r" s+ n% I7 q6 c) B6 m* _- z
        buffer[0] = 0x01;
: i" k  w* n- k8 i4 T% v8 k9 [4 }  y
        buffer[1] = 0x42;
0 t9 @8 N. t) L# W: Z4 j4 u# |2 k  @0 ^$ }1 {
        buffer[2] = 0xe0;
% I' @4 j' Y' e( |( J, d# G; r# _$ ^: b9 I9 v* u3 _  D
        Buffer.BlockCopy(addresshash, 0, buffer, 3, addresshash.Length);2 f1 X$ ?6 v; v% Q2 ^9 B9 U

: v3 v' _; Z" W0 f# X* c( {$ E        Buffer.BlockCopy(encryptedkey, 0, buffer, 7, encryptedkey.Length);5 W! f2 y% p( j* l
1 K  u) H. q8 P2 G3 @" ]) r
        return buffer.Base58CheckEncode();' T3 u+ Q. C, h5 ]. D* n
  a% n0 S$ Z3 u
    }+ J( `: J2 Q8 a" g/ Q0 z6 ~
& w/ u3 U- w: ^& G
}8 j$ W* c4 f4 [$ H( [6 B4 U

' c. L0 \1 n- y# V/ \: C可见SCrypt.DeriveKey方法参与了加密密钥的生成过程。后面解密也必然使用到了这个hash算法。所以该hash算法参与了加密过程,而加密密钥用AES256Encrypt生成。可以确定的是,使用该算法的逆过程,可以解密出密钥来,这个比WIF要安全。
4 f( @7 D2 j5 y- L+ G- }  y- M9 V" e* d$ Q4 V0 B
Murmur3: v/ [. @2 t5 j% W' `2 I+ g' p

% H0 O+ T2 L* fMurmurHash 是一种非加密型哈希函数,适用于一般的哈希检索操作。[1][2][3]由Austin Appleby在2008年发明,[4][5] 并出现了多个变种,[6] 都已经发布到了公有领域(public domain)。与其它流行的哈希函数相比,对于规律性较强的key,MurmurHash的随机分布特征表现更良好。[7]) `1 m4 Q/ X  w- H  W

; V! {! ~& I& j2 c4 U- c' b+ g. sMurmur3特点
& n. l: a& C5 W" ^9 m0 L# ^1 h% g7 Z) y' j7 K. G
1.碰撞率低+ g: S5 x4 e' {8 i! q

$ O% e) z% `) a6 n% v+ q2.计算速度快
, l$ S+ N6 u9 B3 k  C
5 Y- S& a. q( G1 k3.擅长大文件的hash
( z  o% U' Q6 k% w; V/ |& l! U; [: q
Neo中如何使用Murmur3" f5 i6 a9 B; [1 O
! m; m1 D9 }0 r4 @: w% c
Neo中Murmur3# f! X5 u# `+ n) B' \; x# p
( q! q/ L0 F8 ~; N" Y7 [- Q
Murmur3的具体算法,以后再研究,现在大致知道,Neo用Murmur3生成key,也在BloomFilter中使用了。0 l" ?( C! K$ M9 ?. F0 B
4 O+ m6 C. i, @& k# W: a0 c& F1 N
RIPEMD-160
! j! r# [& Y2 r* d$ y: f
8 N( _: \3 w; b9 E% y- vNeo中用这个算法来生成短一点的hash值,script hash就是用了这个算法。
* ?" a; E4 k- ]  b( S( e- ^* P' Z2 r6 r
// in neo-compiler/neo/neo/Core/Helper.cs
+ ?+ s7 {% ?# m% q5 K$ \: t/ I6 c  [% t4 ]; p+ t9 P3 a9 @
public static UInt160 ToScriptHash(this byte[] script)3 Q. x% K  ]* S1 v% a7 g
/ Y  V( M- x. j0 y4 s1 v
        {
* p! U/ O# b$ P: Q( H3 s
7 q" A; i2 W4 w$ F2 r2 d# v9 T* p            return new UInt160(Crypto.Default.Hash160(script));* w. x" g  u3 R2 Z  I

7 w( ?8 c; l- g+ g0 G4 c        }& n5 k7 Y" b" A# L" @' e
% |  o9 I8 }. u# j) V3 m; E: a
RIPEMD-160算法的特点
7 ?; ]0 b6 X4 R1 l8 d0 F1 ~8 [, F# a/ D4 U3 R- [# r  R4 @7 h( W
RIPEMD-160能表现出理想的 雪崩效应 (例如将 d 改成 c,即微小的变化就能产生一个完全不同的哈希值):
& @% U$ g, i  `6 Y8 `! O$ A" F  U
$ U4 h% `  @, A加密算法体系
4 F& R" ]. k4 n. _8 w. W% i) X9 P/ Z. @
现代加密算法的典型组件包括:加解密算法、加密密钥、解密密钥。其中,加解密算法自身是固定不变的,一般是公开可见的;密钥则往往每次不同,并且需要保护起来,一般来说,对同一种算法,密钥长度越长,则加密强度越大。
* H* O7 M* ^. J+ d) l# c: ]% B1 R
; J6 x  k1 M7 x" q( F+ f6 a6 r加密过程中,通过加密算法和加密密钥,对明文进行加密,获得密文。
0 |+ A3 p4 ~2 ]  m
( U* v2 j" y! x6 Y. [! X5 G解密过程中,通过解密算法和解密密钥,对密文进行解密,获得明文。
7 _3 z5 V4 R' m2 T# x7 _+ z9 s- m4 w5 `# M- t! Y+ h+ V+ g
根据加解密的密钥是否相同,算法可以分为对称加密(symmetric cryptography,又称公共密钥加密,common-key cryptography)和非对称加密(asymmetric cryptography,又称公钥加密,public-key cryptography)。两种模式适用于不同的需求,恰好形成互补,很多时候也可以组合使用,形成混合加密机制。
7 m; t. T. A. E4 L8 l% g1 ]  n: K* t0 s0 S# x- E' i7 \
并非所有加密算法的强度都可以从数学上进行证明。公认的高强度加密算法是在经过长时间各方面实践论证后,被大家所认可,不代表其不存在漏洞。但任何时候,自行发明加密算法都是一种不太明智的行为。$ {* j: s) b/ \5 Q9 p# k& d4 m
7 \' s$ E* f7 P0 e
对称加密
4 L# h: K! A. [3 m( f/ c6 X( k. i& }$ B6 a
顾名思义,加解密的密钥是相同的。
* C7 O& B' q, ?9 Q6 c2 e
/ ?/ |+ v. k; @9 t! u对称加密优缺点6 u# d. H5 H$ K8 A# v* o# w" b
, v* _/ y+ S& g% T; j
优点是加解密效率高(速度快,空间占用小),加密强度高。4 W9 `. i7 r$ {8 d: ^  h( N* ?0 f
9 _2 {$ M, T* G! g/ p
缺点是参与多方都需要持有密钥,一旦有人泄露则安全性被破坏;另外如何在不安全通道下分发密钥也是个问题。
( [/ H' [: C4 ~- K% p9 Q
- Q' r0 ?/ o* e适用于大量数据的加解密;不能用于签名场景;需要提前分发密钥。; L4 l# e9 d* i) Q% }, u

! g) T: Y' }! s! M5 g对称加密实现
6 l- H+ Z' w+ G& i2 I# \; o) u5 b8 Q. u( P* ]0 B3 D
对称密码从实现原理上可以分为两种:分组密码和序列密码。前者将明文切分为定长数据块作为加密单位,应用最为广泛。后者则只对一个字节进行加密,且密码不断变化,只用在一些特定领域,如数字媒介的加密等。7 _6 s1 [% E* z5 @' T
' ^6 p1 R' W: F6 @
代表算法包括 DES、3DES、AES、IDEA 等。5 B7 z7 R. s) p1 r

# z$ v" }3 _8 p4 `: GDES(Data Encryption Standard):经典的分组加密算法,1977 年由美国联邦信息处理标准(FIPS)所采用 FIPS-46-3,将 64 位明文加密为 64 位的密文,其密钥长度为 56 位 + 8 位校验。现在已经很容易被暴力破解。
, l- s3 K( I. b# Q) B4 _# \9 a" j2 F" m
3DES:三重 DES 操作:加密 –> 解密 –> 加密,处理过程和加密强度优于 DES,但现在也被认为不够安全。
* I( y/ X$ b0 p! e  A* I7 C
/ ]$ x9 y' u& _# ^- w0 B  kAES(Advanced Encryption Standard):美国国家标准研究所(NIST)采用取代 DES 成为对称加密实现的标准,1997~2000 年 NIST 从 15 个候选算法中评选 Rijndael 算法(由比利时密码学家 Joan Daemon 和 Vincent Rijmen 发明)作为 AES,标准为 FIPS-197。AES 也是分组算法,分组长度为 128、192、256 位三种。AES 的优势在于处理速度快,整个过程可以数学化描述,目前尚未有有效的破解手段。
4 o5 r/ g7 U/ Z- F7 c( `
0 M# d7 B! F0 x" F: x0 d注:分组加密每次只能处理固定长度的明文,因此过长的内容需要采用一定模式进行加密,《实用密码学》中推荐使用 密文分组链接(Cipher Block Chain,CBC)、计数器(Counter,CTR)模式。, V( y9 W* X) L1 g" F4 ~" n) _* _3 }/ ]

+ t3 i% L2 j( X* g7 yNeo中的AES( [6 P$ E! e6 ]# S' `5 g

% Z' S' O& w( A; x在钱包的加解密中,使用了该算法。
3 a; @& P( g! U
' C) D! w) Z! {; i/ l+ M下图的代码在/neo/Wallets/Wallet.cs中,NEP是neo enhancement proposal的意思。参数nep2就是符合这个格式的一个Neo钱包文件。
! ~  F# m% @: V# O( r- P/ I2 b% ^
拿到私钥
( `: y$ {: }; H0 K9 U- l% R$ ?
) n0 `5 U% q- `- b8 |4 F具体的过程,后面再仔细研究分享出来。7 M- p6 B4 c1 i; Q# v

$ ~) P  G1 ~: _: c- ~+ F! f非对称加密/ f4 X# Q/ o& V/ J, |/ d8 f; u2 A
! J: p8 O" H% v  D- D/ B
非对称加密是现代密码学历史上最为伟大的发明,可以很好的解决对称加密需要的提前分发密钥问题。顾名思义,加密密钥和解密密钥是不同的,分别称为公钥和私钥。公钥一般是公开的,人人可获取的,私钥一般是个人自己持有,不能被他人获取。; G& c1 f- a2 i8 o7 O2 \
  e5 H8 L/ p9 i& J& b& t, e
非对称加密优缺点
7 i- G0 H( w& D& _8 ]6 Q
" H/ j  _' f- O2 i# s4 s优点是公私钥分开,不安全通道也可使用。
4 }" E: y( A; K+ Q' Q+ v4 A. E8 S& x0 V% a( ^
缺点是加解密速度慢,一般比对称加解密算法慢两到三个数量级;同时加密强度相比对称加密要差。
" y% F# {' i' [6 e( C
# Q" \' M" U9 |- @非对称加密代表算法0 ]- ?: v* m5 E. a$ Y

& x) Z! T; r( h非对称加密算法的安全性往往需要基于数学问题来保障,目前主要有基于大数质因子分解、离散对数、椭圆曲线等几种思路。2 C& J& b/ K9 s$ ]0 x* d6 q$ D
3 d! s' f# i5 t; q! w& b3 H# p: W
代表算法包括:RSA、ElGamal、椭圆曲线(Elliptic Curve Crytosystems,ECC)系列算法。: n' b1 r! f" Q' v6 ~. e
7 C" F3 a8 t' q$ V
RSA:经典的公钥算法,1978 年由 Ron Rivest、Adi Shamir、Leonard Adleman 共同提出,三人于 2002 年获得图灵奖。算法利用了对大数进行质因子分解困难的特性,但目前还没有数学证明两者难度等价,或许存在未知算法在不进行大数分解的前提下解密。$ c9 ]' @6 i: r/ a0 N

# j" o, R% B: j/ Y! n2 T# E  ]Diffie-Hellman 密钥交换:基于离散对数无法快速求解,可以在不安全的通道上,双方协商一个公共密钥。7 l- R; |! l7 y/ [& M% `$ R1 U+ y/ j* Y

$ g, Z  e! {( ?, f: NElGamal:由 Taher ElGamal 设计,利用了模运算下求离散对数困难的特性。被应用在 PGP 等安全工具中。. M) S5 ^. K3 f* U) O

: j9 N1 X4 U* |# i* R' i椭圆曲线算法(Elliptic curve cryptography,ECC):现代备受关注的算法系列,基于对椭圆曲线上特定点进行特殊乘法逆运算难以计算的特性。最早在 1985 年由 Neal Koblitz 和 Victor Miller 分别独立提出。ECC 系列算法一般被认为具备较高的安全性,但加解密计算过程往往比较费时。一般适用于签名场景或密钥协商,不适于大量数据的加解密。
4 r7 K9 b0 W* @, G; n6 K! D( C( T, I
: m; A$ R$ p  H7 U8 ]! p& eRSA 算法等已被认为不够安全,一般推荐采用椭圆曲线系列算法。
  Q; F' w" W. k1 ^% g: T# @4 T: K2 C/ p' I$ ^0 e+ a
Neo中的数字签名算法
* v! Y' W4 _+ M- `3 V% y9 h5 N. a6 b+ w: w2 l# p
在Neo中,也使用了非对称加密算法,我们通过代码来看看是如何使用的。
6 J6 S8 |4 Y4 _* z+ }3 T& {  v6 ]9 Q4 o! T: g4 s
public virtual WalletAccount Import(X509Certificate2 cert)! c! {" l6 n3 q( G2 L: \+ p: |

1 A1 m  [0 B( E7 ]3 @        {2 w4 Y& ?4 w: Y5 d5 z. \% ^

  {5 a; i" }" t4 l: K. c/ T            byte[] privateKey;
# S9 e  d& d8 a& M6 a# p, c2 Y/ e# r) H8 |( X$ q
            using (ECDsa ecdsa = cert.GetECDsaPrivateKey())3 f  Q; E% g0 V9 `! W8 j

- h; M% F3 E1 ^, P% n6 b  v% b4 k            {
" K, h- H3 {- M( q* \2 u5 |! e/ Q" t
                privateKey = ecdsa.ExportParameters(true).D;
0 z1 s$ O) E1 J( k; A  X
2 c2 o& X9 a2 S* X9 f- A9 v            }
5 d; q) v8 P" W) }1 \
; T( I* J. V. P            WalletAccount account = CreateAccount(privateKey);
5 j* v* \9 r. B) f; H" K" s' s
7 k" b6 p, W7 t) [; V            Array.Clear(privateKey, 0, privateKey.Length);
/ T- }/ R& l" M  N4 t9 N  x+ K6 Z4 P( H7 \" \0 J
            return account;; S. m$ r' \0 [" c+ L
0 h( g4 [1 j! W! F
        }
; }3 y, Y7 l. N' f5 k2 k
& h, C/ N5 _5 X0 D7 ^# L. IX509Certificate2是数字证书,和我们在https里面使用的是一样的,从里面拿出私钥后,创建钱包。
: [! B7 h8 K5 e& ]# w
6 y2 M8 L7 f5 z# |5 c5 d; ^总结4 w! ~$ {2 g% [2 R4 E

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

本版积分规则

成为第一个吐槽的人

深圳林妙可 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    33