密码 – 单个字符中有多少信息?

所以我在安全编程和测试课上有一个关于作业的问题.问题是考虑
Windows NT或UNIX shell帐户.

“如果可以使用任何字符,八字符密码中可能有多少信息?”

所以我看到的方式是标准键盘上有95个可能的字符.但是它不依赖于编码关于单个字符中有多少“信息位”?

我不是要求答案,我只是需要帮助理解位字符部分,然后我可以自己弄清楚数学. 最佳答案 你得到的范围是0x21-0x7E(含).我们称这个数字为“可用”.这是ASCII中的所有标准可打印字符.它排除了空格/制表符/ crs等.如果“字符”真的是C字符类型(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.这些不是您正在寻找的机器人……

点赞