数学有一种传统的方法来表示基数大于 10, 而软件开发在这个主题上有几个变化, 只是偶然的数学。

数学大会

按照惯例, 数学书籍通常通过使用字母作为9之后的新数字符号来表示大于10的基数中的数字。例如, 基16将使用0、1、2、…、9、a、b、c、d、e 和 f 作为其 “数字”。这适用于最多36的基地;基数36将使用字母表中的所有字母。对于是使用大写还是小写字母, 没有明确的惯例。

基本64编码

基64编码的常见用途不是将位本身表示为数字, 而是要有一种在需要文本字符的上下文中传输位的有效方法。

键盘上大约有100个可能的字符, 64 是最大的功率2小于 100 [1], 因此, 基64是最密集的编码使用通用字符在一个基本的2的功率。

基本64编码不遵循先使用数字, 然后添加更多符号的数学惯例;它是免费的, 因为没有打算将输出视为数字。相反, 大写字母 a 到 z 表示数字0到 25, 小写字母 A 到 z 表示数字26到 51, 数字0到9表示数字52到61。符号 + 用于 62,/用于63。

克罗克福特的基地32编码

道格拉斯·克罗克福德提出了一种有趣的基本32编码形式。他的编码主要遵循数学惯例: 0, 1, 2,…, 9, a, b,…, 除了他不使用字母 i, l, o 和 u. 这消除了混淆 i, i, 或 l 与 0, 或混淆 o 的可能性。克罗克福特还有一封他可以消除的信, 为了避免 “意外的淫秽”, 他选择了你。[3]

crocford 的基本32编码是效率和人的可读性之间的妥协。它比十六进制更有效, 表示每个字符的位数增加25%。它的效率低于 base 64, 每个字符的位数减少了 17%, 但比 base 64 编码更容易辨认, 因为它消除了常见的混乱字符。

他的编码也不区分大小写。他建议只使用大写字母进行输出, 但允许输入中的大写或小写字母。这是在 postel 定律的精神, 也被称为稳健性原则:

在你发送的东西上要保守, 在你接受的东西上要宽容。

有关克罗克福特支票金额建议的说明, 请参阅下一篇文章

密码生成器

下面是一个 python 脚本, 用于使用 crocford 的基本32编码生成密码。

from secrets import randbits
from base32_crockford import encode

def gen_pwd(numbits):
print(encode(randbits(numbits)))

例如, gen_pwd(60) 将创建一个具有60位熵的12个字符的密码, 并且此密码将不包含通常混淆的字符。

相关文章

[1] 我们希望使用2的功率, 因为它很容易转换基地2和基地 2n: 从右端开始, 并转换位在n组因此, 要将二进制数字101111001转换为十六进制, 我们将其分解为 1 0111 1001, 并将每个片断转换为十六进制, 具有 1 > 1, 0111-> 7, 1001-> 9, 以找到 101111111001-> 179。如果我们的基础不是2的功率, 转换将更加复杂, 没有那么本地化。

[2] 乔治·卡林臭名昭著的名单上的所有单词都包括 i 或 u, 因此没有一个词可以从 crocford 的基地32编码中产生。如果一个人愿意冒着意外淫秽的风险, 最好把 u 放回原处, 删除 s, 因为后者类似于 5, 特别是在某些字体中。

Comments are closed.