RC4是世界上使用最广泛的密码之一。 它用于WEP,WPA,SSL,BitTorrent,PDF等。它是最易于理解和实施的工具之一。 它也是可用的最快算法之一。
什么是RC4它是一种流密码,这意味着它逐字节地对数据流进行加密,而不是通常一次包含字节移位的一次对一组字节进行加密的块密码。 这通常意味着分组密码比流密码更安全。 与分组密码相比,流密码的弱点之一是数据的布局是不变的。 因此,如果您知道数据的布局,则可以翻转一下以更改消息的含义。 例如,如果您知道消息格式为“存款:###”,则可以从根本上翻转字节10的一位,并希望将100更改为900。那么,需要的是一种验证消息的方法。 通常,加密散列函数用于此目的。 本质上,此消息身份验证代码使您可以验证发件人和消息。
这是一个秘密密钥算法,这意味着它使用的密钥仅应由预期的发送者和接收者知道。 一个主要的问题是密钥的安全传输。 公钥密码学通过使用所谓的“硬”数学解决了这一问题,其中在一个方向上的计算很容易,而在相反方向上的求解则需要更长的时间。 一个例子是乘法与因式分解。 将两个数字相乘很容易,但是尝试找到用于获取该数字的两个数字会花费很长时间。 这种类型的“硬”数学使您可以传输发件人和收件人用来计算密钥的公共信息,而不必传输密钥。 那么为什么不只使用公钥加密呢? 它比秘密密钥加密要慢得多。
密码学的一般缺陷密码学的一个弱点是可以使用蛮力将其入侵。 这意味着,只有在计算机尝试查找每个密码直到找到您使用的密码之前,该消息才可以保密。 您添加到密码中的每个字节意味着破解密码大约需要256倍的时间。 所以问题是,您需要多长时间才能将该消息保密?
现在,这实际上并不是该算法的弱点。 一个实际的弱点是,许多算法都经过数学分析,可能会揭示出用于加密数据的密钥。 如果使用相同或相似的密钥提供足够的加密数据,将比使用蛮力更快地导致破解。 减轻这种情况的一种方法是使用随机数,初始化向量或盐。 它们基本上是与密钥一起使用的随机位,因此,即使您使用的是相同的密钥,每个消息也不相同,因为实际上随机位会更改所使用的密钥。
这就是为什么您应该选择更长的密码以及为什么应该经常更改密码的原因。
RC4如何工作RC4通过从密钥流生成字节的伪随机字节流来加密数据流。 此输出与消息进行异或。
要生成初始密钥流,请从一个256项数组开始,该数组填充序列0-255。 循环256次,密钥中的每个字节用于计算0到255之间的两个数字。然后将这些索引处的两个数字交换。
这样,通过计算两个索引,交换那些索引处的数字,将这两个数字模数256相加然后返回该索引处的数字来生成密钥流。
然后将此数字与消息的一个字节进行异或。 这一直持续到消息结束为止。
RC4的特定弱点数学分析表明,密钥流的前几个字节遵循一种模式,可以揭示用于创建密钥的密钥或密钥流。 建议删除密钥流的前几个字节以减少这种关系。 标准为768字节,但建议值为3072字节。
我提到以下缺点,因为它可能是算法中的主要缺点,但是我对这种攻击还不够了解,因此无法说出任何有价值的东西。 Souradyuti Paul和Bart Preneel证明了Itik Mantin和Adi Shamir关于密码流组合分析的先验弱点。 他们在论文中讨论了该弱点,并对该算法进行了修改,以缓解该弱点。
RC4的示例实现此功能可在许多VB实现中使用。 它甚至可以在Visual Basic脚本中工作,并且实际上是专门为VBScript编码的。 但是它应该可以直接移植到VBA。 这是一个内联版本,因为调用函数会花费很多开销。 为了使其更加安全,我要做的一件事就是删除密钥流的前3072个字节。 加密和解密使用相同的功能完成。 我根据测试值验证了预删除版本。
Function RunRC4(sMessage, strKey)
Dim kLen, x, y, i, j, temp
Dim s(256), k(256)
'Init keystream
klen = Len(strKey)
For i = 0 To 255
s(i) = i
k(i) = Asc(Mid(strKey, (i Mod klen) + 1, 1))
Next
j = 0
For i = 0 To 255
j = (j + k(i) + s(i)) Mod 256
temp = s(i)
s(i) = s(j)
s(j) = temp
Next
x = 0
y = 0
'Drop n bytes from keystream
For i = 1 To 3072
x = (x + 1) Mod 256
y = (y + s(x)) Mod 256
temp = s(x)
s(x) = s(y)
s(y) = temp
Next
'Encode/Decode
For i = 1 To Len(sMessage)
x = (x + 1) Mod 256
y = (y + s(x)) Mod 256
temp = s(x)
s(x) = s(y)
s(y) = temp
RunRC4 = RunRC4 & (s((s(x) + s(y)) Mod 256) Xor Asc(Mid(sMessage, i, 1))) & ","
Next
End Function
**编辑** 下载一个示例进行操作。
From: https://bytes.com/topic/access/insights/906671-rc4-encryption-algorithm-vba-vbscript