Дешифрование дает только одну правильную строку после шифрования строка за строкой с использованием алгоритма RC4 - PullRequest
0 голосов
/ 17 апреля 2019

Я должен зашифровать файл строка за строкой, используя алгоритм RC4.

Шифрование всего файла и дешифрование всего файла приводит к хорошему оригиналу.

Когда я пытаюсь прочитать файл по одной строке за раз, зашифруйте его, а затем запишите зашифрованную строку вfile, дешифрование полученного файла дает только одну правильную строку, которая является первой строкой исходного файла.

Я попытался прочитать файл и передать его в процедуру rc4, используя байтовый массив, размер которого кратен длине ключа, но результаты были одинаковыми.Вот моя попытка:

try
{
    BufferedReader br = new BufferedReader((new FileReader(fileToEncrypt)));                    
    FileOutputStream fos = new  FileOutputStream("C:\\Users\\nikaselo\\Documents\\Encryption\\encrypted.csv", true);
    File file = new File("C:\\Users\\nikaselo\\Documents\\Encryption\\encrypted.csv");
 // encrypt
    while ((line = br.readLine()) != null) 
    {
        byte [] encrypt = fed.RC4(line.getBytes(), pwd);

        if (encrypt != null) dos.write(encrypt);
            fos.flush();
    }

    fos.close();

// test decrypt
    FileInputStream fis = null;
    fis = new FileInputStream(file);
    byte[] input = new byte[512];
    int bytesRead;
    while ((bytesRead = fis.read(input)) != -1)
    {
        byte [] de= fed.RC4(input, pwd);
        String result = new String(de);
        System.out.println(result);
    }
}   
catch (Exception ex) 
{                                
    ex.printStackTrace();
}

, а вот моя функция RC4

public  byte []  RC4 (byte [] Str, String Pwd) throws Exception
{
    int[] Sbox = new int [256] ;
    int A, B,c,Tmp;;

    byte [] Key = {};
    byte [] ByteArray = {};

    //KEY
    if ((Pwd.length() == 0 || Str.length == 0)) 
    {
        byte [] arr = {};
        return arr;
    }
    if(Pwd.length() > 256) 
    {
        Key  = Pwd.substring(0, 256).getBytes();
    }
    else 
    {
        Key = Pwd.getBytes();
    }
    //String
    for( A = 0 ; A <= 255; A++ ) 
    {
        Sbox[A] = A;    
    }
    A = B = c= 0;
    for  (A = 0; A <= 255; A++) 
    {
        B = (B + Sbox[A] + Key[A % Pwd.length()]) % 256;    
        Tmp = Sbox[A];
        Sbox[A] = Sbox[B];
        Sbox[B] = Tmp;
    }

    A = B = c= 0;
    ByteArray = Str;
    for (A = 0; A <= Str.length -1 ; A++)
    {   
        B = (B + 1) % 256;
        c = (c + Sbox[B]) % 256;
        Tmp =  Sbox[B];
        Sbox[B] = Sbox[c];
        Sbox[c] = Tmp;
        ByteArray[A] = (byte) (ByteArray[A] ^ (Sbox[(Sbox[B] + Sbox[c]) % 256]));           
    }

    return ByteArray;
}

Выполнение этой команды дает мне одну чистую строку, а остальные просто не читаются.

1 Ответ

1 голос
/ 17 апреля 2019

Вы шифруете построчно, но пытаетесь расшифровать блоки по 512 байт.

Ваши параметры, как я понимаю, таковы:

  1. Шифрование и дешифрование в блоках фиксированного размера
  2. Дополните каждую строку до 512 байт (и разделите строки, которыедлиннее 512 байт)
  3. Введите разделитель.Это будет сложно, потому что потенциально любой разделитель может появиться в зашифрованном тексте, поэтому вы должны кодировать base64 каждую зашифрованную строку и отделять их переводом строки.

Вероятно, 1 - самый простой (и тот, который используется вреальное шифрование), но если у вас есть , чтобы сделать это построчно, я бы пошел с 3, даже если это представляет уязвимость, но это RC4, который больше не считается безопасным.

...