Метод .process
возвращает все новые фрагменты зашифрованного текста, которые были сгенерированы путем обработки открытого текста, заданного в качестве аргумента .process
, вместе с любым открытым текстом, оставшимся от более ранней операции шифрования.
В этом В этом случае алгоритм шифрования является AES. В частности, это AES-128, потому что ключ, используемый для создания шифратора, имеет длину 128 бит. AES-128 использует открытый текст в 128-битных (16-байтовых) блоках и испускает 128-битный (16 байт) зашифрованного текста для каждого блока открытого текста. Эта основанная на блоках обработка дает результаты, которые вы не понимали.
Что происходит с вашей программой:
var ciphertextPart1 = aesEncryptor.process("Message Part 1");
Зашифрователю дается 14 байтов ввода. Этого недостаточно, чтобы позволить ему генерировать блок зашифрованного текста, поэтому .process
возвращает пустой результат зашифрованного текста, который вы храните в ciphertextPart1
. Шифратор хранит необработанные 14 байтов внутри.
var ciphertextPart2 = aesEncryptor.process("Message Part 2");
Это дает шифратору еще 14 байтов. Он добавляет их к 14 байтам, оставшимся от предыдущего вызова, поэтому теперь он имеет в общей сложности 28 необработанных байтов. Он обрабатывает столько байтов, сколько может. То есть он обрабатывает первые 16 из этих байтов («Message Part1Me») и возвращает блок зашифрованного текста для тех 16 байтов, которые вы храните в cipherText2
. Шифратор теперь содержит 12 необработанных байтов.
var ciphertextPart3 = aesEncryptor.process("Message Part 3");
Это дает шифратору еще 14 байтов. Теперь у него 26 необработанных байтов. Он обрабатывает первые 16 из этих байтов («ssage Part2Mess») и возвращает блок зашифрованного текста для тех 16 байтов, которые вы храните в cipherText3
. Шифратор теперь содержит 10 необработанных байтов.
var ciphertextPart4 = aesEncryptor.finalize();
Это заставляет шифратор обрабатывать любые необработанные байты. Он может работать только с 16-байтовыми блоками, поэтому он добавляет 6 байтов заполнения к оставшимся 10 необработанным открытым текстовым байтам («возрастная часть 3»), шифрует этот блок и возвращает зашифрованный текст для этого блока. Вы сохраняете этот блок зашифрованного текста как ciphertextPart4
.
И теперь вы расшифровываете блоки зашифрованного текста.
var plaintextPart1 = aesDecryptor.process(ciphertextPart1);
cipherTextPart1
был пустым блоком, поэтому plaintextPart1
будет пустым и, очевидно, расшифровщик не будет хранить необработанный зашифрованный текст.
var plaintextPart2 = aesDecryptor.process(ciphertextPart2);
cipherTextPart2
содержал зашифрованную версию первых 16 байт открытого текста, поэтому plaintextPart2
будет содержать «Message Part 1Me». Ввод зашифрованного текста был ровно 16 байтов, поэтому расшифровщик не содержит необработанного зашифрованного текста.
var plaintextPart3 = aesDecryptor.process(ciphertextPart3);
cipherTextPart3
содержал зашифрованную версию следующих 16 байтов открытого текста, поэтому plaintextPart3
будет содержать "ssage Часть 2 И снова расшифровщик не содержит необработанного зашифрованного текста.
var plaintextPart4 = aesDecryptor.process(ciphertextPart4);
cipherTextPart4
содержал зашифрованную версию последних 10 байтов открытого текста, поэтому plaintextPart3
будет содержать «age Part 3». В расшифровщике не осталось необработанного зашифрованного текста.
var plaintextPart5 = aesDecryptor.finalize();
В расшифровщике не осталось необработанного зашифрованного текста, поэтому finalize
не нужно выполнять, а plaintextPart5
будет пустым.