
一、 地址生成步骤
在wdc中,每个用户都可以生成自己的账户地址,账户地址是来自于生成的密钥对,其关系如下:

如图1所示,可以看到,在地址生成之前,有两个密钥会先生成,一个是私钥,一个是公钥,这是通过公开密钥算法生成的,在wdc系统中,采用的是椭圆线密码算法,具体说是Curve25519曲线,一个私钥必然对应着一个公钥,私钥必须妥善保存,公钥可以公开,而地址是根据公钥通过一个规则转化而来的。
生成步骤如下:
1)、通过25519曲线算法,生成密钥对,其中获得公钥,长度为32字节
2)、对公钥进行SHA3-256计算,获得结果为s1
3)、取得s1后面22字节,并且根据主网或测试网,分别增加前缀WX或WS,大写表示,获得结果为s2
4)、s2即为原始生成地址
5)、对s2进行地址校验和处理,得到结果s3
6)、s3为生成的地址
关于地址校验和
1)、对于上述步骤生成的s2进行所有字符的小写处理,得到r1
2)、将r1进行SHA3-256计算,得到哈希值r2
3)、将r1与r2进行字符比较,相同位置的字符,若对应哈希值的字符大于0x8则将r1中对应的字符转为大写(若是数字就不变)
4)、转化后的r1就是具备校验和能力的地址
[if !supportLists]二、 [endif]keystore生成逻辑
keystore是用来保存私钥的,其文件格式如下:
{"address": "","crypto": {"cipher": "aes-256-ctr","ciphertext": "a2c41861058818b64e3a9bc580d39e5d3308c181182e1ffc103bd281fafff2ad","cipherparams": {"iv": "5faf6f9e553054d1a51846da5137abc05faf6f9e553054d1a51846da5137abc0"},"kdf": "Argon2id","kdfparams": {“timeCost”:4,“memoryCost”:20480,“parallelism”:2,"salt": "65e11aebbb91020af7ce714120fe4e62bdb838826b81e27b55934348"},"mac": "757684ab512d907c8b04a9041dd4d4b8df8918f71a3dc7bdffb8d353f89b1add"},"id": "88ee2f87-99d8-40ee-b6ee-91e50f554d73","version": 1}
上述文件中的字段含义如下:
1)、address地址字符串2)、crypto包含加密参数说明,如下字段说明3)、cipher使用的加密算法,wdc钱包使用aes-256-ctr的私钥加密算法aes是对称密钥算法256是密钥位数ctr是加密模式
4)、ciphertext这是私钥被加密后的文本注意,我们对私钥进行加密时,是对私钥的十六进制形式的字符串进行加密,而不是二进制格式。并且加密时,不包含十六进制格式的0x符号5)、cipherparams这是AES-256-CTR算法需要用到的参数,只需要用到其中的iv参数,在生成keystore文件的时候,这个值随机生成,注意是二进制128位长度的,也就是16字节以下部分是对密钥进行加密的方法参数6)、kdf使用的密钥加密方法,这里使用的是Argon2id,这是一种哈希算法
7)、timeCost\memoryCost\parallelism这是Argon2id的参数,分别是散列计算的迭代次数,必须使用的存储器的大小以及可以并行计算散列的CPU数量
8)、salt这是哈希计算使用的盐值,采用长度与Argon2id哈希计算的值一样的长度注意,salt是需要随机计算出来的argon2id我们设定的输出结果是32字节,因此salt也生成为32字节大小
9)、mac这是用来比较解密密钥与口令的10)、id这是UUID,可以直接通过程序计算得到
11)、versionkeystore格式的版本号,默认为1
【keystore生成逻辑】
一个keystore表示一个用户私钥,用户生成私钥时必须提供密码,密码的长度不得小于6位(注意,密码长度并非必须校验的加密规则,只是一个前端校验的建议)1)、通过随机函数生成私钥2)、随机生成AES需要用到的iv向量值3)、随机生成salt值(注意盐值的长度与argon2id的哈希结果等长)4)、获得用户输入的密码p14)、将salt与p1连接起来,salt+p1,得到s15)、使用argon2id计算s1,得到derivedKey6)、这个derivedKey就是用来提供给AES的密钥,使用derivedKey,通过AES算法加密生成出的私钥cypherText7)、将derivedKey与加密后的私钥连接,derivedKey+cypherText,得到dc,SHA3-512计算得出MAC值
【keystore解密逻辑】
1)、用户输入密码2)、读取keystore中的salt值3)、使用生成keystore文件时的步骤,计算出一个mac值4)、读取keystore中的mac值,与计算出的mac值比较,若不一致则退出操作5)、若匹配成功,则取出用户密码以及keystore中存储的加密的私钥,进行解密计算
网友评论