我必须做一个关于使用RC 4算法加密文本的小演示。为此,我选择在NetBeans中使用Java。
我的代码使用字节数组进行置换和异或运算。但是输入和输出都是String。
1.几乎我所有的输出,加密看起来像这样:“¯[á”.它正常吗?使用这个,我仍然可以找到纯文本,在这种情况下是“though”。
1.假设我正在尝试加密单词“stack”。我有时会得到以下形式的结果:“¹ [??ô”,然后在尝试解密时,我将得到:“s??ck”或“stÄck”。如果我的密钥和原始纯文本是法语的话,尤其会发生这种情况(这很糟糕,因为我是用法语做演示的)。
我试着改变编码字符,从UTF-8,到ISO-8859-1再到ASCII。我用ASCII得到了最好的结果。它给了我更少的问号,但有时会改变字符。
- 这是一个奇怪的字符返回的例子
- This is an example of strange character returns
- But just like I said, you can get the text back
- 相同的代码。只是改变了法语的打印句子,并使用法语单词进行加密,但有一个问号
- Same code. Just changed the print sentences in french, and used french words for encryption, but there is a question mark
- We went from "saisir" to "saiÎir"
我的RC 4类代码*用于加密和解密文本 *
public class RC4
{
private int[] S =new int[256];
private int[] T =new int[256];
private int keylen;
public RC4(byte[] key)
{
if (key.length < 1 || key.length > 256) {
throw new IllegalArgumentException("La clé doit avoir entre 1 et 256 bytes");
}
else
{
keylen = key.length;
for (int i = 0; i < 256; i++) //initialisation de S et T
{
S[i] = i;
T[i] = (int)key[i % keylen];
}
int j = 0;
for (int i = 0; i < 256; i++) //Premiere permutation de S qui utilise la clé
{
j = (j + S[i] + T[i]) % 256;
int temp = S[i];
S[i] = S[j];
S[j] = temp;
}
}
}
public byte[] chiffrer(byte[] plaintext)
{
int i = 0;
int j = 0;
byte[] ciphertext = new byte[plaintext.length];// texte et cryptogramme ont la même longueur
for (int k = 0; k < plaintext.length; k++) //seconde permutation, n'utilisant que des procédés mathématiques sans l'intervention de la clé
{
i = (i + 1) % 256;
j = (j + S[i]) % 256;
int temp = S[i];
S[i] = S[j];
S[j] = temp;
int t = (S[i] + S[j]) % 256;
int keystream = S[t];
byte keyByte = (byte)keystream;
ciphertext[k] = (byte)(plaintext[k] ^ keyByte ); //Pour l'opération XOR
}
return ciphertext;
}
public byte[] dechiffrer(byte[] ciphertext)
{
return chiffrer(ciphertext); // Le chiffrement et le déchiffrement se font exactement de la même manière
}
}
我的主类
public class testRC4
{
public static void main(String args[])
{
Scanner scanner = new Scanner(System.in);
System.out.println("Saisir la clé secrète:");
String keyText = scanner.nextLine();
byte[] key = keyText.getBytes();
RC4 rc = new RC4(key);
System.out.println("Entrer a pour chiffrer et b pour déchiffrer:");
String choice = scanner.nextLine();
if (choice.equals("a"))
{
System.out.println("Saisir le mot à chiffrer:");
String plainText = scanner.nextLine();
byte[] plain = plainText.getBytes();
byte[] cipher = rc.chiffrer(plain);
String cipherText = new String(cipher);
System.out.println("Le cryptogramme : " +cipherText);
}
else if(choice.equals("b"))
{
System.out.println("Saisir le mot à déchiffrer :");
String cipherText = scanner.nextLine();
byte[] cipher = cipherText.getBytes();
byte[] plain = rc.chiffrer(cipher);
String plainText = new String(plain);
System.out.println("Le texte en clair : " +plainText);
}
else
{
System.out.println("Le choix fait n'est pas reconnu. Veuillez recommencer!");
}
}
}
1条答案
按热度按时间7gs2gvoe1#
在注解中诊断。主要问题是密文包含无法打印的多毛字符,在复制和粘贴时会损坏。
推荐的解决方案:以十六进制显示密文。