单个字符中有多少信息?

时间:2015-09-28 20:09:18

标签: passwords bits

所以我在安全编程和测试课上有一个关于作业的问题。问题是考虑Windows NT或UNIX shell帐户。 “如果可以使用任何字符,八字符密码中可能有多少信息?” 所以我看到的方式是标准键盘上有95个可能的字符。但是它不依赖于编码关于单个字符中有多少“信息位”? 我不是要求答案,我只是需要帮助理解位字符部分,然后我可以自己弄清楚数学。

1 个答案:

答案 0 :(得分:2)

你从范围0x21-0x7E(含)获得95。我们称这个数字为“可用”。这是ASCII中的所有标准可打印字符。它排除了space / tabs / crs等。如果“character”真的是C char类型(8位),那么nusable是95.某些系统允许在密码中嵌入空格,所以要小心这会将数字增加到96等等。

如果“character”可以是任何8位字节值,则范围为0x00-0xFF,nusable为256.

因此,假设没有其他编码,实际答案将是95。如果这是一个介绍C编程类,这是可能的答案。但是,在再次查看措辞后,我认为这意味着可以使用256,无论您无法通过键盘输入它。

从这一点开始,在密码中输入nusable和允许的“字符”数量,该值为8,并进行数学运算......

因此,如果您被限制为ASCII和/或8位,则可以在此处停止。

UTF-8和UTF-16使用“代码点”,在编码为字符串时可以具有可变大小。请参阅https://en.wikipedia.org/wiki/UTF-8 UTF-8代码点的范围为0x000000-0x10FFFF(最大值为1,111,112),编码时的大小可以在1-4字节之间变化。请注意,上面的ASCII字符直接映射到UTF-8代码点0x00-0x7F,长度为一个字节。这是设计的。

所以问题是: “character”是C“char”类型:

(1) (char password[8])
或者是UTF-8编码的字符串:
(2) (char password[n]) where "n" is large enough to contain 8 codepoints?
    The maximum would be n = 8 * 4
或在代码点中重述为:
(3) uint32_t password[8]

如果“character”表示代码点,则查找nusable类似于您对ASCII所做的操作。但是,并非所有UTF-8代码点都可用。有些是无效的。有些是特殊的转义码。有些是未分配的并留待将来使用(例如Klingonese,我们是否应该开发星舰:-))。有些用于特殊符号,例如“长划线”(例如“ - ”或“---”)。

因此,对于给定的编码,我们需要弄清楚是否可以使用。它们可以是任何语言(例如英语,斯瓦希里语,中文,德语都混合在一起)或者您是否必须承担给定的语言限制(例如德语的可用代码点数远少于中文)?对奇怪的东西的代码点有任何限制吗?

Windows使用wchar_t(16位)来实现可变长度的UTF-16编码。它在编码方式上与UTF-8不同,但具有类似的代码点范围。

如果物理存储大小可以变化以允许8个代码点[上面的情况(2)或情况(3)],请使用nusable并进行数学运算[就像上面的ASCII一样]。

如果物理存储是固定的[case(1)],这会变得很难看。此外,课堂练习也不太可能。我们试图将可变长度的UTF-8编码字符串填充到固定长度的字符串区域中。我们需要将长度为1(例如95),长度为2,......,长度为4的所有可用代码点计数到长度为5的向量中(例如int lenlist [5])。然后,计算最终答案成为最短路径,树步行等问题。我们需要列举可变长度的所有可能组合。这可能需要在所有可能的位置进行长度的可能组合,使得它不超过8.这些不是您正在寻找的机器人......