AES - разница в расшифрованных данных - PullRequest
0 голосов
/ 18 апреля 2020

Я разработал утилиту для шифрования и дешифрования файла с помощью AES Encryption, и рукопожатие между получателем и отправителем выполняется в рамках RSA PKI Encryption.

Теперь у меня есть следующая последовательность шагов:

  1. Загрузить CSV.
  2. Создать га sh контента с закрытым ключом отправителя.
  3. Подпишите Ха sh с закрытым ключом отправителя.
  4. Сгенерируйте ключ Symmetri c и IV.
  5. Зашифруйте фактический файл CSV с помощью ключа Symmetri c, используя IV. с открытым ключом c получателя.
  6. ключ шифрования Symmetri c и IV.

Теперь на стороне получателя:

  1. Расшифровать га sh с ключом publi c отправителя.
  2. Проверка подписи с ключом publi c отправителя.
  3. Расшифровка ключа Symmetri c и IV с секретным ключом получателя.
  4. Дешифруйте действительный csv с ключом симметрии c и iv.
  5. Восстановите га sh расшифрованного содержимого файла и сопоставьте с дешифрованным га sh.

Теперь все мои шаги работают в соответствии с требованиями, но хэши не совпадают ... когда я беру разность простого текста csv и расшифрованного csv. Они имеют разницу только в 1-ю строку.

ПЕРВАЯ ЛИНИЯ PLAIN-ТЕКСТА CSV

ICI,ICI-DIV1,,,,,,,,,,[Space]
[Next Line]

ПЕРВАЯ ЛИНИЯ ДЕКРИПИРОВАННОГО CSV

ICIŽICI-DIV1,,,,,,,,,,[Content of second line and so on..]

Теперь вы можете видеть разницу только в первой строке с пробелом и разделителем строк в конце строки, а 4-й символ довольно сильно отличается в обоих.

Я думаю, это из-за IV или какого-либо разделения строк. Однако, 4-й символ - это какая-то проблема кодирования.

Может кто-то определить и предложить?

КОД ШИФРОВАНИЯ ИСПОЛЬЗУЕТСЯ ДЛЯ ШИФРОВАНИЯ ФАЙЛА С ИСПОЛЬЗОВАНИЕМ SYMMETRI C KEY

// Read content from CSV file..
    public String readCsv ( String file ) {

        // String builder to read all lines in one string..
        StringBuilder sb = new StringBuilder();

        // Line variable to hold each line data..
        String line = EMPTY_STRING;

        try {

            // Read CSV file.. 
            BufferedReader br = new BufferedReader( new FileReader( file ) );

            // Read each line and append it to String builder
            while ( ( line = br.readLine() ) != null ) {
                sb.append( line );
                sb.append( "\n" );
            }
            br.close();
        }

        // In case of exception..
        catch ( Exception e ) {

            System.out.println( "Exception in reading csv = " + e );

        }

        return sb.toString();
    }

String encryptedPaymentFile = AESEncryptFile(  contentOfFile.getBytes( "UTF-8" ) , AESParams.getKey(), AESParams.getIV() );

String contentOfFile = readCsv( encryptedFilePath ) ;

// Function to encrypt the file with AES Algorithm..
    public static String AESEncryptFile( byte[] input, SecretKeySpec key, byte[] initVector )  {

        // Initialize Cipher variable and encryption variable..
        Cipher cipher = null;
        byte[] cipherInBytes = null;

        try {

            /* 1. Set the cipher to AES Algorithm, CBC Mode and PKC5 Padding scheme..
             * 2. Set the Cipher mode to encryption using key and initVector..
             * 3. Get the encrypted text 
             * 4. return the cipher text with base64 encoding..
             */
            cipher = Cipher.getInstance( "AES/CBC/PKCS5Padding" );
            IvParameterSpec ivSpec = new IvParameterSpec( initVector );
            cipher.init( Cipher.ENCRYPT_MODE, key, ivSpec );
            cipherInBytes = cipher.doFinal( input );

            return Base64.getEncoder().encodeToString( cipherInBytes );

        }

        // In case of exception..
        catch ( Exception e ) {

            System.out.println( "Exception in Main File Encryption " + e ); 

        }

        return Base64.getEncoder().encodeToString( cipherInBytes );

    }

DECRYPTION CODE

public static String decrypt ( byte[] cipherText, SecretKeySpec key, byte[] IV ) throws Exception
    {
        //Get Cipher Instance
        Cipher cipher = Cipher.getInstance( "AES/CBC/PKCS5Padding" );

        //Create IvParameterSpec
        IvParameterSpec ivSpec = new IvParameterSpec( IV );


        //Initialize Cipher for DECRYPT_MODE
        cipher.init( Cipher.DECRYPT_MODE, key, ivSpec );

        byte[] decodedData = Base64.getDecoder().decode( cipherText );

        String decryptedData = new String( cipher.doFinal( decodedData ) );

        return decryptedData;
    }

symmetricKey = RSADecrypt( keyFileInBytes, "Key");
            initializationVector = RSADecrypt( ivFileInBytes, "Key");

            if ( symmetricKey.equalsIgnoreCase( EMPTY_STRING ) || 
                    initializationVector.equalsIgnoreCase( EMPTY_STRING ) ) {

                System.out.println( "Decryption of IV / KEY Failed .. " );

                generateOutput( "Decryption of .Key files Failed.." , true);

                return;

            } 
            System.out.println( "Key and IV has been decrypted.."); 

SecretKeySpec symmKey = new SecretKeySpec( symmetricKey.getBytes(), "AES" );

            decryptedMainFile = decrypt( encryptedFileInBytes, symmKey, initializationVector.getBytes() );
...