一个字符包含多少位信息



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

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

如果"character"可以是任何8位字节值,范围将是0x00-0xFF,不可用的将是256。

因此,假设没有其他编码,实际答案将是95。如果这是一门C编程入门课程,那么这是可能的答案。但是,在再次看了措辞之后,我认为它的意思是不可用的是256,不管你不能通过键盘输入它。

从这里开始,取密码中不可用的和允许的"字符"数,即8,并进行数学运算…

所以,如果你被限制为ASCII和/或8位,你可以停在这里。

UTF-8和UTF-16使用"码点",当编码成字符串时,它们的大小可以是可变的。参见https://en.wikipedia.org/wiki/UTF-8 UTF-8码点的范围为0x00000 - 0x10ffff(最大值为1,111,112),编码时的大小可以从1-4字节不等。注意,上面的ASCII字符直接映射到UTF-8码点0x00-0x7F,长度为一个字节。这是故意的。

问题是:"character"是C "char"类型吗?

(1) (char password[8])
还是UTF-8编码字符串:
(2) (char password[n])其中"n"足够大以包含8个码点?最大值是n = 8 * 4
或者用代码点表示为:
(3) uint32_t password[8]

如果"character"表示代码点,那么查找不可用的方法与查找ASCII类似。但是,并不是所有的UTF-8码点都可用。有些是无效的。有些是特殊的转义码。有些是未分配的,留作将来使用(比如克林贡人,如果我们开发星际飞船的话:-))。有些是特殊符号,如"长破折号"(例如:"——"或"——")。

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

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

如果物理存储大小可以改变以允许8个代码点[上述情况(2)或情况(3)],则采用不可用并进行数学计算[就像上述ASCII一样]。

如果物理存储是固定的[case(1)],情况会变得很糟糕。而且,这也不太可能作为课堂练习。我们将尝试将可变长度的UTF-8编码字符串塞进固定长度的字符串区域。我们需要获得长度为1(例如95),长度为2,…的所有可用代码点的计数。将长度4转换为长度为5的向量(例如int lenlist[5])。然后,计算最终答案就变成了最短路径,树走,等等的问题。我们需要列举可变长度的所有可能组合。这将需要对所有可能位置的长度组合进行处理,这样它就不会超过8。这些不是你要找的机器人…

最新更新