编码算法
#
Base58Base58是一种将非可视字符与可视化字符(ASCII)相互转化的编解码方法。实现了数据的压缩、便于阅读,适用于抗自动监视的传输系统的底层编码机制,但缺乏校验机制,无法检测出传输过程中字符串的遗漏,需要配合改进算法Base58Check使用。
Base58采用数字、大写字母、小写字母(去除歧义字符 0 (零), O (大写字母O), I (大写的字母i) and l (小写的字母L) ),总计58个字符作为编码的字母表。
Neo使用的字母表为:123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
接口定义:
- 编码方法:把byte[]数据编码成Base58字符串String数据
string Encode(byte[] input)
- 解码方法:Base58字符串String解码成byte[]数据
byte[] Decode(string input)
编码步骤:
在 byte[] 数据前添加一个0x00,生成一个新的byte数组,并将新数组做反转操作
把数组的数据转成10进制BigInteger数
把BigInteger数按字母表转换成58进制字符串
统计原 byte[] 数据中0x00的个数 count,在字符串前补 count 个字母表游标为零所对应的字符
解码步骤:
将输入的字符串按Base58字母表转换成10进制BigInteger数
把 Biginteger 数转换成 byte[] 数据,并将 byte[] 数据倒序排序
统计原输入的字符串中字母表游标为零所对应的字符的个数 count
若 byte[] 数据的长度大于1,且 byte[0] 等于0,且 byte[1] 大于等于0x80,则从 byte[1] 开始截取,否则从 byte[0] 开始截取,得到结果。
Example:
字符串 | byte[] |
---|---|
NTRAJ9EEjHFHhHZvMKEKfkceg5V9ppx5ZP | [0x35, 0x52, 0x4e, 0x37, 0xb7, 0x01, 0x39, 0xc8, 0x96, 0xeb, 0xd5, 0x4a, 0x86, 0x48, 0xd3, 0xfa, 0x78, 0x6b, 0x26, 0x48, 0x76, 0xea, 0xc5, 0x26, 0xce] |
应用场景:
为Base58Check编解码方法提供服务。
#
Base58CheckBase58Check是基于Base58的改进型编解码方法。通过对原数据添加数据的哈希值作为盐,弥补了Base58缺少效验机制的缺点。
接口定义:
- 编码方法:把 byte[] 数据编码成带校验功能 Base58 字符串 String 数据
string Base58CheckEncode(byte[] input)
- 解码方法:把带校验功能 Base58 字符串 String 解码成 byte[] 数据
byte[] Base58CheckDecode(string input)
编码步骤:
通过对原 byte[] 数据做两次 sha256 得到原数据的哈希,取其前4字节作为版本前缀checksum,添加到原 byte[] 数据的末尾。
把添加了版本前缀的 byte[] 数据做 Base58 编码得到对应的字符串。
解码步骤:
把输入的字符串做 Base58 解码,得到 byte[] 数据。
取 byte[] 数据首字节到倒数第4字节前的所有数据 byte[] 称作 data。
把 data 做两次 SHA256 得到的哈希值的前4字节作为版本前缀 checksum,与 byte[] 数据的后4字节比较是否相同,相同则返回data, 否则判定为数据无效。
Example:
字符串 | byte[] |
---|---|
NTRAJ9EEjHFHhHZvMKEKfkceg5V9ppx5ZP | [0x35, 0x52, 0x4e, 0x37, 0xb7, 0x01, 0x39, 0xc8, 0x96, 0xeb, 0xd5, 0x4a, 0x86, 0x48, 0xd3, 0xfa, 0x78, 0x6b, 0x26, 0x48, 0x76] |
应用场景:
导入、导出输出wif格式的密钥
合约脚本哈希与地址字符串相互转换
导入、导出NEP2格式密钥