我正在使用RC4加密算法在C#中的以下实现
/// <summary>
/// RC4 encryption algorithm
/// </summary>
/// <param name="bytes">Input bytes</param>
/// <param name="key">Key bytes</param>
/// <returns>encrypted bytes</returns>
public static byte[] Encrypt(byte[] bytes, byte[] key)
{
byte[] z = new byte[bytes.Length];
byte[] s = new byte[256];
byte[] k = new byte[256];
byte temp;
int i, j;
for (i = 0; i < 256; i++)
{
s[i] = (byte)i;
k[i] = key[i % key.GetLength(0)];
}
j = 0;
for (i = 0; i < 256; i++)
{
j = (j + s[i] + k[i]) % 256;
temp = s[i];
s[i] = s[j];
s[j] = temp;
}
i = j = 0;
for (int x = 0; x < z.GetLength(0); x++)
{
i = (i + 1) % 256;
j = (j + s[i]) % 256;
temp = s[i];
s[i] = s[j];
s[j] = temp;
int t = (s[i] + s[j]) % 256;
z[x] = (byte)(bytes[x] ^ s[t]);
}
return z;
}是否有可能进一步优化我的实现,最终使用不安全的代码,特别是对于变量交换?我希望得到一些建设性的批评。
发布于 2019-08-21 08:43:24
公共静态byte[]加密( byte[]字节,byte[]密钥)
bytes没有告诉我任何我还不知道的东西。plaintext会告诉我这个变量的含义。
byte[] z = new byte[bytes.Length];
类似地,这将更有用地命名为ciphertext。
byte[] s = new byte[256]; byte[] k = new byte[256]; byte temp; int i, j;
重用temp、i和j而不是仅仅在每个作用域中重新声明它们有什么好处?重新声明它们的好处是,它们是新变量的透明度更高。
for (i = 0; i < 256; i++) { ... k[i] = key[i % key.GetLength(0)]; } ... for (i = 0; i < 256; i++) { j = (j + s[i] + k[i]) % 256; ... }
k被精确地使用了一次,并且在一个与初始化它的循环相同的循环中。IMO将简化事情,以消除中间商,只需在第二个循环中使用key[i % key.Length]。
j = (j + s[i] + k[i]) % 256; i = (i + 1) % 256; j = (j + s[i]) % 256; ... int t = (s[i] + s[j]) % 256;
这是一个巨大的优化机会。用% 256替换& 255可以使我用一个大的明文减少25%的执行时间。
for (int x = 0; x < z.GetLength(0); x++)
一开始我忽略了这一点:因为它是一个一维数组,所以您可以使用Length而不是GetLength(0)。这进一步大大加快了速度。
不过,我必须说,代码非常简单,已经非常快了。我的测试用例是512 My的明文,时间从10.2秒下降到5.4秒。
https://codereview.stackexchange.com/questions/157603
复制相似问题