Поточный шифр на асм и операция ROL - Assembler

Узнай цену своей работы

Формулировка задачи:

Пишу поточный шифр на masm32 и си для, который представляет собой шифрование и расшифровку одним и тем же ключом, т.е. для крипта/декрипта используется одна и та же функция. Код на masm выглядит так:
.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
Но функция на асме неправильно расшифровывает данные, зашифрованные сишной функцией. Может, я что-то напутал с реализацией однобайтового rol на си? ROL:
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

Объяснение кода листинга программы

  1. Переменная esi содержит значение cData-1
  2. Переменная ecx содержит значение cSize
  3. Цикл Cycle выполняется до тех пор, пока не будет выполнено условие окончания цикла
  4. Внутри цикла выполняются следующие действия:
    • Переменная xorbyte увеличивается на единицу
    • Переменная xorbyte вычисляется по модулю 256 с использованием операции XOR и значения 0xAA
    • Переменная xorbyte сдвигается вправо на одну позицию с использованием операции ROL
    • Переменная al получает значение xorbyte
    • Выполняется операция XOR между значением переменной al и байтом, находящимся по адресу ecx+esi
  5. После выполнения цикла значение переменной al содержит результат шифрования

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.071 из 5
Похожие ответы