Hi 游客

更多精彩,请登录!

比特池塘 区块链前沿 正文

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

深圳林妙可
207 0 0
区块链是基于加密算法,共识算法,p2p网络和经济激励的一个系统,加密算法在里面起到了非常关键的作用,总结一下Neo使用到的加密算法吧。
  Z6 Y6 u! S. ~# o- f2 L. m% M8 o. l& l
关于区块链中密码学的介绍,yeasy大牛的文章已经介绍的非常好,下文主要通过和Neo结合,加上一些自己的理解,去讲述一下加密算法的使用方法。- `4 \0 p- E4 u% P

: X" c/ U7 z- E7 F( O: z, FHash 算法
, ?, J6 }  R7 C/ _( E- M0 M! x3 g' r/ n" N" @- E" ]
Hash (哈希或散列)算法是信息技术领域非常基础也非常重要的技术。它能任意长度的二进制值(明文)映射为较短的固定长度的二进制值(Hash 值),并且不同的明文很难映射为相同的 Hash 值。
$ d4 H6 t1 O$ K' M6 l9 T" b+ ~7 `3 T( f1 ~
hash函数的作用
+ Y# l4 E- |! Y1 q5 z+ S. O
+ L- {  S* l/ \# Q0 R注意上一篇文章说明了如何将hash后的字符串保存到Neo的UInt256类型,其中一个前提就是结果集合在[0-15]之间。- y: _( y3 F8 n9 E( o! I- T
! W* h0 u; \3 N" T+ E* m1 L: b* Z
哈希完全不等于加密,很多时候开发人员都对用户表中的密码进行哈希后保存,实际上不叫做加密,只是相当于把密码的“特征指纹”保存下来,而对非法攻击者来说,在不知道真实的“密码”的情况下,得到有相同指纹的密码是极为困难的。
, r. {: h* y! k  j0 o# v4 O$ \" U
& e  d% {9 ?$ e3 ~8 W4 b  W一个优秀的 hash 算法,将能实现:3 P: W* H8 w2 c1 J

7 w" O( c8 W, _5 ?" j( O正向快速:给定明文和 hash 算法,在有限时间和有限资源内能计算出 hash 值。$ D. f, j+ g. S( }
- X5 W6 G6 x9 z- O7 G4 Q( W4 p- c
逆向困难:给定(若干) hash 值,在有限时间内很难(基本不可能)逆推出明文。* Q  V& O: a- j4 ?

$ E3 r5 u" {$ w" g: h: N1 ?输入敏感:原始输入信息修改一点信息,产生的 hash 值看起来应该都有很大不同。
3 V, ~) |6 c( b; c+ F3 Y9 q& q5 n( ]/ r) i3 l% B
冲突避免:很难找到两段内容不同的明文,使得它们的 hash 值一致(发生冲突)。
" n/ D5 B7 R' F# ^* V
) p4 u# R( S8 n: C5 E; b目前,一般认为 MD5 和 SHA1 已经不够安全,推荐至少使用 SHA2-256 算法。
( p  |; e$ I" X5 y( ~" M$ u3 j4 S1 m9 Y4 H2 H6 k7 X
一般的,Hash 算法都是算力敏感型,意味着计算资源是瓶颈,主频越高的 CPU 进行 Hash 的速度也越快。" t! G. j. @. P, ^9 e0 A& G4 ]

( A+ S* {8 b8 ]" ]也有一些 Hash 算法不是算力敏感的,例如 scrypt,需要大量的内存资源,节点不能通过简单的增加更多 CPU 来获得 hash 性能的提升。$ |5 R) V  c& |3 H1 Z5 w3 V

. P; y, D' g, ^( ]6 j% dNeo中的hash算法
" _8 U# W' \5 ~: u" V4 A; H' f/ W% E& C# i
scrypt
$ d/ ~, p- p1 U! _6 p4 V7 g% {( E! f- t) q! e
scrpyt算法是由著名的FreeBSD黑客 Colin Percival为他的备份服务 Tarsnap开发的,当初的设计是为了降低CPU负荷,尽量少的依赖cpu计算,利用CPU闲置时间进行计算,因此scrypt不仅计算所需时间长,而且占用的内存也多,使得并行计算多个摘要异常困难,因此利用rainbow table进行暴力攻击更加困难。scrypt没有在生产环境中大规模应用,并且缺乏仔细的审察和广泛的函数库支持。所以scrpyt一直没有推广开,但是由于其内存依赖的设计特别符合当时对抗专业矿机的设计,成为数字货币算法发展的一个主要应用方向。
9 {' Q* p! R$ z, ?8 I8 X6 h" V: K, k" ~) d+ Q* S; k
scrypt的参数
0 _- |5 w5 k+ h! d% K7 Z- H" H* S2 R/ B
. F( S9 s3 j0 Rhttps://stackoverflow.com/questi ... scrypt-work-factors4 t" z7 m/ E3 K8 M" h  u

. G2 @* f" B8 ]5 B1 {6 R; H5 S2 q2 i- {Cpercival mentioned in his slides from 2009 something around
2 m- N+ O( ?. s4 s6 ~4 W  c
7 k2 q" Z' T0 i; `. Z3 t0 S(N = 2^14, r = 8, p = 1) for. N6 W) b$ R- [' v1 G/ I# g
1 _' b9 Z" t; W0 T- T
scrypt特点
" H: e4 Z. U& h: ~, V0 f" e5 L2 a. B  ?/ ^2 x
scrpyt的出名主要是因为莱特币为了抵抗比特币矿机采用的一个算法,可以指定内存和cpu的使用量,可以用参数确定hash的时间。& `! x$ I2 u0 S  U" V. {
4 {" L. m3 c& a, R( k! I0 p$ C
Neo中如何使用scrypt
* U4 d7 @2 a3 E6 [9 K
# [+ a' ?  S: d/ Q- \* g! m& N" E// in NEP6Account: F; S  d2 L2 R' q! j( Q& |; s
, e1 f6 ^9 v% x# @) q
   public NEP6Account(NEP6Wallet wallet,
7 B. I! V3 ^0 t: n$ y$ A' J! J3 m, B: J# Z6 c: ?
              UInt160 scriptHash, KeyPair key, string password)
: @  U! j% r9 X" q8 }9 P7 t# U1 Z  ~+ O) e5 N; Q' ~
            : this(wallet,9 U! W5 v" J3 T. {

6 ~3 T9 p3 t: L7 @% S" V7 c              scriptHash,
( m/ }5 w& e8 g; ~
+ f8 i/ r( a: \- k              key.Export(password, wallet.Scrypt.N, wallet.Scrypt.R, wallet.Scrypt.P))$ p& q3 t7 a: C- A% }) p

4 S' p2 @8 w6 ~  Y        {% K. h* c* s4 g" W: K, e
& C; A! w# [# M  Z
            this.key = key;: F$ F6 e: Z" q0 J; ?3 S4 \- _

1 ?4 i4 `  F$ k! X        }1 {+ w5 y; s" H2 N# {. P# b9 J
. e# J" B% [) l6 Y. r9 J
// in class KeyPair
' U3 |7 j3 \9 h$ m% z: l& e" ^1 F1 X  w( A- k, H
public string Export(string passphrase, int N = 16384, int r = 8, int p = 8)
$ \0 U9 X7 z3 J/ s6 ?
% B& C* h+ w" v  J8 w  N{
) o- g* \9 D! ^% |" |
! p  x/ }( i' `- Z: R! U& D    using (Decrypt())4 C* c$ Q* C5 X5 C. V5 T

+ s7 {" m- {6 k  M7 O    {/ x9 ?% l6 ~3 L% e8 h( q
2 {9 B+ ~2 L( X
        UInt160 script_hash = Contract.
7 G1 ?& q0 o( V) I! ]; d
9 d/ V) R% ?, ~7 Z            CreateSignatureRedeemScript(PublicKey).ToScriptHash();
% }" b8 a# R' v& Z5 l) ^
# j- u& R" p6 u! z) Q7 [: B# m* i0 h- [        6 n! N8 E8 n% X) q9 S

8 O0 ]' m& i: N        string address = Wallet.ToAddress(script_hash);
& R0 P/ M! e" W' x" D5 V) ~" L7 G5 l  Y* T  B
        byte[] addresshash = Encoding.ASCII.GetBytes(address)8 H+ z- |3 U; V+ |' M
* B# ~1 I3 @0 y# r+ R7 n& i7 O
            .Sha256().Sha256().Take(4).ToArray();4 v6 U# r+ w  t8 z$ [3 P- d
+ H9 B1 t* _3 t8 ]1 t+ Q: }
        
7 C7 ~9 @" W7 `
& g. I0 }- B$ a, K7 X        byte[] derivedkey = SCrypt.DeriveKey(3 n, v( B; V' y0 `
! e' g* }7 |2 g4 \" K
            Encoding.UTF8.GetBytes(passphrase), addresshash, N, r, p, 64);
$ A: V  L' r  z- i2 r
9 D: u: e. `4 |- J% R1 W        9 e8 ]* x# U0 Q4 D7 U, w$ |) n; t
% X6 Y' G) y7 A2 s
        byte[] derivedhalf1 = derivedkey.Take(32).ToArray();0 J6 A3 M. I" g" V1 Q% P- y
. G( r6 q. n3 i  |* }
        byte[] derivedhalf2 = derivedkey.Skip(32).ToArray();; J2 n7 u& r+ o7 e! g! w

. U4 a" A- X5 B/ d        : E# t$ M- x9 i, b0 R3 r

$ @! Z1 b) R" g) ~! S# ~0 c        byte[] encryptedkey = XOR(PrivateKey, derivedhalf1)
7 \: ~" O* w$ T! G+ \7 g9 s9 @+ o: |; ^% b0 H# N
            .AES256Encrypt(derivedhalf2);2 M; ]8 F' ~( u' z
- W; \3 C4 Y0 c. D' Y1 c
        6 S1 Q/ f: `: |' J1 w

4 K. H1 U* E" }) d        byte[] buffer = new byte[39];4 Y6 V' ^9 x& d/ I0 M  {

3 M9 E' \6 L) e: D        buffer[0] = 0x01;9 {3 M, g8 V9 [' k2 q6 {$ G2 q# `( d
1 E) g  P/ R0 b
        buffer[1] = 0x42;5 L. [4 d3 c8 E, ]2 L, Y
  ^2 E2 @6 E6 L+ k3 Z0 w8 k9 T- c
        buffer[2] = 0xe0;4 o6 d* I5 b2 \
% E, c. `5 L5 [- K* D3 z
        Buffer.BlockCopy(addresshash, 0, buffer, 3, addresshash.Length);
8 N$ G) S* z1 ?5 P) Y
9 ^% q5 L( G3 U$ G/ }: n1 t        Buffer.BlockCopy(encryptedkey, 0, buffer, 7, encryptedkey.Length);8 _% `% y$ s, Y; C( K0 X

1 z/ ?$ h- q5 T8 }; X4 R2 O        return buffer.Base58CheckEncode();* e" }' a# s% B$ B
+ z) }2 I/ C% ~$ G! u& G
    }9 y' [. o( ^8 y2 T
0 q1 I2 L: A% a5 v& a+ S% q& k
}% ]5 Z/ x' \( f! z0 m
: S! y; J5 ?  m9 |: [
可见SCrypt.DeriveKey方法参与了加密密钥的生成过程。后面解密也必然使用到了这个hash算法。所以该hash算法参与了加密过程,而加密密钥用AES256Encrypt生成。可以确定的是,使用该算法的逆过程,可以解密出密钥来,这个比WIF要安全。
" u5 E5 j2 y" ]/ u. C& ~3 L8 a4 r! S/ A0 w7 n2 K: [
Murmur30 h4 J! x5 T9 h0 U' s# Y4 w
' r$ @  o  U7 M5 R, m  _  P
MurmurHash 是一种非加密型哈希函数,适用于一般的哈希检索操作。[1][2][3]由Austin Appleby在2008年发明,[4][5] 并出现了多个变种,[6] 都已经发布到了公有领域(public domain)。与其它流行的哈希函数相比,对于规律性较强的key,MurmurHash的随机分布特征表现更良好。[7]6 ~  T" A5 u& g0 w* w9 B
, t4 {7 \! L3 s( u  F+ H
Murmur3特点# A- ]/ f2 K/ W, f/ C/ u# p/ Q8 y+ w
; s, \* J/ N& x) w! y
1.碰撞率低
! ^. S5 M# E, U( k4 f, c1 ~6 d$ Q  m0 l; L. \2 O: e
2.计算速度快* d9 e) x* u4 A* |: ]

& \7 i5 l# o! V1 `3.擅长大文件的hash
: P5 r3 J/ ^: X* ~
7 _. K2 c. G- {+ o( `Neo中如何使用Murmur3
! U$ A6 s3 A; a3 X& W" n
1 D! J9 @# T9 G' [, q! k$ n9 Y4 \Neo中Murmur3
# L+ K( a3 [0 ^* P9 R# `0 i* i8 t* N' a$ ~& t# S- B
Murmur3的具体算法,以后再研究,现在大致知道,Neo用Murmur3生成key,也在BloomFilter中使用了。
& u/ y. X$ `/ m, a) p. r* s7 m: Y8 Y* z! m
RIPEMD-160
9 e9 z% R, H; U1 T+ H
7 ~) z: B/ ~3 Z- I- F5 z- DNeo中用这个算法来生成短一点的hash值,script hash就是用了这个算法。
3 p4 i& x) k3 H6 r' ^3 q0 p2 O( a: j1 U) S9 I
// in neo-compiler/neo/neo/Core/Helper.cs! i4 Q; ]. O) [. Q
( {$ L5 M# ~0 `$ ^
public static UInt160 ToScriptHash(this byte[] script)
  e% Z; |0 }- Q3 ~+ }  D5 V% r( a6 }- B/ p
        {
% f% y; U, J0 Z6 ~2 B0 T  r2 `0 z& D0 U/ u$ v
            return new UInt160(Crypto.Default.Hash160(script));' A/ }6 @0 z# E' P
0 ?$ W% B( |/ b* r; K. O8 g" l
        }% {% f% F: l0 t# g" b0 e0 V' Y
0 H. S: R1 _* c0 y; s
RIPEMD-160算法的特点" r2 i5 q( R# u! j) t, d
. v" m, }5 D8 \/ i% s* E' M
RIPEMD-160能表现出理想的 雪崩效应 (例如将 d 改成 c,即微小的变化就能产生一个完全不同的哈希值):
9 f9 d4 [! P) Q& B7 [: }8 |1 A& c5 I: h, b" Y7 Z: b1 Q
加密算法体系/ L$ V+ L$ |, L) t% Z3 X
; t# Q* Z2 J- V- M
现代加密算法的典型组件包括:加解密算法、加密密钥、解密密钥。其中,加解密算法自身是固定不变的,一般是公开可见的;密钥则往往每次不同,并且需要保护起来,一般来说,对同一种算法,密钥长度越长,则加密强度越大。
7 x, p! _) i% s- C  L$ r7 @2 ^
加密过程中,通过加密算法和加密密钥,对明文进行加密,获得密文。- v) d* c& X3 C9 ]8 @7 {

* x9 K8 o5 W$ n解密过程中,通过解密算法和解密密钥,对密文进行解密,获得明文。. R& B1 Z5 ]+ X6 \2 P- K0 v+ Z

1 y( |5 H% h  p1 m0 e7 A( F根据加解密的密钥是否相同,算法可以分为对称加密(symmetric cryptography,又称公共密钥加密,common-key cryptography)和非对称加密(asymmetric cryptography,又称公钥加密,public-key cryptography)。两种模式适用于不同的需求,恰好形成互补,很多时候也可以组合使用,形成混合加密机制。
, f/ q5 f! n/ p) f( i+ j- ?0 o8 _7 i; E+ P
并非所有加密算法的强度都可以从数学上进行证明。公认的高强度加密算法是在经过长时间各方面实践论证后,被大家所认可,不代表其不存在漏洞。但任何时候,自行发明加密算法都是一种不太明智的行为。
; H( v& q3 {( M: m
5 |9 _# j2 P' T对称加密
5 _9 |& f2 v3 j2 ^& C
. P& w, G; e% H  r  s顾名思义,加解密的密钥是相同的。& R, G: E/ ~) [9 V6 }
5 W( F0 ^2 L0 I0 M
对称加密优缺点
* S" z. G& |( H; {/ R+ s+ j+ s( W6 n' W  z  o
优点是加解密效率高(速度快,空间占用小),加密强度高。. s$ X' y, D! o

& D4 n0 C9 y3 V! M! {, H0 ^缺点是参与多方都需要持有密钥,一旦有人泄露则安全性被破坏;另外如何在不安全通道下分发密钥也是个问题。$ n: M- ]" b2 ^5 e
' F; P5 C. ]1 N% i# x  G4 _  m/ U
适用于大量数据的加解密;不能用于签名场景;需要提前分发密钥。( ?& m$ z& f$ h# c- T
" _3 Y' A( m/ e0 F* h0 r  t: N
对称加密实现
' h% \5 ?4 _! P/ I6 `
2 ]1 n9 [+ G0 E# Y7 _对称密码从实现原理上可以分为两种:分组密码和序列密码。前者将明文切分为定长数据块作为加密单位,应用最为广泛。后者则只对一个字节进行加密,且密码不断变化,只用在一些特定领域,如数字媒介的加密等。/ z; ^% N0 B" Q

. w5 O/ y+ |3 m4 a: _代表算法包括 DES、3DES、AES、IDEA 等。
0 C. C% }3 L. m5 H9 s- R4 \8 b& t& z6 y( T
DES(Data Encryption Standard):经典的分组加密算法,1977 年由美国联邦信息处理标准(FIPS)所采用 FIPS-46-3,将 64 位明文加密为 64 位的密文,其密钥长度为 56 位 + 8 位校验。现在已经很容易被暴力破解。' h5 d) Q- _- f" y8 W& I$ {
0 u5 V" C8 s+ J& j
3DES:三重 DES 操作:加密 –> 解密 –> 加密,处理过程和加密强度优于 DES,但现在也被认为不够安全。, W4 }; E5 b( H- R& P

  V/ S$ {( L% r$ c/ B# x& [9 ]1 `AES(Advanced Encryption Standard):美国国家标准研究所(NIST)采用取代 DES 成为对称加密实现的标准,1997~2000 年 NIST 从 15 个候选算法中评选 Rijndael 算法(由比利时密码学家 Joan Daemon 和 Vincent Rijmen 发明)作为 AES,标准为 FIPS-197。AES 也是分组算法,分组长度为 128、192、256 位三种。AES 的优势在于处理速度快,整个过程可以数学化描述,目前尚未有有效的破解手段。0 @1 Z, U( w! D

" ?2 {3 Z- v% }6 h, z注:分组加密每次只能处理固定长度的明文,因此过长的内容需要采用一定模式进行加密,《实用密码学》中推荐使用 密文分组链接(Cipher Block Chain,CBC)、计数器(Counter,CTR)模式。
' w- |/ E+ n+ v5 x* r5 ^" c+ f
Neo中的AES
$ ?) Z( K9 S: p- q: g) V9 o3 F$ B0 N4 R, k1 `! l$ h
在钱包的加解密中,使用了该算法。& }; ~6 T7 @) s2 c

' {0 N7 n7 b/ ~! x下图的代码在/neo/Wallets/Wallet.cs中,NEP是neo enhancement proposal的意思。参数nep2就是符合这个格式的一个Neo钱包文件。
5 p2 H/ i& D6 R# I; y9 D8 A- F# @# [; t8 E1 p% s
拿到私钥
, X5 U% z  p( F: Y  R
5 `3 l" l; h0 b& ?8 N具体的过程,后面再仔细研究分享出来。- D/ H0 u' @: [
# ^( H" t' A8 j& C
非对称加密
* C& J3 w3 w5 j
* z+ S, Y0 W" q非对称加密是现代密码学历史上最为伟大的发明,可以很好的解决对称加密需要的提前分发密钥问题。顾名思义,加密密钥和解密密钥是不同的,分别称为公钥和私钥。公钥一般是公开的,人人可获取的,私钥一般是个人自己持有,不能被他人获取。
( T4 X* R. D6 |: V" ]6 z2 C* }
( v/ p5 {4 a6 Z) ?5 w非对称加密优缺点
: |0 V6 u! i& R( v( v* \
# F8 w% L% x) f' d4 I9 B" ^优点是公私钥分开,不安全通道也可使用。0 T6 z) y5 E! |& x; Y/ e" ?8 W2 r9 J

/ t1 m. S3 j( Z( J$ m! A缺点是加解密速度慢,一般比对称加解密算法慢两到三个数量级;同时加密强度相比对称加密要差。
+ n6 K8 G) Y% t) F6 a  Z: c8 o( C' B$ H2 u  h+ P% A$ i% ^, \
非对称加密代表算法/ g7 r+ G+ C3 z$ ^

; z: h, M# w. }非对称加密算法的安全性往往需要基于数学问题来保障,目前主要有基于大数质因子分解、离散对数、椭圆曲线等几种思路。/ T) L1 v+ K& y& U8 H$ A
5 v) j. U% E: g$ i! k& h: b
代表算法包括:RSA、ElGamal、椭圆曲线(Elliptic Curve Crytosystems,ECC)系列算法。1 c/ p; r4 U1 H7 Z8 r

/ g+ w6 b: S" RRSA:经典的公钥算法,1978 年由 Ron Rivest、Adi Shamir、Leonard Adleman 共同提出,三人于 2002 年获得图灵奖。算法利用了对大数进行质因子分解困难的特性,但目前还没有数学证明两者难度等价,或许存在未知算法在不进行大数分解的前提下解密。
' E$ G; p/ k: o7 Q8 ]
! ~* Y4 D; w" Q& SDiffie-Hellman 密钥交换:基于离散对数无法快速求解,可以在不安全的通道上,双方协商一个公共密钥。, K' w4 b2 k. o! @3 ?' L

' c, S) L6 a: {0 ~: w& p' SElGamal:由 Taher ElGamal 设计,利用了模运算下求离散对数困难的特性。被应用在 PGP 等安全工具中。
2 q, f' K# i8 o8 g6 d; X3 x
' M( V4 J) R8 F4 {# [3 E9 g0 F' j& ]椭圆曲线算法(Elliptic curve cryptography,ECC):现代备受关注的算法系列,基于对椭圆曲线上特定点进行特殊乘法逆运算难以计算的特性。最早在 1985 年由 Neal Koblitz 和 Victor Miller 分别独立提出。ECC 系列算法一般被认为具备较高的安全性,但加解密计算过程往往比较费时。一般适用于签名场景或密钥协商,不适于大量数据的加解密。7 l6 {& X# q) u* N  i! P' U8 d5 E
3 C& P  i1 x3 C3 ?* e
RSA 算法等已被认为不够安全,一般推荐采用椭圆曲线系列算法。8 r1 Z# T% X, d0 f0 \% T& G% v

" X; k8 L6 e8 [3 k2 X: sNeo中的数字签名算法
* l# c  m' y( s4 l
0 w& _6 q' K8 n8 M' ]$ q在Neo中,也使用了非对称加密算法,我们通过代码来看看是如何使用的。
7 N9 X: E$ _( \0 F  U2 B) Y+ v1 y6 ~/ b
public virtual WalletAccount Import(X509Certificate2 cert)
0 R2 @2 f+ [) H- W1 n  u! Y+ A! p2 v! F# n0 K& y# s
        {
( M2 B2 d' J4 Z# O7 D+ _
% V+ |8 M' T( O5 O" c            byte[] privateKey;
5 A+ M% Y' I/ c% A6 l3 @5 @5 ]) h: p( y) n; C
            using (ECDsa ecdsa = cert.GetECDsaPrivateKey())
  q% ^/ X7 d( D/ {$ B7 ?
& m) j8 H- d3 ?$ l            {
& M9 O3 H* s& [' p; K' A5 Y6 e8 P3 q' L  m$ i2 _
                privateKey = ecdsa.ExportParameters(true).D;* x: i. f0 |/ [

/ z- Y7 @7 U5 w& B# Z% o            }
, Q( d# g* D0 K& X: L, X! s, m2 ^# D: O3 x
( ]# o$ L$ C: A; ]4 h. C            WalletAccount account = CreateAccount(privateKey);
6 |! {+ V# }# o; r  K; U2 M! f: H
6 P2 ~# M" V5 F0 q5 S9 ]6 e            Array.Clear(privateKey, 0, privateKey.Length);  T9 Z0 m3 S' R( N" _3 |
0 h/ U6 u0 p' F* r6 }; ]- r; V- E7 p8 l5 i
            return account;
: ~8 T* r2 L7 u+ k0 Z0 t( I5 K5 ^8 u
        }( D0 I" E0 L/ H; [) P& K

: J- U: [7 Z2 l# b3 U/ NX509Certificate2是数字证书,和我们在https里面使用的是一样的,从里面拿出私钥后,创建钱包。
. G) o7 t6 M: H& Y* _
% ^- t/ H: x, v. r2 O1 u# B0 h: o8 G+ S总结
& J" K# ~* r+ Y3 ~& p& S1 G" T+ `: Z
8 u  W) N# w* k0 ?6 U/ |0 B目前只是简单的介绍了一下Neo中加密算法的使用情况,这些加密算法的原理和实现也是很有意思的,后面看看怎么实现的,再分享出来。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

深圳林妙可 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    33