首页
学习
活动
专区
圈层
工具
发布

RC4实现
EN

Code Review用户
提问于 2017-03-13 02:35:44
回答 1查看 1.4K关注 0票数 3

我正在使用RC4加密算法在C#中的以下实现

代码语言:javascript
复制
/// <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;
}

是否有可能进一步优化我的实现,最终使用不安全的代码,特别是对于变量交换?我希望得到一些建设性的批评。

EN

回答 1

Code Review用户

发布于 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;

重用tempij而不是仅仅在每个作用域中重新声明它们有什么好处?重新声明它们的好处是,它们是新变量的透明度更高。

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秒。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/157603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档