Hi 游客

更多精彩,请登录!

比特池塘 区块链前沿 正文

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

深圳林妙可
199 0 0
区块链是基于加密算法,共识算法,p2p网络和经济激励的一个系统,加密算法在里面起到了非常关键的作用,总结一下Neo使用到的加密算法吧。
- z  k) l. A9 Q4 D; Z3 ^5 R+ {
% l( z& g3 T7 a关于区块链中密码学的介绍,yeasy大牛的文章已经介绍的非常好,下文主要通过和Neo结合,加上一些自己的理解,去讲述一下加密算法的使用方法。: g2 Y2 W; i6 k1 J

( g% x( H* Z* C, P7 PHash 算法
# L( ~! U+ s4 Q' \8 T* N* P0 m* y: x( m
Hash (哈希或散列)算法是信息技术领域非常基础也非常重要的技术。它能任意长度的二进制值(明文)映射为较短的固定长度的二进制值(Hash 值),并且不同的明文很难映射为相同的 Hash 值。
& E/ z5 a5 {% ?3 G6 V! m, g' b: S6 A" U& E1 H- S* R6 C
hash函数的作用
% @. W9 \, f! u% A! [3 Y
3 \$ Y2 u0 u, P8 V2 W注意上一篇文章说明了如何将hash后的字符串保存到Neo的UInt256类型,其中一个前提就是结果集合在[0-15]之间。
' Y& f# q# z" X: s+ J$ z7 P1 y4 `. O# ?% i3 k! P8 Y# i$ f# z
哈希完全不等于加密,很多时候开发人员都对用户表中的密码进行哈希后保存,实际上不叫做加密,只是相当于把密码的“特征指纹”保存下来,而对非法攻击者来说,在不知道真实的“密码”的情况下,得到有相同指纹的密码是极为困难的。# j8 @# u* \8 T* m
4 q: M3 T  N$ F: O" r' [# {8 o
一个优秀的 hash 算法,将能实现:9 I# R$ v# ^% Q3 K1 |! F
$ X& q# Z$ d5 S
正向快速:给定明文和 hash 算法,在有限时间和有限资源内能计算出 hash 值。( t4 m) G, N$ E1 P4 X% w' {7 m9 d
! \, B1 b7 W/ W9 {) }5 K+ }$ L
逆向困难:给定(若干) hash 值,在有限时间内很难(基本不可能)逆推出明文。
8 n: l. k( ?( x- Y
  e8 h: j5 l( q5 T) j3 Q" l! n输入敏感:原始输入信息修改一点信息,产生的 hash 值看起来应该都有很大不同。
) ^% q7 m3 C- @% [8 x8 I+ m
+ t- g/ z( @7 s/ P冲突避免:很难找到两段内容不同的明文,使得它们的 hash 值一致(发生冲突)。
% D: \3 T$ I# \* I. r' \4 z
7 I' b$ R/ \' b# i, Y& T目前,一般认为 MD5 和 SHA1 已经不够安全,推荐至少使用 SHA2-256 算法。
9 }* o' B5 p6 |( ~2 r5 a; y
8 s$ P* m! {6 F; \一般的,Hash 算法都是算力敏感型,意味着计算资源是瓶颈,主频越高的 CPU 进行 Hash 的速度也越快。- B  F( ?+ M" @
* ^+ x/ H( @: E& v4 l  R- m
也有一些 Hash 算法不是算力敏感的,例如 scrypt,需要大量的内存资源,节点不能通过简单的增加更多 CPU 来获得 hash 性能的提升。& E6 R4 I# M5 q, J  _

5 X( {5 P7 d- S# v  L* j! PNeo中的hash算法
8 N. b4 {( Q! M& B; S3 A: b( q# n+ R" \# U' W+ X5 B4 {: _
scrypt/ p* H6 F. _9 Q5 q$ E  |
  m. B' O0 {+ b/ |# Q
scrpyt算法是由著名的FreeBSD黑客 Colin Percival为他的备份服务 Tarsnap开发的,当初的设计是为了降低CPU负荷,尽量少的依赖cpu计算,利用CPU闲置时间进行计算,因此scrypt不仅计算所需时间长,而且占用的内存也多,使得并行计算多个摘要异常困难,因此利用rainbow table进行暴力攻击更加困难。scrypt没有在生产环境中大规模应用,并且缺乏仔细的审察和广泛的函数库支持。所以scrpyt一直没有推广开,但是由于其内存依赖的设计特别符合当时对抗专业矿机的设计,成为数字货币算法发展的一个主要应用方向。
/ P6 M+ F/ M; {& F8 F
% ]7 \- |# j0 p  I0 kscrypt的参数" ]" C3 S) O7 o; ~7 L  @' U

: i$ n* \5 M7 _2 `/ T. chttps://stackoverflow.com/questi ... scrypt-work-factors) b: h! N" z3 l2 R% V
8 K0 e+ A; a- P* G5 x+ m  n9 M# y. b
Cpercival mentioned in his slides from 2009 something around
9 ?# c3 v( [1 k( j0 k: E( r8 H- h3 {  k. ^4 a+ T8 \
(N = 2^14, r = 8, p = 1) for* E' w- D, a& x- Q. I: @" P5 T

8 t. S1 M9 |0 _8 X( u; p+ [scrypt特点6 x- V5 N) M$ o* T5 q: I6 R

! f+ N4 H" T2 j4 C8 |scrpyt的出名主要是因为莱特币为了抵抗比特币矿机采用的一个算法,可以指定内存和cpu的使用量,可以用参数确定hash的时间。8 ?/ d8 q: ~0 Y

1 F* b$ s# }8 z" I3 PNeo中如何使用scrypt- w" ^  K) U) Y$ J9 ^3 Q

' s& i( T: E# I! L0 l" |- Q// in NEP6Account
  P1 C2 j5 k8 s1 J3 ?3 N% X- _/ p( D3 F1 k+ u# k
   public NEP6Account(NEP6Wallet wallet,2 z* v; r4 p& ^% y3 }& s

! c6 c, a! k+ x              UInt160 scriptHash, KeyPair key, string password)' ~% L9 T- P1 n  k. K
. F3 C* |- o8 Y% s4 M. V
            : this(wallet,9 M+ _* ]0 f  v5 M" {

! Q/ P) j/ H) k# l$ w              scriptHash,; W2 k! u) Z( Y9 S6 {9 U

- t3 o/ m$ g$ Z) D$ }: d7 x# H( l- ]              key.Export(password, wallet.Scrypt.N, wallet.Scrypt.R, wallet.Scrypt.P))
+ o5 \! e! m6 U6 T
8 D# Z3 Z" \( j/ M/ Q3 `        {
0 F" Y; D8 h+ D2 f$ n
/ I1 B# A0 I7 b: f6 h0 ?            this.key = key;. k; |/ g, `: `) p9 f
0 _0 `8 v/ x( p4 ~1 l
        }
8 ?; z- B! z- ^" P  n" k, t6 l6 }3 X& I
// in class KeyPair
0 V- C; M" I5 t; d! d' _: {; \+ e* E$ p, y( X# w4 F
public string Export(string passphrase, int N = 16384, int r = 8, int p = 8)
0 r2 K# o& f9 r7 Y, x8 f$ w$ G5 H. q2 i
{, z4 s: I# I! U7 \* T8 ]- B

$ F  a0 E! a; }    using (Decrypt())6 D0 D5 \+ H' b1 F
+ W9 m6 P5 F- w* Y& R
    {/ O1 J" }& Y9 p1 o7 _* ]5 n

: Z5 P5 D* c! J' |3 Z3 A: o. \        UInt160 script_hash = Contract.( c% }4 c) y. k- h" w: d* [

' N4 b# a* [' a( f            CreateSignatureRedeemScript(PublicKey).ToScriptHash();
& H, X% U3 f$ S. _. |/ Q: i; o1 Y' V  Y; B
        : t' Y( |$ J3 d: i8 ~( E; ^! ?
  r% Q6 w% ?! i
        string address = Wallet.ToAddress(script_hash);5 @1 a; b0 \% X

0 e9 z* I* H# o* G" O- ^- }        byte[] addresshash = Encoding.ASCII.GetBytes(address)+ ?4 @7 V) N% r
0 C0 @( m# a; G9 W/ G  C2 w
            .Sha256().Sha256().Take(4).ToArray();
% M7 K& [$ W/ L* T5 _4 e, G
0 Y7 _' j! o+ H" B6 h: w, w        $ I5 P7 O; x  U" V1 {
( P1 Q+ P0 N7 k0 l
        byte[] derivedkey = SCrypt.DeriveKey(: |" o) b. r) a8 K) _( V

& f1 \; O8 K& R7 e; p7 x2 m            Encoding.UTF8.GetBytes(passphrase), addresshash, N, r, p, 64);6 F% H" B* ?% Z* [4 B
6 k. P& E! u* V
        
2 Y9 b8 d$ W2 l
# X3 X5 K- M0 U- }' G- \, r        byte[] derivedhalf1 = derivedkey.Take(32).ToArray();
" c; v% c4 e1 P& E+ V: }. Z0 p5 T) \; }. d
        byte[] derivedhalf2 = derivedkey.Skip(32).ToArray();6 }8 O3 U  d2 [! ?

- x; o# S& C, o& C( H& u        
' L  d( b% m* m4 i. p) y( r* v1 S+ p4 F5 ?3 P* w
        byte[] encryptedkey = XOR(PrivateKey, derivedhalf1)
; j: `: B" U" }0 D3 C
+ n# |2 w% @9 D- G            .AES256Encrypt(derivedhalf2);
8 `9 V1 v- c6 d! |5 N. h, V/ @6 n6 X' s, n2 U  I
        
! X8 N9 X$ ~- z; Y; c, i4 m5 a- l) i
        byte[] buffer = new byte[39];
2 ]0 o" S- f# r, g3 u3 \) l" J6 w; d5 R% J2 `8 [2 W7 k2 o! U- p
        buffer[0] = 0x01;4 I, i& K  o1 c6 R4 @
' b% U6 Z  K/ \/ ^8 A
        buffer[1] = 0x42;% e  `& @* y$ f2 M
! c& k  @5 X1 S
        buffer[2] = 0xe0;7 @' X! t6 Z2 s' n& ]" l9 x
3 C" Y  n  Q$ o  J: t1 ?: M7 S; v
        Buffer.BlockCopy(addresshash, 0, buffer, 3, addresshash.Length);
/ {* g2 K" _! r9 ^
! _# q; M* U; f$ J( p        Buffer.BlockCopy(encryptedkey, 0, buffer, 7, encryptedkey.Length);
' h' E7 ?$ v4 R/ E  ]  y
, i7 W! q5 Z! ^/ t        return buffer.Base58CheckEncode();
  R8 W* Y* A0 M" Y7 `1 Z( F& J5 d0 [  U7 k3 L( n( t7 x% ]3 m) e7 J
    }
) t) g  q: o! k6 U( Q$ L+ l) h% ~( u* E
}
* h3 M# t! t$ N* j, Q; U' a9 T
, \( f7 e: \0 i7 t+ o- i) E* U: E可见SCrypt.DeriveKey方法参与了加密密钥的生成过程。后面解密也必然使用到了这个hash算法。所以该hash算法参与了加密过程,而加密密钥用AES256Encrypt生成。可以确定的是,使用该算法的逆过程,可以解密出密钥来,这个比WIF要安全。
4 e* s( z% Z/ W- X' P! r
" o  h$ s6 D2 C& J  F% D1 {Murmur3
; K' j* [4 D4 \: r0 ~2 p& _  ?" `. n: W
MurmurHash 是一种非加密型哈希函数,适用于一般的哈希检索操作。[1][2][3]由Austin Appleby在2008年发明,[4][5] 并出现了多个变种,[6] 都已经发布到了公有领域(public domain)。与其它流行的哈希函数相比,对于规律性较强的key,MurmurHash的随机分布特征表现更良好。[7]
  M3 F9 R& L( P& ]9 J" J+ T" i! N* J4 V- G$ j
Murmur3特点6 z1 O2 B9 Q. k& L4 e( o8 }

$ E$ B% O6 f# @1.碰撞率低( L. ~2 \$ F2 M/ t' S1 G

) U& {4 o2 `& [8 [2.计算速度快# c' V" T9 w1 O* Z- R& T
3 |' Q, c& [( F2 q
3.擅长大文件的hash4 H1 ~  ^2 B+ w9 a! E
4 H3 o; m7 ]1 `: \! Y" A5 S. b  _
Neo中如何使用Murmur3
, F, [2 p3 W9 d% g. [+ S2 x) r. M7 w
Neo中Murmur3! W3 n3 w0 ^( n! m
4 ^' G/ _5 R+ C# r
Murmur3的具体算法,以后再研究,现在大致知道,Neo用Murmur3生成key,也在BloomFilter中使用了。
% j6 q9 l3 L& e' }" I& L; |
! m6 e1 I6 z- o; L7 |0 @RIPEMD-160, J4 S$ N- B( @3 I4 v* f
5 k; O! R+ |' q* L( y% `0 ~/ B
Neo中用这个算法来生成短一点的hash值,script hash就是用了这个算法。
6 E; C+ n  V$ E3 u( F, K( `: u
6 G1 p, N  \3 x+ [6 w3 h- E7 m* `// in neo-compiler/neo/neo/Core/Helper.cs
4 Z! S( w' i" t& l( x
- }$ W+ q5 \6 P3 `public static UInt160 ToScriptHash(this byte[] script)
3 p( n" W! N: a" i# G2 ?% p
; F, `0 z6 V2 M) \% K/ p- m3 b        {
5 A1 I3 P9 }* |7 b! w4 ?5 @/ D
9 s/ ^) N7 e7 W            return new UInt160(Crypto.Default.Hash160(script));
( P; v  K, c3 E
8 U1 r- n  l  k        }" V7 f1 a, i1 |; E' r  z1 |4 U

1 V2 [' o/ O& F& j6 YRIPEMD-160算法的特点/ g% J( O. [5 k) E7 ?

  Q0 u# z1 J. [# }RIPEMD-160能表现出理想的 雪崩效应 (例如将 d 改成 c,即微小的变化就能产生一个完全不同的哈希值):$ G  z( T5 x. n8 w* Q: |, t0 ^
& m. Z9 C$ Q1 V+ }: ]
加密算法体系
  z/ v. F8 _) _% f
$ Y/ B% |1 ~+ M, l8 M现代加密算法的典型组件包括:加解密算法、加密密钥、解密密钥。其中,加解密算法自身是固定不变的,一般是公开可见的;密钥则往往每次不同,并且需要保护起来,一般来说,对同一种算法,密钥长度越长,则加密强度越大。
" o) f. o7 S6 W! ?+ o3 y9 t" D6 t; W' x
加密过程中,通过加密算法和加密密钥,对明文进行加密,获得密文。6 g4 S6 S, t0 e; k4 r
& g5 k: R  H( [& a4 l
解密过程中,通过解密算法和解密密钥,对密文进行解密,获得明文。* }, @9 R: W* h: _6 C

; S% M$ O  Y& ]% n根据加解密的密钥是否相同,算法可以分为对称加密(symmetric cryptography,又称公共密钥加密,common-key cryptography)和非对称加密(asymmetric cryptography,又称公钥加密,public-key cryptography)。两种模式适用于不同的需求,恰好形成互补,很多时候也可以组合使用,形成混合加密机制。+ m0 @! n1 Y* i- [2 |* G
! e$ m6 q: T# |! n6 C' S! l# X7 W; Z
并非所有加密算法的强度都可以从数学上进行证明。公认的高强度加密算法是在经过长时间各方面实践论证后,被大家所认可,不代表其不存在漏洞。但任何时候,自行发明加密算法都是一种不太明智的行为。
% j+ N$ k/ j  B6 N/ c# B3 U; U" u6 N
对称加密+ d+ C0 E' z( c# H

: q; v* F4 _: {1 f4 b顾名思义,加解密的密钥是相同的。
; S2 U: g2 z/ l& l/ E7 R9 J& x* N3 f0 u: x! X
对称加密优缺点+ |6 E3 I" e$ L/ l& g
6 ^  R% c; _! X9 e6 r1 P8 l
优点是加解密效率高(速度快,空间占用小),加密强度高。
% S' }: y3 {2 i. u3 c& N1 T4 e, u
缺点是参与多方都需要持有密钥,一旦有人泄露则安全性被破坏;另外如何在不安全通道下分发密钥也是个问题。
' |& c" W  ^4 h* f& c4 {$ [' q: ?# \- j4 _& x" Q7 ?
适用于大量数据的加解密;不能用于签名场景;需要提前分发密钥。
8 j0 s- ]: B' u3 ^, _5 h# F
: a4 |! Y- ]( ~! z对称加密实现
2 J9 I* m# U$ f- b+ a6 _) E4 @. j1 e+ m
对称密码从实现原理上可以分为两种:分组密码和序列密码。前者将明文切分为定长数据块作为加密单位,应用最为广泛。后者则只对一个字节进行加密,且密码不断变化,只用在一些特定领域,如数字媒介的加密等。1 N% e( V1 Z& W5 v  n2 p
4 J7 F+ y( h7 ?7 Y% d& ^  [
代表算法包括 DES、3DES、AES、IDEA 等。5 n' G; J8 `) V- [' l# u* M
% Y! a1 k" \: F- t/ S9 O1 {
DES(Data Encryption Standard):经典的分组加密算法,1977 年由美国联邦信息处理标准(FIPS)所采用 FIPS-46-3,将 64 位明文加密为 64 位的密文,其密钥长度为 56 位 + 8 位校验。现在已经很容易被暴力破解。
# k% L8 N! o3 P; _, F% e) ~, U3 y9 b8 |
3DES:三重 DES 操作:加密 –> 解密 –> 加密,处理过程和加密强度优于 DES,但现在也被认为不够安全。, i9 @. `" k% t

* c8 B  N  A/ OAES(Advanced Encryption Standard):美国国家标准研究所(NIST)采用取代 DES 成为对称加密实现的标准,1997~2000 年 NIST 从 15 个候选算法中评选 Rijndael 算法(由比利时密码学家 Joan Daemon 和 Vincent Rijmen 发明)作为 AES,标准为 FIPS-197。AES 也是分组算法,分组长度为 128、192、256 位三种。AES 的优势在于处理速度快,整个过程可以数学化描述,目前尚未有有效的破解手段。
8 S: |4 S6 B5 e9 E
1 K; A9 O+ J* \+ w8 k  _6 M0 @注:分组加密每次只能处理固定长度的明文,因此过长的内容需要采用一定模式进行加密,《实用密码学》中推荐使用 密文分组链接(Cipher Block Chain,CBC)、计数器(Counter,CTR)模式。
' S, t' G+ |$ T' c: F
- \8 }+ \3 s, |( M4 u' wNeo中的AES
# A- d" Q; u% v5 g" }( a3 c" T" p
在钱包的加解密中,使用了该算法。
, W) o7 q( k" G* v  s3 }/ M5 z
8 o- H: ^+ r) f' c) v) N下图的代码在/neo/Wallets/Wallet.cs中,NEP是neo enhancement proposal的意思。参数nep2就是符合这个格式的一个Neo钱包文件。8 n. H/ d& }. V# A8 o8 @# ~
/ s( H" o1 g7 g) p) @. H# u2 y
拿到私钥
' [" m* n& S8 D
. z3 ~) r4 C+ U- y* P$ S具体的过程,后面再仔细研究分享出来。4 V2 h, N0 h" w. q) Q' k- B( p

0 g0 k0 [' L3 A- V4 Q* X非对称加密
1 m; u3 A/ f* Z3 V& k" X0 B7 x
$ D( l3 R9 e6 ~+ n/ T0 q7 T7 @# @非对称加密是现代密码学历史上最为伟大的发明,可以很好的解决对称加密需要的提前分发密钥问题。顾名思义,加密密钥和解密密钥是不同的,分别称为公钥和私钥。公钥一般是公开的,人人可获取的,私钥一般是个人自己持有,不能被他人获取。$ g, ?9 O- P) t& c! j% a. o! P

! r5 Z% H% ~$ q5 T6 |7 t非对称加密优缺点; {2 e- d; k0 Y" L  d: R

4 [( d0 [* K% p7 {优点是公私钥分开,不安全通道也可使用。
7 W. X4 u$ q& A( g! V+ l5 w! F* A; y
缺点是加解密速度慢,一般比对称加解密算法慢两到三个数量级;同时加密强度相比对称加密要差。
: h- s9 ~$ r; n) |- W3 u# \1 y6 D! L$ O' c4 Z0 Y
非对称加密代表算法
4 A, k, a# @; w, ~* d
" R+ ]+ E+ W$ J* ?, ?& b+ Y非对称加密算法的安全性往往需要基于数学问题来保障,目前主要有基于大数质因子分解、离散对数、椭圆曲线等几种思路。
8 e# W0 S, m3 Y! B  }
& s, k2 Q! c  B' c5 n3 b* j代表算法包括:RSA、ElGamal、椭圆曲线(Elliptic Curve Crytosystems,ECC)系列算法。
2 b; l  h; W' D+ c- z7 }' `4 ^# `2 K/ L
RSA:经典的公钥算法,1978 年由 Ron Rivest、Adi Shamir、Leonard Adleman 共同提出,三人于 2002 年获得图灵奖。算法利用了对大数进行质因子分解困难的特性,但目前还没有数学证明两者难度等价,或许存在未知算法在不进行大数分解的前提下解密。  y. f* D+ \# a3 B; \2 F9 o. j5 A7 d
5 q* J8 C" z" N! b
Diffie-Hellman 密钥交换:基于离散对数无法快速求解,可以在不安全的通道上,双方协商一个公共密钥。, b/ m. l* y- Y8 f
2 D4 h) O; {* Z. Z- _: Q7 f1 P
ElGamal:由 Taher ElGamal 设计,利用了模运算下求离散对数困难的特性。被应用在 PGP 等安全工具中。
% P% g2 A0 k2 m9 @% n3 }6 R
0 g  Q; k  \3 Q: ]. Y5 b+ |# z0 M+ [, ^椭圆曲线算法(Elliptic curve cryptography,ECC):现代备受关注的算法系列,基于对椭圆曲线上特定点进行特殊乘法逆运算难以计算的特性。最早在 1985 年由 Neal Koblitz 和 Victor Miller 分别独立提出。ECC 系列算法一般被认为具备较高的安全性,但加解密计算过程往往比较费时。一般适用于签名场景或密钥协商,不适于大量数据的加解密。+ w  y$ K; o+ n. p
1 c! I; A! B- L  B/ }5 m* N. x
RSA 算法等已被认为不够安全,一般推荐采用椭圆曲线系列算法。0 w4 {9 A7 T7 Y+ z2 Q% z8 \
6 j9 j( p/ F; N- M0 L
Neo中的数字签名算法
, i$ E& l4 v$ Y4 @" V, N, q" @0 d  ]- S# x
在Neo中,也使用了非对称加密算法,我们通过代码来看看是如何使用的。# e3 d5 {5 z2 U; g2 i; M9 w# D

2 _" r! H6 l1 g* w/ ~: }public virtual WalletAccount Import(X509Certificate2 cert)
& i% g- A4 R! T+ O$ s$ i2 k5 T* h8 B6 e% c( |
        {3 P4 Y2 s9 m  I4 i, s; V- v; z1 ^

0 _, X$ H' @  [            byte[] privateKey;
" g$ J) S( \: j0 t0 J3 w, r% ]3 z$ w# ~  i# J# l; U
            using (ECDsa ecdsa = cert.GetECDsaPrivateKey()); F: d0 z, r' M# J6 q, C; s

8 _9 k; `+ ^' N5 M4 e            {
  \' R1 F  k( p9 P4 T( c+ l' M- f0 @# |1 X, {5 B
                privateKey = ecdsa.ExportParameters(true).D;
0 @9 Y; O& z( T  w/ p1 D7 F% ^9 \  ^. ~
            }1 x+ u) Y/ ~- c9 B* X6 K8 u0 D4 I
# e4 a, w3 m5 G5 R8 i
            WalletAccount account = CreateAccount(privateKey);" Z1 }+ x9 ?- M! \3 q
+ n0 F; S% B$ I0 B" d4 e' j7 _, ?
            Array.Clear(privateKey, 0, privateKey.Length);- v8 w3 x6 J1 O/ l3 N
8 `2 [; V9 ~( p
            return account;" E& O- u; }9 f: {5 B3 k! u
. q9 }0 W3 |7 Y$ d2 Z+ m" C& n
        }/ W- ~: k! B" q+ f' H% b
7 o- r0 X. e* w6 W3 K) g
X509Certificate2是数字证书,和我们在https里面使用的是一样的,从里面拿出私钥后,创建钱包。
* `1 c  q9 j" s' S  {* j2 L( g/ Q) z; K' s
总结
* \" Q8 J. o) j8 {4 G# {, y. l# d; z* u% i9 f8 }% D% z
目前只是简单的介绍了一下Neo中加密算法的使用情况,这些加密算法的原理和实现也是很有意思的,后面看看怎么实现的,再分享出来。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

深圳林妙可 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    33