Поточный шифр на асм и операция ROL - Assembler
Формулировка задачи:
Пишу поточный шифр на masm32 и си для, который представляет собой шифрование и расшифровку одним и тем же ключом, т.е. для крипта/декрипта используется одна и та же функция. Код на masm выглядит так:
Ту же самую функцию я переписал на си, возможно, с ошибками:
Но функция на асме неправильно расшифровывает данные, зашифрованные сишной функцией. Может, я что-то напутал с реализацией однобайтового rol на си?
ROL:
Перепроверил - вроде, все правильно.
.data? xorbyte db ? .code ; cData - pointer to data, cSize - size of data crypt PROC cData : PCHAR, cSize : DWORD mov eax, cData .WHILE cSize > 0 inc xorbyte xor xorbyte, 0AAh rol xorbyte, 1 mov cl, xorbyte xor byte ptr [eax], cl inc eax dec cSize .ENDW ret crypt ENDP
#ifdef _SIMCRYPT_ void crypt(PCHAR cData, DWORD cSize) { CHAR xorbyte = 0; while(cSize--) { xorbyte++; xorbyte ^= 0xAA; xorbyte = ((xorbyte & 0x80) ? ((xorbyte << 1) | 0x01) : (xorbyte << 1)); *cData ^= xorbyte; cData++; } } #endif
xorbyte = ((xorbyte & 0x80) ? ((xorbyte << 1) | 0x01) : (xorbyte << 1));
ПРОБЛЕМА РЕШЕНА
Неправильно был реализован rol (здесь он реализован верно). В конфиге программы на асме я просто забыл настроить использование нужной функции шифрования.Решение задачи: «Поточный шифр на асм и операция ROL»
textual
Листинг программы
mov esi,cData-1 mov ecx,cSize @Cycle: inc xorbyte xor xorbyte,0AAh rol xorbyte,1 mov al,xorbyte xor byte [ecx+esi],al loop @Cycle
Объяснение кода листинга программы
- Переменная
esi
содержит значениеcData-1
- Переменная
ecx
содержит значениеcSize
- Цикл
Cycle
выполняется до тех пор, пока не будет выполнено условие окончания цикла - Внутри цикла выполняются следующие действия:
- Переменная
xorbyte
увеличивается на единицу - Переменная
xorbyte
вычисляется по модулю 256 с использованием операции XOR и значения 0xAA - Переменная
xorbyte
сдвигается вправо на одну позицию с использованием операции ROL - Переменная
al
получает значениеxorbyte
- Выполняется операция XOR между значением переменной
al
и байтом, находящимся по адресуecx+esi
- Переменная
- После выполнения цикла значение переменной
al
содержит результат шифрования
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д