【问题标题】:RC4 Encryption KSA key out of boundsRC4 加密 KSA 密钥越界
【发布时间】:2016-05-16 07:14:55
【问题描述】:

我正在 C# 中为我的 WPF 应用程序实现 RC4 算法。

我按照pdf 说明了算法。

问题是,在 KSA,我们应该这样做:j = (j + S[i] + (int)key[i % keyLengthInBits]) % 256;。

话虽如此,我不明白这是如何工作的,因为密钥的长度应该是 5 个字符到 32 个字符(40 位到 256 位)。

让我们以 5 个字符的密钥为例(我将使用与上面链接的 pdf 相同的密钥):pwd12。你去获取i % 40 位置的密钥字符(5 个字符长是 40 位)。前 5 次没问题,因为从 i = 0 到 i=4,我们在键 (pwd12) 中有一个值。虽然这是问题所在(从我的角度来看):当我们在i=5 时,我们的键中没有任何字符。因此我们会得到一个ÒutOfBounds Exception。

如果我们尝试在没有字符的键中获取一个字符,它是如何工作的?显然有一些我在算法中看不到的东西,因为它确实有效,否则它不会被使用......

【问题讨论】:

  • 提示:取模运算符 (%) 是干什么用的?
  • 返回除法的余数。因此,它不是以位为单位的 keyLength,而是密钥长度本身。谢谢你让我大开眼界!
  • 它是以比特为单位的密钥长度。该表达式的目的是选择密钥的一位。看我的回答。

标签: c# algorithm cryptography rc4-cipher


【解决方案1】:

短语key[i % keyLengthInBits] 是一种表达“密钥的第i 位”的方式。这并不意味着密钥中的第 i 个条目表示为字节数组,每个字节包含密钥的 8 位。

等效的 C 代码类似于:

int bit = i & keyLengthInBits;
((key[bit / 8] >> (bit % 8)) & 1)

【讨论】:

  • 好吧,然后((key[bit / 8] >> (bit % 8)) & 1),我不太确定,会是:据我了解,假设我们在i=5,关键仍然是pwd12 (40 位)。它将是bit = 5 & 40,它会给出0,因此是key[0/8] = 'p'。根据我从>> 运算符得到的信息,它在0 位上进行了右移,因为(bit % 8 = 0) 所以p 保持从01110000。&1 使它变成00000000。(从这里我迷失了为什么我们会让它变成 0...) 我想我错了,但据我了解,这就是它在你的两行中的方式。 @大卫施瓦茨
  • @Marks 你说得对。如果i 为 5,则代码提取密钥的第五位。
  • 那么如果我们处于第 52 次迭代(i = 52)会怎样。它去 52 (00110100) & 40 (00101000) 给出 00100000 所以bit = 32。 key[32/8] = key[4] 给出 2(仍然考虑密钥是 pwd12)。自 32 % 8 = 0 以来右移 0。所以它最终是 00000010 和 00000001,它给出了 0。因此在这里它又会变成 j = (j + S[k] + (int)key[0]) % 256; ) 这是我们使用您提供的两行从 i % ketLengthInBits 得到的结果。那是对的吗 ? @大卫施瓦茨
  • 如果key[4]是00000010,那么随着i从32到39,它从右到左读取第32到39位,输出0,1,0,0, 0, 0, 0, 0.
  • 从右到左阅读是因为我假设 >> 右移?即使它没有移动,因为它是>> 0,它确实从右侧读取它。考虑到这一点,我们仍然会去 0 执行 &1,因为 01000000 和 00000001 给出 00000000。不是吗? @大卫施瓦茨
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
相关资源
最近更新 更多