Hi 游客

更多精彩,请登录!

比特池塘 区块链前沿 正文

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

深圳林妙可
202 0 0
区块链是基于加密算法,共识算法,p2p网络和经济激励的一个系统,加密算法在里面起到了非常关键的作用,总结一下Neo使用到的加密算法吧。* C- m. Z' c$ e1 H2 x
* N2 R/ J8 f4 D+ ~5 X( z+ ~
关于区块链中密码学的介绍,yeasy大牛的文章已经介绍的非常好,下文主要通过和Neo结合,加上一些自己的理解,去讲述一下加密算法的使用方法。
! S# p  A! n' @' `/ u& Y3 h! G
Hash 算法
9 @& }/ T' L2 M! t% V6 Y
2 F/ Q3 j. \  XHash (哈希或散列)算法是信息技术领域非常基础也非常重要的技术。它能任意长度的二进制值(明文)映射为较短的固定长度的二进制值(Hash 值),并且不同的明文很难映射为相同的 Hash 值。6 S( f3 ~) s* d4 c) }; I

, X9 O2 c) M  e' [: Zhash函数的作用* I1 j5 w( V! Z* d8 g

$ g9 i7 x9 R: E5 z注意上一篇文章说明了如何将hash后的字符串保存到Neo的UInt256类型,其中一个前提就是结果集合在[0-15]之间。# I, B) {, Y  z8 K+ I* Z1 ^

% ]& x% B$ M" s& ]# F" ?, [哈希完全不等于加密,很多时候开发人员都对用户表中的密码进行哈希后保存,实际上不叫做加密,只是相当于把密码的“特征指纹”保存下来,而对非法攻击者来说,在不知道真实的“密码”的情况下,得到有相同指纹的密码是极为困难的。6 f- o. G! t( n3 _% c# M: u
, K; t3 p9 ~/ Z; i8 \/ q
一个优秀的 hash 算法,将能实现:
! @  p& _% `$ t0 x) a6 o7 B* l; v3 |$ i% j. [
正向快速:给定明文和 hash 算法,在有限时间和有限资源内能计算出 hash 值。
3 {& w; g- t9 S/ Q) l# S* L
3 @, J+ i7 Q: v2 ]* N- _' |7 ~逆向困难:给定(若干) hash 值,在有限时间内很难(基本不可能)逆推出明文。
8 }! B! _7 v! A: e3 Y7 M6 g! x. Y: d% D$ |
输入敏感:原始输入信息修改一点信息,产生的 hash 值看起来应该都有很大不同。
/ B2 s3 Q: J/ I+ E$ F5 J2 M2 H
8 ^, {2 ]3 F- o, W8 r冲突避免:很难找到两段内容不同的明文,使得它们的 hash 值一致(发生冲突)。
7 s4 {4 m* E2 M% p" i
1 M& X9 a# v* H+ w+ d目前,一般认为 MD5 和 SHA1 已经不够安全,推荐至少使用 SHA2-256 算法。, P; k" u' p& ^# Y4 I3 y8 `

& a! T' V# A9 G8 Q* ~一般的,Hash 算法都是算力敏感型,意味着计算资源是瓶颈,主频越高的 CPU 进行 Hash 的速度也越快。
( }/ i4 w2 H5 ?2 t/ N' t
# N9 l& o6 U4 ]* g4 V, M) _也有一些 Hash 算法不是算力敏感的,例如 scrypt,需要大量的内存资源,节点不能通过简单的增加更多 CPU 来获得 hash 性能的提升。. G7 y, _9 S! @3 L! `3 H3 ]7 {

7 C" p9 h$ p9 b0 m6 n$ S3 FNeo中的hash算法
* S8 _4 Q& A, M) X( a: I, H5 _' E) E) @2 j
scrypt
& i" H2 M, ^. U: z) S- d$ A8 `& U
& @' Y2 \: @4 c" m. e( q  m" Kscrpyt算法是由著名的FreeBSD黑客 Colin Percival为他的备份服务 Tarsnap开发的,当初的设计是为了降低CPU负荷,尽量少的依赖cpu计算,利用CPU闲置时间进行计算,因此scrypt不仅计算所需时间长,而且占用的内存也多,使得并行计算多个摘要异常困难,因此利用rainbow table进行暴力攻击更加困难。scrypt没有在生产环境中大规模应用,并且缺乏仔细的审察和广泛的函数库支持。所以scrpyt一直没有推广开,但是由于其内存依赖的设计特别符合当时对抗专业矿机的设计,成为数字货币算法发展的一个主要应用方向。
" G" I( U) v* |9 v+ Q+ O: r
' O7 |" C2 R6 p+ c8 h9 mscrypt的参数) }5 p3 Q, l9 W9 J& }
) j8 N4 W- r" z( f2 ~( V9 a
https://stackoverflow.com/questi ... scrypt-work-factors
! E0 H+ k$ o  Y$ X2 F1 c; F1 @
2 e2 \0 I, u9 E0 T7 r% r' d! v4 i- |Cpercival mentioned in his slides from 2009 something around, D5 @7 G1 E2 x  s- g
) O* ]) r% W$ p. Q: m
(N = 2^14, r = 8, p = 1) for7 }- S( R! I3 Q3 x/ L) I% k

3 X2 n& Y- ~/ K4 `, x9 Yscrypt特点
: o- Z6 q3 J; w  a& N
  r8 d6 Q" m; e, k$ w# @scrpyt的出名主要是因为莱特币为了抵抗比特币矿机采用的一个算法,可以指定内存和cpu的使用量,可以用参数确定hash的时间。0 e2 o8 X6 _/ c. j& q
: a5 F1 @7 L; @- r
Neo中如何使用scrypt7 F4 A6 M1 c$ U8 o; O
. P( A5 _$ f, b4 H
// in NEP6Account
; r/ y8 ]) _# U6 L% P) v
8 Z  q. T2 u: j$ ?* n0 _$ H   public NEP6Account(NEP6Wallet wallet,+ U' N5 z0 T' O8 g- k0 [

. L7 N% V* l/ C0 a# t7 v              UInt160 scriptHash, KeyPair key, string password)) K4 U6 g( D; U3 X, h- v- c3 S; [# y

# H8 @/ T+ U; g0 _  e" P3 P            : this(wallet,
' M3 o! E& R+ E# Q. A, F+ T  e+ z! v% V& N, J; x
              scriptHash,
& ~, G1 R5 r2 j4 u5 V+ I7 w; q% j" y" f8 u  o: R) [' @4 b
              key.Export(password, wallet.Scrypt.N, wallet.Scrypt.R, wallet.Scrypt.P))  s6 F, {; B: X  |

& c2 z8 g5 W4 t( G+ ~        {" E+ [4 |  u+ y2 A) I$ S8 `7 H% C

% q  N/ p9 A. L. i/ e            this.key = key;8 @2 |0 e$ ^9 o& Y: B

: Y4 T" L3 C8 U: X        }! b% h; {, @/ v0 y- B# k: \! Y

4 t5 }& u. G! {  y, s: T* I2 P# y// in class KeyPair
1 X( }) j( Y) B5 \% R7 ?$ ~4 T. W3 y
public string Export(string passphrase, int N = 16384, int r = 8, int p = 8)
2 b5 h& a2 S5 j& ~2 f9 A9 k, b1 t2 D$ S2 n8 O1 A# V. e
{
8 f$ B4 O. H, ]! [; {, ?7 v5 q2 s2 w. i0 ^" F5 T
    using (Decrypt())
+ f7 K0 i  W* E* Q
9 u# b- k% {9 f    {
) b, |4 z! E& E' P: o
0 K* r: g* Y+ j! s, b. M7 `- P0 ^1 ?$ u        UInt160 script_hash = Contract.
% j% h, |7 Z, _- |6 a# E2 J9 ^5 u, Y2 l3 I  y2 r
            CreateSignatureRedeemScript(PublicKey).ToScriptHash();
" b& \5 d5 I6 _7 s0 a
/ N8 x5 ]) Y6 W3 V  ~        " R4 n; ]  ~8 h5 |, r3 Q2 |
+ a; c5 x, s# @
        string address = Wallet.ToAddress(script_hash);
. U6 e- Y- S: p7 }# G8 k  j
$ t3 [& `4 a# {3 C* |% Z& J! o3 Y        byte[] addresshash = Encoding.ASCII.GetBytes(address)- ^' c3 v. M5 d: o- [. }! a
& K+ x+ M4 B. G5 q0 W
            .Sha256().Sha256().Take(4).ToArray();# }  _/ y; e* }6 M2 V# D$ E  `
# o2 V- \' U) ~- Q
        : l5 D, G1 s) o# r& h  j- V$ [
6 F$ L+ P: ~0 w/ K" f) P
        byte[] derivedkey = SCrypt.DeriveKey(* p9 i# M8 |! [) |& l# c# {
9 `' `& z* F; c5 c1 D) i
            Encoding.UTF8.GetBytes(passphrase), addresshash, N, r, p, 64);  |3 K  M) _3 v

5 |+ u/ Y3 V+ r: I! u( x- Z        
1 O( B8 t3 s  m, I8 N9 i, L9 f6 k  e$ F9 o9 y
        byte[] derivedhalf1 = derivedkey.Take(32).ToArray();
- B4 X" Y7 L7 N: A: x' _& R
: [8 F0 G# L) i8 ^% {+ Q; G        byte[] derivedhalf2 = derivedkey.Skip(32).ToArray();) P+ b0 `8 a1 r% k

8 B. A+ E- l# f9 h        & b. p/ I- i; o( H, `4 U  [8 [
" q# z2 b$ _$ S, z! s" c
        byte[] encryptedkey = XOR(PrivateKey, derivedhalf1)
9 t7 G, v! [, ?& _1 f- `7 t* _: Y3 T0 \; W1 j+ [: E$ }+ ^
            .AES256Encrypt(derivedhalf2);
0 E7 H6 c. l' f9 a  W6 f
& Q3 R3 Z" ]" K4 L' x. s! |4 g5 r: s        
- O0 [4 L, }% k7 u* H; K' Z+ l& T1 M) w/ o0 _3 N( T
        byte[] buffer = new byte[39];
) d" s) J' x# Y3 |  I6 f7 P0 n, f. t1 H; B1 d. S  U
        buffer[0] = 0x01;
; d3 g9 g3 h$ _8 _- Q0 c. Y5 G6 |+ v8 q$ j! ^) ?- o5 T
        buffer[1] = 0x42;
& @6 \; B% I3 J5 M5 g7 w5 B4 I, S9 Q; w# g' j" z
        buffer[2] = 0xe0;" Z3 q2 Z  j4 j* c, J) ]% z

3 T6 ?( G5 L2 J2 h& M2 _/ a5 L8 E        Buffer.BlockCopy(addresshash, 0, buffer, 3, addresshash.Length);2 V) C( I7 u# B
; g# ?8 B; _- p* K7 z( l$ h4 M
        Buffer.BlockCopy(encryptedkey, 0, buffer, 7, encryptedkey.Length);8 f. i) Y/ m5 X& n
0 e3 J$ k9 S- O' T  D% j& }
        return buffer.Base58CheckEncode();6 z, k/ V( b+ ^
6 v/ r7 ^2 c! Y9 l
    }
& I0 o& v  x/ T1 \
+ c+ L& j6 x3 E}" X# e1 z5 [; D! P' I1 K* J

" K3 `  \8 j6 m1 I. W# c可见SCrypt.DeriveKey方法参与了加密密钥的生成过程。后面解密也必然使用到了这个hash算法。所以该hash算法参与了加密过程,而加密密钥用AES256Encrypt生成。可以确定的是,使用该算法的逆过程,可以解密出密钥来,这个比WIF要安全。' q# K& N! Z! U: r0 m' Z

! m0 Y7 }, ^  W; HMurmur3
& w5 T) {. w7 V) s3 I% ^- o9 C( ^3 w. r2 B( b9 q0 J/ r
MurmurHash 是一种非加密型哈希函数,适用于一般的哈希检索操作。[1][2][3]由Austin Appleby在2008年发明,[4][5] 并出现了多个变种,[6] 都已经发布到了公有领域(public domain)。与其它流行的哈希函数相比,对于规律性较强的key,MurmurHash的随机分布特征表现更良好。[7]
3 z5 |) V6 o: o+ T* b  L% O' P
' s5 `, [' C) i0 |( kMurmur3特点1 f8 j, ]7 l" L: M2 j3 f6 V
% u+ a7 c* B& O* a* k
1.碰撞率低8 {- b8 B$ A! L' Y

( q. s7 U0 ^  |+ v  {! r) s& u2.计算速度快
3 g2 K2 G+ d9 s8 o3 \' f# l  X: O: h, Z0 \
3.擅长大文件的hash! L2 R# c! \7 I; s
! }9 J) M. j8 d% p& r& J
Neo中如何使用Murmur3+ m# j: k) \- z) g5 X
7 f+ H; y9 z# @; c5 }8 e3 s/ u0 J
Neo中Murmur3
/ T- I, I$ _: K" w3 ]0 u/ a" V6 Z* P- {8 j9 y
Murmur3的具体算法,以后再研究,现在大致知道,Neo用Murmur3生成key,也在BloomFilter中使用了。+ O' G) K8 f8 T! Z  A
, c# M% u( f9 t7 Z2 Q$ k
RIPEMD-160
: Y% Z, H+ E, q, t1 S# ?; T" b6 c2 w" @9 j5 V# p
Neo中用这个算法来生成短一点的hash值,script hash就是用了这个算法。- r; m. G* _5 h" [5 Y& W
2 H" b, O( ^2 L4 M
// in neo-compiler/neo/neo/Core/Helper.cs
0 q, i! A4 i6 r- `
6 P+ {+ Z5 V$ S6 d" w. c* zpublic static UInt160 ToScriptHash(this byte[] script)
, ^7 Y' ~6 A2 H% \8 C
" `" P& a" U8 a        {
2 K0 u7 [% U. r% \1 T# |4 v3 G$ W$ M! I* \( r
            return new UInt160(Crypto.Default.Hash160(script));
3 C1 U' J+ a, b8 U$ B. J- |2 Y$ a
* B# k, |  `' ^5 E8 P/ i# ^        }( O4 O, Z! Y6 G# X
; W& L5 V4 x" L# ~/ N
RIPEMD-160算法的特点; i; G3 e1 ?4 r  [
5 G+ z& B# |9 c5 H- {; B
RIPEMD-160能表现出理想的 雪崩效应 (例如将 d 改成 c,即微小的变化就能产生一个完全不同的哈希值):
( Q/ o! v! g4 _5 L" `- O" ^! _/ J7 k' h2 U
加密算法体系
# t/ Y0 z$ K; `4 ^2 O
& A. ^, Y; W6 C2 l现代加密算法的典型组件包括:加解密算法、加密密钥、解密密钥。其中,加解密算法自身是固定不变的,一般是公开可见的;密钥则往往每次不同,并且需要保护起来,一般来说,对同一种算法,密钥长度越长,则加密强度越大。
2 Y  k) H) k$ D9 c$ G
7 L2 ~, R8 N) T: V% F加密过程中,通过加密算法和加密密钥,对明文进行加密,获得密文。/ K5 P2 Z( R1 {7 ~$ ]
) V( @* M6 z. D1 {9 t
解密过程中,通过解密算法和解密密钥,对密文进行解密,获得明文。8 C2 s- _& o/ R& W# N3 T$ m9 h3 N
! s) S* A+ R6 E+ x- p* k6 e
根据加解密的密钥是否相同,算法可以分为对称加密(symmetric cryptography,又称公共密钥加密,common-key cryptography)和非对称加密(asymmetric cryptography,又称公钥加密,public-key cryptography)。两种模式适用于不同的需求,恰好形成互补,很多时候也可以组合使用,形成混合加密机制。
) \# ?2 \1 H9 B/ X' Y" L$ {3 q7 `- |$ m( X4 |7 ]/ F
并非所有加密算法的强度都可以从数学上进行证明。公认的高强度加密算法是在经过长时间各方面实践论证后,被大家所认可,不代表其不存在漏洞。但任何时候,自行发明加密算法都是一种不太明智的行为。  V# r  P# D. Q
' {8 p' u$ Y' F5 u8 C3 }0 @* V
对称加密" ]4 \# Y% R7 U& W3 P

- W3 z" U) N5 X" m9 p顾名思义,加解密的密钥是相同的。
  {' k3 n0 J0 t* Z$ ^( s& q0 J% ]7 p; O  J9 _
对称加密优缺点# L3 j+ T0 b" U7 ~

7 j0 n4 W( G; D/ _优点是加解密效率高(速度快,空间占用小),加密强度高。
$ X- V4 n2 G% J/ p$ F/ D
8 \2 e- L& c5 B# Z& [( A缺点是参与多方都需要持有密钥,一旦有人泄露则安全性被破坏;另外如何在不安全通道下分发密钥也是个问题。
% K# s! @7 |# m! q# e/ Q; |4 s6 |2 b& X  S2 H3 \
适用于大量数据的加解密;不能用于签名场景;需要提前分发密钥。
+ P0 [! ^) K6 E  S1 y- I" E5 Y2 W+ O3 l' Y  d: f( o
对称加密实现5 t2 O4 ]0 }* G- F$ T$ O

5 x' Z* h2 K8 ~对称密码从实现原理上可以分为两种:分组密码和序列密码。前者将明文切分为定长数据块作为加密单位,应用最为广泛。后者则只对一个字节进行加密,且密码不断变化,只用在一些特定领域,如数字媒介的加密等。+ `. _+ `7 K4 @& ~* H' C/ l7 R+ s8 u- W
. W5 v7 i4 o) C3 k3 w# M
代表算法包括 DES、3DES、AES、IDEA 等。
: o$ ?; T$ V) i: |! f/ e4 G4 M
8 k* A& t4 f9 hDES(Data Encryption Standard):经典的分组加密算法,1977 年由美国联邦信息处理标准(FIPS)所采用 FIPS-46-3,将 64 位明文加密为 64 位的密文,其密钥长度为 56 位 + 8 位校验。现在已经很容易被暴力破解。
# d6 ^) G1 u5 n" j- t0 a1 J. |; O# ^4 F( {" j
3DES:三重 DES 操作:加密 –> 解密 –> 加密,处理过程和加密强度优于 DES,但现在也被认为不够安全。
4 L& ?. Z7 b+ ]4 d5 @
( `; N# z, D9 s: s- ]( u3 S4 PAES(Advanced Encryption Standard):美国国家标准研究所(NIST)采用取代 DES 成为对称加密实现的标准,1997~2000 年 NIST 从 15 个候选算法中评选 Rijndael 算法(由比利时密码学家 Joan Daemon 和 Vincent Rijmen 发明)作为 AES,标准为 FIPS-197。AES 也是分组算法,分组长度为 128、192、256 位三种。AES 的优势在于处理速度快,整个过程可以数学化描述,目前尚未有有效的破解手段。
# g# }; N0 O/ j1 L1 t, Z" j; N! e8 w5 m" b% O) i) k0 Z$ ^5 N
注:分组加密每次只能处理固定长度的明文,因此过长的内容需要采用一定模式进行加密,《实用密码学》中推荐使用 密文分组链接(Cipher Block Chain,CBC)、计数器(Counter,CTR)模式。1 J3 T9 C# L+ g" q
3 S6 \8 p1 t. j9 g+ E" }- M5 |
Neo中的AES
1 g4 U. i2 ]- P' c! h6 b$ l5 }5 w+ p5 l7 m& M+ A2 _
在钱包的加解密中,使用了该算法。
! b4 n3 I- X$ t/ x- W6 a/ K$ r; R1 C
下图的代码在/neo/Wallets/Wallet.cs中,NEP是neo enhancement proposal的意思。参数nep2就是符合这个格式的一个Neo钱包文件。* L  _4 ]* d6 z' H- }/ X
: I3 }) u3 ]; e
拿到私钥7 L3 o  p7 k& E$ F- }# M% Y8 j) G

) h  V; [* y/ {+ o具体的过程,后面再仔细研究分享出来。
# S/ C( t. ~4 V  b7 e' @' B# v3 p) H1 E4 `; z, |8 Q. A8 |
非对称加密
0 A# I. z* y4 P  P3 L
7 l0 g( M3 |- K( z" k; |非对称加密是现代密码学历史上最为伟大的发明,可以很好的解决对称加密需要的提前分发密钥问题。顾名思义,加密密钥和解密密钥是不同的,分别称为公钥和私钥。公钥一般是公开的,人人可获取的,私钥一般是个人自己持有,不能被他人获取。$ n( }5 A1 g8 q, s

' o; o; y  [: A非对称加密优缺点" S- O: E9 R/ ~
9 L0 v; z/ I" H
优点是公私钥分开,不安全通道也可使用。
. ]; S; D8 E1 s; W6 J1 |7 X7 m% Q. h" y' Y. n* c1 n& D( q# E! S
缺点是加解密速度慢,一般比对称加解密算法慢两到三个数量级;同时加密强度相比对称加密要差。( e# `. `: d- T! G

7 y# W' x  H4 X# A$ Y3 [4 l* S  q非对称加密代表算法
8 t) m% x5 h" Y: z  S$ h" s* B: e3 b4 y0 ~) T$ r- t5 h
非对称加密算法的安全性往往需要基于数学问题来保障,目前主要有基于大数质因子分解、离散对数、椭圆曲线等几种思路。
$ Q9 j0 N: u! p" K2 S; g; f5 x* a3 F0 x( c
代表算法包括:RSA、ElGamal、椭圆曲线(Elliptic Curve Crytosystems,ECC)系列算法。
) h! w0 z% ~' R4 e8 _* z( Z8 r+ D3 h5 A1 E
RSA:经典的公钥算法,1978 年由 Ron Rivest、Adi Shamir、Leonard Adleman 共同提出,三人于 2002 年获得图灵奖。算法利用了对大数进行质因子分解困难的特性,但目前还没有数学证明两者难度等价,或许存在未知算法在不进行大数分解的前提下解密。
  L) B4 p8 n5 V* [' e
$ B" {" H1 p1 L! ~Diffie-Hellman 密钥交换:基于离散对数无法快速求解,可以在不安全的通道上,双方协商一个公共密钥。0 W. F7 s8 _& B( L: H
4 A2 C6 r0 j( Z- I* x8 Z  P2 X
ElGamal:由 Taher ElGamal 设计,利用了模运算下求离散对数困难的特性。被应用在 PGP 等安全工具中。
% @0 j* q& a5 @7 n& O) k
7 w# A- k1 J3 H3 d椭圆曲线算法(Elliptic curve cryptography,ECC):现代备受关注的算法系列,基于对椭圆曲线上特定点进行特殊乘法逆运算难以计算的特性。最早在 1985 年由 Neal Koblitz 和 Victor Miller 分别独立提出。ECC 系列算法一般被认为具备较高的安全性,但加解密计算过程往往比较费时。一般适用于签名场景或密钥协商,不适于大量数据的加解密。
9 v3 S0 k! t7 {, W, [" ?" {4 n( l- j" @( |5 b( F0 j6 Q, ?
RSA 算法等已被认为不够安全,一般推荐采用椭圆曲线系列算法。( L$ B3 J) |$ K, `& ?
2 A& ^5 C4 N2 U- o" p$ T1 n$ o
Neo中的数字签名算法. R! {1 N& l. g; ~3 d

: M& U' {8 l: O+ Q3 s( Y- D4 _在Neo中,也使用了非对称加密算法,我们通过代码来看看是如何使用的。5 k2 d  z1 S6 |( J$ @2 y5 y

4 l; k% p! K% R2 C0 lpublic virtual WalletAccount Import(X509Certificate2 cert)9 V+ X4 I. m- c- f- Y# K
+ e& @3 v# d- C- d3 t3 |% I
        {
3 O8 a+ V' R9 g6 e1 I
& B2 m. {5 j% D5 G; l            byte[] privateKey;" w* m7 t9 s' J7 Q* L, I6 e

- l, {) D9 G( a" X3 M6 ^& B7 ^            using (ECDsa ecdsa = cert.GetECDsaPrivateKey())/ m) s( T  X+ Z. I) S$ d6 d1 ^

9 F' o7 g2 X8 k( c2 m# {            {' W; Z. o; f' l3 U( s! V( |

1 e6 F% f( u0 ^6 p/ a                privateKey = ecdsa.ExportParameters(true).D;3 B# T; A: R" A: T- @

# m: D8 @6 M7 O" d            }
: U# P7 J7 h" ]% @5 q
, V8 b) @3 K* S5 H            WalletAccount account = CreateAccount(privateKey);
5 y- i: S5 |0 }, z. S3 I2 O6 R
& q3 {; P. A  T. O, k3 R            Array.Clear(privateKey, 0, privateKey.Length);
/ x* r* S5 M- ?- c1 Z% Z# E" o& S9 E' x! I: ]# L/ F0 w
            return account;. I" e* z* T1 O4 Z4 O0 p4 y
( k( T9 P/ J. `0 X8 \
        }: J, b+ T, N9 e( J, ^% p- c  V6 r2 |7 Y" t
( S8 ~$ i2 f& u+ `. M3 l
X509Certificate2是数字证书,和我们在https里面使用的是一样的,从里面拿出私钥后,创建钱包。' b$ h: V4 e  _1 p  V  O* f+ t) U
( q8 l  ?- k$ S- g$ n4 o  r) {
总结
* c7 ~) k3 F/ u& ~& R
4 ~0 {1 j5 _3 m; i目前只是简单的介绍了一下Neo中加密算法的使用情况,这些加密算法的原理和实现也是很有意思的,后面看看怎么实现的,再分享出来。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

深圳林妙可 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    33