【问题标题】:How many bits of information are in a single character?一个字符中有多少位信息?
【发布时间】:2015-09-28 20:09:17
【问题描述】:

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

【问题讨论】:

    标签: passwords bits


    【解决方案1】:

    您的 95 来自 0x21-0x7E(含)范围。让我们称这个数字为“可用的”。这是来自 ASCII 的所有标准可打印字符。它不包括空格/制表符/crs 等。如果“字符”确实是 C 字符类型(8 位),则 nusable 为 95。某些系统确实允许在密码中嵌入空格,所以要小心这会将数字增加到 96,等等。

    如果“字符”可以是任何 8 位字节值,则范围为 0x00-0xFF,可使用范围为 256。

    因此,假设没有其他编码,实际答案将是 95。如果这是一个介绍 C 编程课程,这就是可能的答案。但是,再看一下措辞,我认为它的意思是 nusable 是 256,不管你不能通过键盘输入它。

    从这一点开始,取可使用的密码和密码中允许的“字符”数,即 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 并且长度为一个字节。这是设计使然。

    所以问题是: “字符”是 C “字符”类型:

    (1) (char password[8])
    还是 UTF-8 编码的字符串:
    (2) (char password[n]) 其中“n”大到足以包含 8代码点?
        最大值为 n = 8 * 4
    或在代码点中重述为:
    (3) uint32_t password[8]

    如果“字符”表示代码点,则查找可使用的方法与您为 ASCII 所做的类似。但是,并非所有 UTF-8 代码点都可用。有些是无效的。有些是特殊的转义码。有些未分配并保留以供将来使用(例如,克林贡语,我们是否应该开发星际飞船:-))。有些用于特殊符号,例如“长破折号”(例如“--”或“---”)。

    因此,对于给定的编码,我们需要找出可使用的。它们可以是任何语言(例如,英语、斯瓦希里语、中文、德语都混合在一起)还是您必须假设给定的语言限制(例如,德语的可用代码点比中文少得多)?对奇怪的东西的代码点有任何限制吗?

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-05-15
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 2010-09-11
      • 1970-01-01
      • 1970-01-01
      • 2019-11-03
      • 2013-11-01
      相关资源
      最近更新 更多