java RC4算法中的编码问题

xmd2e60i  于 2023-03-21  发布在  Java
关注(0)|答案(1)|浏览(100)

我必须做一个关于使用RC 4算法加密文本的小演示。为此,我选择在NetBeans中使用Java。
我的代码使用字节数组进行置换和异或运算。但是输入和输出都是String。
1.几乎我所有的输出,加密看起来像这样:“¯[á”.它正常吗?使用这个,我仍然可以找到纯文本,在这种情况下是“though”。
1.假设我正在尝试加密单词“stack”。我有时会得到以下形式的结果:“¹ [??ô”,然后在尝试解密时,我将得到:“s??ck”或“stÄck”。如果我的密钥和原始纯文本是法语的话,尤其会发生这种情况(这很糟糕,因为我是用法语做演示的)。
我试着改变编码字符,从UTF-8,到ISO-8859-1再到ASCII。我用ASCII得到了最好的结果。它给了我更少的问号,但有时会改变字符。

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!");
        }
        
    }
}
7gs2gvoe

7gs2gvoe1#

在注解中诊断。主要问题是密文包含无法打印的多毛字符,在复制和粘贴时会损坏。
推荐的解决方案:以十六进制显示密文。

相关问题