Всем привет. Вот шифрую текстовый файл, но 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
И еще, мне бы как-то сделать чтобы если в конце есть блок меньше тем, с которым работаем, чтобы нули не дописывались...