Я разработал утилиту для шифрования и дешифрования файла с помощью AES Encryption, и рукопожатие между получателем и отправителем выполняется в рамках RSA PKI Encryption.
Теперь у меня есть следующая последовательность шагов:
- Загрузить CSV.
- Создать га sh контента с закрытым ключом отправителя.
- Подпишите Ха sh с закрытым ключом отправителя.
- Сгенерируйте ключ Symmetri c и IV.
- Зашифруйте фактический файл CSV с помощью ключа Symmetri c, используя IV. с открытым ключом c получателя.
- ключ шифрования Symmetri c и IV.
Теперь на стороне получателя:
- Расшифровать га sh с ключом publi c отправителя.
- Проверка подписи с ключом publi c отправителя.
- Расшифровка ключа Symmetri c и IV с секретным ключом получателя.
- Дешифруйте действительный csv с ключом симметрии c и iv.
- Восстановите га 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() );