Base58编码方案

2020-12-04 20:39:08

本文档指定了基础58编码方案,包括对该方法的好处,编码和解码算法,替代字母以及安全性方面的介绍。

提交此互联网草案完全符合BCP 78和BCP 79的规定。

Internet草案是Internet工程任务组(IETF)的工作文件。请注意,其他小组也可能以互联网草案的形式分发工作文件。当前的Internet草案列表位于https://datatracker.ietf.org/drafts/current/。

互联网草案是文档草案,有效期最长为六个月,并且可以随时被其他文档更新,替换或废弃。使用Internet草案作为参考资料或引用它们不是“进行中的工作”是不合适的。

版权所有(c)2019 IETF Trust和确定为文档作者的人员。版权所有。

本文档受BCP 78和IETF托拉斯与IETF文档有关的法律规定(https://trustee.ietf.org/license-info)的约束,自本文档发布之日起生效。请仔细阅读这些文档,因为它们描述了您对本文档的权利和限制。

在传输数据时,以低保真度传输机制幸免的方式对数据进行编码可能会很有用。例如,以人类可以在视觉上确认编码数据的方式使用人类字母编码数据比以二进制形式编码数据更有益。 Base58编码方案与Base64编码方案相似,因为它可以将任何二进制数据转换为文本字符串。与Base64的不同之处在于,精心选择了转换字母以使其在开发人员或支持技术人员等人员可能需要视觉上以低错误率确认信息的环境中正常工作。

Base58在设计时考虑了Base64不考虑的许多可用性特征。首先,省略了相似的字母,例如0(零),O(大写o),I(大写i)和l(小写L)。这样做消除了人类将相似的角色误认为错误的角色的可能性。其次,省略了非字母数字字符+(加号),=(等于)和/(斜杠),以便可以在所有现代文件系统和URL方案中使用Base58值,而无需进一步的系统特定的编码方案。第三,通过仅使用字母数字字符,可以在现代计算机界面中轻松进行双击或双击选择。第四,社交消息传递系统不会在字母数字字符串上换行,这使得在调试系统时更容易通过电子邮件或消息传递Base58值。第五,与Base64不同,对于最多64个字节的值,没有字节填充使许多Base58值更小(平均)或与Base64值大小相同,而对于较大的值则不超过2%。最后,Base64有11种编码变体,这导致开发人员在使用哪种Base64上感到困惑。该规范断言,针对Base58的编码机制只有一种,使实现和开发人员的交互更为简单。

尽管Base58确实具有许多有益的可用性功能,但对于编码格式而言,它并不总是一个不错的选择。例如,在编码大量数据时,它的效率比base64低2%。如果希望将大型数据集的效率提高2%,则开发人员可以避免使用Base58。

本文档指定了基础58编码方案,包括对该方法的好处,编码和解码算法,替代字母以及安全性方面的介绍。

关键字"必须","必须"," SHALL"," SHALL NOT&#34 ;、 " SHOULD"," SHOULD NOT&#34 ;、推荐的"," MAY"和" OPTIONAL"如RFC 2119所述,本文档中的解释。

从0到57的每个字节值都通过以下方式映射到上面的字母:

还存在Base58的其他特定于应用程序的字母,例如Ripple字母和Flickr字母。这些字母虽然在其自己的应用程序空间中有效,但对于该规范而言不是有效的编码格式,因此不得使用。支持多个Base58编码字母会损害互操作性。

要将字节数组编码为Base58编码值,请运行以下算法。所有数学运算必须使用整数算术执行。首先初始化&zero39counter'到零(0x0),即&encoding_flag'到零(0x0),即&b39_bytes'数组,一个&b39_encoding'阵列和一个“携带”值设为零(0x0)。对于字节数组中的每个字节,而'进位'第一次迭代后不等于零(0x0):

如果' encoding_flag'未设置,并且如果字节为零(0x0),则将' zero_counter'的值递增。如果该值不为零(0x0),则设置' encoding_flag'。为true(0x1)。

如果' encoding_flag'设置后,将当前字节值乘以256,然后将其添加到“进位”。

一旦“ b58_bytes”数组已构建,生成最终的' b58_encoding'使用以下算法。设置第一个' zero_counter' ' b58_encoding'中的字节到' 1'。然后,对于&b39_array'中的每个字节,使用上一节中的Base58字母将该字节值映射到&b39_encoding'中的相应字符。返回&b39_encoding'作为输入字节数组的Base58表示形式。

要将Base58编码的字节数组解码为解码的字节数组,请运行以下算法。所有数学运算必须使用整数算术执行。首先初始化' raw_bytes'阵列和一个“携带”值设为零(0x0)。对于输入字节数组中的每个输入字节:

设置&随身携带到与输入字节字符关联的字节值。如果映射不存在,则返回错误代码。

以下示例可用作本规范中算法的测试向量:

快狐狸的Base58编码值跳过了懒狗。是:

感谢中本聪(Satoshi Nakamoto)发明了Base58编码格式,并感谢比特币社区推广了其用法。