/** @details GOST_Crypt_G_Data Шифрование\Расшифрования блока данных в режиме гаммирования. @param *Data - Указатель на данные для шифрования\расшифрования, также сюда заносится результат работы. @param Size - Размер данных @param *Synchro - Указатель на синхопросылку, также сюда заносится текущее значение синхропосылки. @param *GOST_Table - Указатель на таблицу замены ГОСТ(ДК) в 128 байтном формате(вместо старшого полубайта 0). @param *GOST_Key - Указатель на 256 битный массив ключа(СК). @attention Синхропосылка Synchro для первого вызова должна быть подготовлена функцией/макросом GOST_Crypt_G_PS. */ void GOST_Crypt_G_Data(uint8_t *Data, uint32_t Size, uint8_t *Synchro, uint8_t *GOST_Table, uint8_t *GOST_Key ) { GOST_Data_Part *S=(GOST_Data_Part *)Synchro; GOST_Data_Part Tmp; uint8_t i; while(Size!=0) { (*S).half[_GOST_Data_Part_N1_Half]+=_GOST_C0; _GOST_ADC32((*S).half[_GOST_Data_Part_N2_Half],_GOST_C1,(*S).half[_GOST_Data_Part_N2_Half]);//_GOST_Data_Part_HiHalf Tmp=*S; GOST_Crypt_32_E_Cicle(&Tmp,GOST_Table,(uint32_t *)GOST_Key); #if _GOST_ROT==1 Tmp.half[_GOST_Data_Part_N2_Half]=_SWAPW32(Tmp.half[_GOST_Data_Part_N2_Half]); Tmp.half[_GOST_Data_Part_N1_Half]=_SWAPW32(Tmp.half[_GOST_Data_Part_N1_Half]); #endif for (i=0;i<_Min(_GOST_Part_Size,Size);i++) { *Data^=Tmp.parts[i]; Data++; } Size-=i; } }
void GOST_ENCRYPTED_GAMMA(BYTE *Data, DWORD Size, BYTE *SyncPack, BYTE *GOST_Table, DWORD *GOST_Key){ GOST_PART_DATA *SYNCP = (GOST_PART_DATA *)SyncPack; //Приведем к 64битному формату синхропосылку GOST_PART_DATA tmp; //Временная переменная для синхропосылки BYTE i; //Переменная цикла while (Size != 0){ //Цикл по данным (*SYNCP).half[_GOST_PART_DATA_N1_HALF] += _GOST_C0; //Прибавление константы С0 _GOST_ADC32((*SYNCP).half[_GOST_PART_DATA_N2_HALF], _GOST_C1, (*SYNCP).half[_GOST_PART_DATA_N2_HALF]); //Суммирование tmp = *SYNCP; // GOST_ENCRYPTED_32_CICLE(&tmp, GOST_Table, (DWORD*)GOST_Key); //Гаммирование. #if _GOST_COMPATIBILITY_STANDART == 1 tmp.half[_GOST_PART_DATA_N2_HALF] = _SWAPW32(tmp.half[_GOST_PART_DATA_N2_HALF]); tmp.half[_GOST_PART_DATA_N1_HALF] = _SWAPW32(tmp.half[_GOST_PART_DATA_N1_HALF]); #endif for (i = 0; i < _MINIMUM(_GOST_PART_SIZE, Size); i++){ //Цикл прохода по данным *Data ^= tmp.parts[i]; //Побитовый XOR с частями в 8ми битном представлении Data++; //Уведичиваем данные } //Конец FOR Size -= i; //Уменьшаем размер на порцию } //Конец While }