При использовании crypto JS для шифрования и дешифрования сообщений в AES (режим CTR) алгоритм AES полагается на значение nonce (Number Once), чтобы запутать ваш блок потока и предотвратить атаки воспроизведения. В crypto JS, чтобы установить одноразовый номер:
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 байтов текущего потока, увеличивается одноразовый номер и так далее.
Мой вопрос: как заставить Crypto JS обработать это для вас во время сеанса. Я попытался установить IV, отступ и режим в первом вызове, а затем оставить его пустым в следующем вызове, но это не работает. Это потрясающая библиотека, и я уверен, что она там. Просто не очевидно, как его использовать.