Форум программистов, компьютерный форум CyberForum.ru

Алгоритм шифрования XTEA - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
uiop
0 / 0 / 0
Регистрация: 24.05.2013
Сообщений: 7
24.05.2013, 01:46     Алгоритм шифрования XTEA #1
При построении решения, ошибок не выдает. Все работает. Вопрос вот в чем: при шифровании даже одной буквы, шифр текст выводится длиной 64 символа. При шифровании двух букв - так же и т.д. Но меняются лишь первые 16 символов, следующие всегда остаются одинаковыми. Не могу понять это ошибка? И разве шифр текст по длине не должен быть равен исходному тексту?

Например(исходный текст - шифр):
a - 11b69c7592fc8f508f90d87169c3e5528f90d87169c3e5528f90d87169c3e552
aa - 2273e48f111bfbcd8f90d87169c3e5528f90d87169c3e5528f90d87169c3e552
0 - aeec27833e9a9d438f90d87169c3e5528f90d87169c3e5528f90d87169c3e552
hello, world! - f468735bdfa7ca5f8f90d87169c3e5528f90d87169c3e5528f90d87169c3e552 (и в этом случае расшифровывает только текст до пробела: hello,)

программный текст:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include "stdafx.h"
 
#include <iostream>
#include <fstream>
#include <stdint.h>
using namespace std;
 
 
unsigned int key[4]={0xFDA5,0xD54E,0xFC00,0xB55A}; // encryption key
 
#define BLOCK_SIZE 8
void xtea_encipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {
    unsigned int i;
    uint32_t v0=v[0], v1=v[1], sum=0, delta=0x9E3779B9;
    for (i=0; i < num_rounds; i++) {
        v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
        sum += delta;
        v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
    }
    v[0]=v0; v[1]=v1; 
 
 
}
 
void xtea_decipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {
    unsigned int i;
    uint32_t v0=v[0], v1=v[1], delta=0x9E3779B9, sum=delta*num_rounds;
    for (i=0; i < num_rounds; i++) {
        v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
        sum -= delta;
        v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
    }
    v[0]=v0; v[1]=v1;
}
void StringCrypt(char *inout,int len,bool encrypt)
{
  for(int i=0;i<len/BLOCK_SIZE;i++)
    {
      if(encrypt)
          xtea_encipher(32,(uint32_t*)(inout+(i*BLOCK_SIZE)),key);
      else
          xtea_decipher(32,(uint32_t*)(inout+(i*BLOCK_SIZE)),key);
    }
  if(len%BLOCK_SIZE!=0)
    {
        int mod=len%BLOCK_SIZE;
        int offset=(len/BLOCK_SIZE)*BLOCK_SIZE;
        char data[BLOCK_SIZE];
        memcpy(data,inout+offset,mod);
 
        if(encrypt)
            xtea_encipher(32,(uint32_t*)data,key);
        else
            xtea_decipher(32,(uint32_t*)data,key);
 
        memcpy(inout+offset,data,mod);
    }
}
 
 
  int main()
{
    char str[32]= {0};
cout<<"Enter a text to crypt: ";
cin>>str;
cout<<endl;
int len=sizeof(str);
 
StringCrypt(str,len,true);
int i2[32];
cout.unsetf(ios::dec);
cout.setf(ios::hex);
cout<<"Encrypted string: ";
for(int i=0;i<len;i++)
{
i2[i] = (unsigned char)str[i];
cout<<i2[i];
}
cout<<endl;
 
StringCrypt(str,len,false);
 
cout<<"Decrypted string: ";
cout<<str<<endl;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.05.2013, 01:46     Алгоритм шифрования XTEA
Посмотрите здесь:

Алгоритм шифрования Рабина C++
C++ Алгоритм шифрования по ГОСТу
C++ Алгоритм шифрования DES
C++ Алгоритм шифрования из exe файла
C++ Алгоритм шифрования Anubis
алгоритм шифрования MISTY1 C++
C++ Алгоритм шифрования ГОСТ 28147-89
Алгоритм шифрования RSA C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kukurudza
105 / 86 / 6
Регистрация: 29.08.2012
Сообщений: 539
24.05.2013, 13:40     Алгоритм шифрования XTEA #2
ну так гугл в помощь. искать какой принцип работу именно у данного алгоритма. есть разные типы шифраторов. есть те, которые строят:
1. хеши - последовательность символов на входе (любая длина) - последовательность символов на выходе (определенная длина, например 64 бита);
2. те которые кодируют последовательности, например гаммой - сколько символов на входе, столько символов на выходе + плюс ключ гамма;
3. те которые кодируют последовательности блоками, зависящими/независящими от предыдущих. на входе последовательность любая, на выходе блоки, целые или обрезанные в конце.
мне на самом деле лень читать ваш алгоритм, но закодил я их года два назад целую кучу.
ну на вскидку у вас третий тип. то что получается одинаковый хвост - может быть как правильно так и не правильно смотря что за алгоритм
а вообще ручка + бумажка + алгоритм = счастье
Yandex
Объявления
24.05.2013, 13:40     Алгоритм шифрования XTEA
Ответ Создать тему
Опции темы

Текущее время: 15:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru