При использовании cryptoJS для шифрования и дешифрования сообщений в AES (режим CTR) алгоритм AES использует значение nonce (Number Once), чтобы запутать блок потока и предотвратить атаки повторного воспроизведения. В cryptoJS, чтобы настроить одноразовый номер:
const cli_verify = CryptoJS.AES.encrypt(CryptoJS.enc.Latin1.parse(originalString), key, {
mode: CryptoJS.mode.CTR,
iv: iv,
padding: CryptoJS.pad.NoPadding
});
Точно так же вы можете использовать тот же подход при расшифровке ваших сообщений:
const decryptedString = CryptoJS.AES.decrypt(encryptedStringB64, key, {
mode: CryptoJS.mode.CTR,
iv: iv,
padding: CryptoJS.pad.NoPadding
}).toString(CryptoJS.enc.Latin1);
НО: если вы делаете это, вам нужно отслеживать одноразовый номер самостоятельно. Это а) боль и б) действительно сложно, если вы начинаете иметь дело с сообщениями переменного размера (т.е. не кратного 16 байтам).
Я разобрал библиотеку AES, с которой разговариваю, и выяснил, как работают счетчик одноразовых номеров и смещение. По сути, если вы начнете отправлять очень маленькие сообщения, например, 4 байта, 4 байта будут расшифрованы с использованием первых 4 байтов потока, а смещение будет увеличено до 4, чтобы отслеживать это. Если затем шифруются 6 байтов, используются следующие 6 байтов потока (без увеличения одноразового номера), а смещение обновляется до 10... Если следующая передача составляет 143 байта, вы можете видеть, как это начинает усложняться. реализовать себя. Используются последние 6 байтов текущего потока, увеличивается одноразовый номер и так далее.
Мой вопрос: как заставить CryptoJS обрабатывать это для вас во время сеанса. Я пытался установить IV, заполнение и режим в первом вызове, а затем оставить его пустым в следующем, но это не работает. Это потрясающая библиотека, и я уверен, что она там есть. Просто непонятно, как его использовать.