Skip to content

Latest commit

 

History

History
20 lines (17 loc) · 2.53 KB

使用云密码计算用户私钥.md

File metadata and controls

20 lines (17 loc) · 2.53 KB

简介

  • Cybex上的私钥可以保存在加密的本地钱包中,也可以由用户名和用户密码衍生得到,分别对应前端的本地钱包登陆模式和云钱包登陆模式。
  • 在本地钱包模式中,私钥为随机字节流,通过本地钱包加密保存,本地钱包文件+钱包密码是唯一获取私钥的方式。通过Cybex前端注册的账户,会生成两组公私钥对,分别对应账号的活跃权限和账号权限。
  • 在云钱包模式中,私钥由用户名和云密码衍生得到,在衍生过程中,活跃权限(active)和账号权限(owner)会在种子字符串中加入不同的盐(salt),以获得不同的种子字符串,进而衍生出对应的活跃权限私钥和账号权限私钥。
  • 本文介绍云钱包登陆模式中,如何由用户名和密码,衍生计算账户私钥的算法。

云密码私钥衍生算法

以账号名abc,密码xyz为例介绍衍生算法获得私钥的过程。

  1. 构造种子字符串,为(账号名+权限种类+密码)。此账号的active私钥的种子字符串为abcownerxyz,owner私钥的种子字符串为abcactivexyz。(由于历史原因,active权限的盐为"owner",owner权限的盐为"active")以下以owner权限种子字符串计算过程举例,账号权限的计算过程与活跃权限相同。
  2. 对种子字符串的字节流(注意以ascii而非UTF-8编码)计算sha256,得到256位的流s1,其16进制表示为"3120c89a760455efb9176cd4e23f18404499a5c655dc580a80a5746693e39f94"
  3. 在此字节流前缀一个字符0x80,得到264位的流s2,其16进制表示为"803120c89a760455efb9176cd4e23f18404499a5c655dc580a80a5746693e39f94"
  4. 对s2计算sha256,得到256位的流s3,其16进制表示为"8236a1c044c10e33a2076757f244e9e956b129ed9412f7f71d1e7b1376e4e17d"
  5. 对s3再一次计算sha256,得到256位的流s4,其16进制表示为"c6bd2ac070e78c72c3e32b9ab187d801923f65c07c7258b27be5b21a9584ad96"
  6. s2拼接s4的前4字节(作为校验位),得到296位的流s5,其16进制表示为"803120c89a760455efb9176cd4e23f18404499a5c655dc580a80a5746693e39f94c6bd2ac0"
  7. s5进行base58编码,得到字符串S6="5JBvVUyFQq3z4aYij5VV5EhHgPcQXR9q3KCYP2s7tJmKke3eTZH"。

这里s1为椭圆曲线算法中的私钥,S6为私钥的钱包导入格式表示。

公钥

公钥使用33字节压缩表示。对公钥计算ripemd160后,获取前4字节(作为校验位),添加在公钥前部,得到37字节的校验位+公钥表示,记位P,用户可读形式的公钥为"CYB" + base58_encode(P)