栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

RC4加密Java

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

RC4加密Java

有几件事要注意:

  • 当您需要无符号字节(例如用于索引)时,Java并不是很容易使用。
  • 如果您在
    S
    和中创建了状态
    T
    ,那么您应该真正注意到这些值会发生变化,当您 使用相同的实例进行 解密时 会采用用于加密的状态;
  • 上面的代码在内存方面不是很有效,您可以轻松地重写它以获取字节数组。
  • 要使用字符串,将参数重构为后
    byte[]
    ,首先需要首先使用字符编码,例如使用
    String.getBytes(Charset charset)

为了使生活更轻松,并有一些有趣的深夜黑客,我改进了您的代码,并使用零进位字节数组对rfc6229中的单个向量进行了测试。

更新:正如micahk在下面指出的那样,使用了邪恶的C XOR交换,阻止了此代码对Java中输入的最后字节进行加密。使用常规的旧交换程序可以解决此问题。

警告
:以下代码应被视为编码练习。请使用经过严格审查的库,而不是下面的代码片段,以在您的应用程序中执行RC4(或Ron的代码4,ARC4等)。这意味着

Cipher.getInstance("RC4");
在Bouncy
Castle中使用或ARC4类。

public class RC4 {    private final byte[] S = new byte[256];    private final byte[] T = new byte[256];    private final int keylen;    public RC4(final byte[] key) {        if (key.length < 1 || key.length > 256) { throw new IllegalArgumentException(         "key must be between 1 and 256 bytes");        } else { keylen = key.length; for (int i = 0; i < 256; i++) {     S[i] = (byte) i;     T[i] = key[i % keylen]; } int j = 0; byte tmp; for (int i = 0; i < 256; i++) {     j = (j + S[i] + T[i]) & 0xFF;     tmp = S[j];     S[j] = S[i];     S[i] = tmp; }        }    }    public byte[] encrypt(final byte[] plaintext) {        final byte[] ciphertext = new byte[plaintext.length];        int i = 0, j = 0, k, t;        byte tmp;        for (int counter = 0; counter < plaintext.length; counter++) { i = (i + 1) & 0xFF; j = (j + S[i]) & 0xFF; tmp = S[j]; S[j] = S[i]; S[i] = tmp; t = (S[i] + S[j]) & 0xFF; k = S[t]; ciphertext[counter] = (byte) (plaintext[counter] ^ k);        }        return ciphertext;    }    public byte[] decrypt(final byte[] ciphertext) {        return encrypt(ciphertext);    }}

快乐的编码。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/609641.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号