Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2015, 14:19   #1
cooljedi
Пользователь
 
Регистрация: 20.03.2015
Сообщений: 10
По умолчанию xtea барахлит

Всем привет. Вот шифрую текстовый файл, но xtea почему-то барахлит, после расшифровки вот символ "а" становится "f" (66)... Посмотрите пожалуйста код

Код:
#include <iostream>
#include <fstream>
#include <stdint.h>

using namespace std;

uint32_t key[8] = {0xA24CB43C,0x123B4344,0xE7544930,0x554834AC,0x554834AC,0x554834AC,0x554834AC,0x554834AC};

#define BLOCK_SIZE 16

uint32_t rol(uint32_t base, uint32_t shift)
{
	uint32_t res;
        /* only 5 bits of shift are significant*/
        shift &= 0x1F;
        res = (base << shift) | (base >> (32 - shift));
        return res;
}

void xtea3_encipher(unsigned int num_rounds,uint32_t *v, uint32_t const *k)
{
	unsigned int i;
	uint32_t a, b, c, d, sum=0, t,delta=0x9E3779B9;
	sum = 0;
	a = v[0] + k[0];
	b = v[1] + k[1];
	c = v[2] + k[2];
	d = v[3] + k[3];
	for (i = 0; i < num_rounds; i++){
		a += (((b << 4) + rol (k[(sum % 4) + 4], b)) ^
			(d + sum) ^ ((b >> 5) + rol (k[sum % 4], b >> 27)));
		sum += delta;
	        c += (((d << 4) + rol (k[((sum >> 11) % 4) + 4], d)) ^
			(b + sum) ^ ((d >> 5) + rol (k[(sum >> 11) % 4], d >> 27)));
	        t = a;a = b;b = c;c = d;d = t;
	}
	v[0] = a ^ k[4];
	v[1] = b ^ k[5];
	v[2] = c ^ k[6];
	v[3] = d ^ k[7];
}

void xtea3_decipher(unsigned int num_rounds,uint32_t *v, uint32_t const *k)
{
    unsigned int i;
    uint32_t a, b, c, d, t,delta=0x9E3779B9,sum = delta * num_rounds;
	d = v[3] ^ k[7];
	c = v[2] ^ k[6];
	b = v[1] ^ k[5];
	a = v[0] ^ k[4];
	for (i = 0; i < num_rounds; i++){
		t = d;d = c;c = b;b = a;a = t;
		c -= (((d << 4) + rol (k[((sum >> 11) % 4) + 4], d)) ^
			(b + sum) ^ ((d >> 5) + rol (k[(sum >> 11) % 4], d >> 27)));
          	sum -= delta;
		a -= (((b << 4) + rol (k[(sum % 4) + 4], b)) ^
			(d + sum) ^ ((b >> 5) + rol (k[sum % 4], b >> 27)));
	 }
	v[3] = d - k[3];
	v[2] = c - k[2];
	v[1] = b - k[1];
	v[0] = a - k[0];
}

void crypto(char filename[], bool decrypt){
      fstream dat(filename, ios::in | ios::out | ios::binary);
      if(!dat) cout << "invalid fstream" << endl;

      unsigned size;
    
      dat.seekg(0,ios::end);
      size=dat.tellg();
      dat.seekg(ios::beg);
    
      dat.clear();
    
      unsigned pos;
    
      int n_blocks=size/BLOCK_SIZE;
      if(size%BLOCK_SIZE!=0)
          ++n_blocks;
    
      for(int i=0; i<n_blocks; i++) {
          unsigned char data[BLOCK_SIZE];
          pos = dat.tellg();
      
          dat.read((char*)data, BLOCK_SIZE);
      
          if(decrypt) xtea3_encipher(48,(uint32_t*)data,key);
          else xtea3_decipher(48,(uint32_t*)data,key);
        
          dat.seekp(pos);
          dat.write((char*)data,BLOCK_SIZE);

          memset(data,0,BLOCK_SIZE);
      }
      dat.close();
}

int main(int argc, char *argv[]){
    if (argc < 2) {
        fprintf(stderr, "Set the file name\n", argv[0]);
        return 1;
    }

    //crypto(argv[1], true);    // enctypt
    crypto(argv[1], false); // dectypt
    cout << "Done. The file " << argv[1] << " rewrited." << endl;

   system("pause");               
   return 0;
}
Функции взяты с вики https://ru.wikipedia.org/wiki/XTEA
И еще, мне бы как-то сделать чтобы если в конце есть блок меньше тем, с которым работаем, чтобы нули не дописывались...
cooljedi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сеть, модем, звук барахлит немножко HellMercenariess Компьютерное железо 1 20.09.2012 16:48
rand() барахлит !!!!! интеграл Помощь студентам 2 18.03.2010 00:59