嗨,我正在尝试用Java实现RC4算法。我找到了以下代码作为示例,可以帮助我理解这个想法:
public class RC4 {
private int[] S = new int[256];
private int[] T = new int[256];
private int keylen;
public RC4(byte[] key) throws Exception {
if (key.length < 1 || key.length > 256) {
throw new Exception("key must be between 1 and 256 bytes");
} else {
keylen = key.length;
for (int i = 0; i < 256; i++) {
S[i] = i;
T[i] = key[i % keylen];
}
int j = 0;
for (int i = 0; i < 256; i++) {
j = (j + S[i] + T[i]) % 256;
S[i] ^= S[j];
S[j] ^= S[i];
S[i] ^= S[j];
}
}
}
public int[] encrypt(int[] plaintext) {
int[] ciphertext = new int[plaintext.length];
int i = 0, j = 0, k, t;
for (int counter = 0; counter < plaintext.length; counter++) {
i = (i + 1) % 256;
j = (j + S[i]) % 256;
S[i] ^= S[j];
S[j] ^= S[i];
S[i] ^= S[j];
t = (S[i] + S[j]) % 256;
k = S[t];
ciphertext[counter] = plaintext[counter] ^ k;
}
return ciphertext;
}
public int[] decrypt(int[] ciphertext) {
return encrypt(ciphertext);
}
}
我有几个问题:
为什么纯文本int
在上面的代码中是数组?
当我测试此代码时,我得到奇怪的结果,有人可以向我解释吗?这里是我的代码要测试:
public class RC4_Main {
public static void main(String args[]) throws Exception {
String keyword = "hello";
byte[] keytest = keyword.getBytes(); //convert keyword to byte
int[] text = {1, 2, 3, 4, 5}; // text as 12345
RC4 rc4 = new RC4(keytest);
System.out.print("\noriginal text: ");
for (int i = 0; i < text.length; i++) {
System.out.print(text[i]);
}
int[] cipher = rc4.encrypt(text); //encryption
System.out.print("\ncipher: ");
for (int i = 0; i < cipher.length; i++) {
System.out.print(cipher[i]);
}
int[] backtext = rc4.decrypt(cipher); //decryption
System.out.print("\nback to text: ");
for (int i = 0; i < backtext.length; i++) {
System.out.print(backtext[i]);
}
System.out.println();
}
}
结果如下:(原始和返回文本不完全相同)为什么???
original text: 12345
cipher: 1483188254174
back to text: 391501310217
有几件事要注意:
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);
}
}
快乐的编码。
本文向大家介绍RC4文件加密的python实现方法,包括了RC4文件加密的python实现方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了RC4文件加密的python实现方法。分享给大家供大家参考。具体分析如下: 基于RC4流加密算法,使用扩展的16*16的S盒,32字节密钥。 目前应该是比较安全的。 刚学习python,好不容易调通了。 而且在VC和python下各实现了一遍,两
本文向大家介绍go语言使用RC4加密的方法,包括了go语言使用RC4加密的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了go语言使用RC4加密的方法。分享给大家供大家参考。具体分析如下: 这里需要使用rc4包来实现rc4加密,核心代码如下: 希望本文所述对大家的Go语言程序设计有所帮助。
本文向大家介绍python RC4加密操作示例【测试可用】,包括了python RC4加密操作示例【测试可用】的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python RC4加密操作。分享给大家供大家参考,具体如下: 运行结果: e79aaf7a42d9a1 esbdata 补充: 报错: ImportError: No module named Crypto.Cipher 解决方法:
import "crypto/rc4" rc4包实现了RC4加密算法,参见Bruce Schneier's Applied Cryptography。 type KeySizeError func (k KeySizeError) Error() string type Cipher func NewCipher(key []byte) (*Cipher, error) func (c *Ciph
我正在编写解析和分析PDF的代码,目前正在处理文档中的加密。我无法从规范中理解如何在两种可能的加密方法之间做出选择。PDF规范中的一些详细信息...加密字典的字段支持以下值: 1=7.6.2“通用加密算法”中的“算法1:使用RC4或AES算法加密数据”,加密密钥长度为40位;见下文。 2=(PDF 1.4)7.6.2“通用加密算法”中的“算法1:使用RC4或AES算法加密数据”,但允许加密密钥长度
问题内容: 我正在尝试学习如何使用Java进行基于密码的加密。我在网上找到了几个示例,但在Stack Overflow上还没有(到目前为止)。这些示例对我的解释不大,尤其是在算法选择方面。似乎有很多传递字符串来说明要使用什么算法,但是很少有关于字符串来自何处以及含义的文档。而且似乎不同的算法可能需要KeySpec类的不同实现,所以我不确定哪种算法可以使用我正在查看的PBEKeySpec类。此外,所