Шифрование XTEA

megarak
Offline
Зарегистрирован: 03.05.2016

Добрый день||вечер||утро, уважаемые форумчане! Туплю неимоверно. 

Нужно произвести шифрование строки типа string методом xtea.

Есть такой код .

 void xtea_encipher(unsigned int num_rounds, uint32_t *v, uint32_t const *k) {
    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 + k[sum & 3]);
        sum += delta;
        v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]);
    }
    v[0]=v0; v[1]=v1;
}

Не пойму: 
1. как из стринга получить цифровую переменную uint32_t?
2. что делать, если текст меньше 64 бит? (и как вообще узнать сколько бит занимает текст)

Ответы типа - "гугл в помощь", "это же легко и понятно" прошу оставить при себе.

Если кто приведет готовый кусок кода с шифрованием string, формированием ключей - буду очень благодарен. Или же объясните в понятном и подробном виде.

Заранее спасибо всем ответившим

megarak
Offline
Зарегистрирован: 03.05.2016

А вообще, есть библиотеки, которые шифруют текст каким-то алгоритмом?

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

wdrakula, Вы, судя по всему, неплохой специалист, но не превращайтесь в Клапауция! Удалил пост. 

megarak
Offline
Зарегистрирован: 03.05.2016

Я пропустил весь экшн?) Что мне ответили?

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Две минуты поиска в гугл и сразу готовый пример: http://www.cplusplus.com/forum/general/58133/

Не нравится мой ответ, держите своё "не нравится" при себе.

 

megarak
Offline
Зарегистрирован: 03.05.2016

Все хорошо, почему же. Спасибо. Ну вот как вы ищите так? Читеры.

Слепил такой скетч. 

#include <SPI.h>
#include <WString.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);
    }
}

void setup() 
{
  
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  Serial.println("dozhdalis port");

  char str[]={"Hello, world!"};
  int len=strlen(str)+1; // length of the string including null character

  StringCrypt(str,len,true);

  
  Serial.println("Encrypted string:");
   Serial.println(str);

  StringCrypt(str,len,false);

  Serial.println("Decrypted string:");
   Serial.println(str);

}

void loop() {
  // put your main code here, to run repeatedly:

}


Выходит ошибка в этой строке xtea_encipher(32,(uint32_t*)(inout+(i*BLOCK_SIZE)),key);

И плохо понимаю, как происходит конвертация

 

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Мм...ошибка...информативненько.

Приведите текст ошибки.

megarak
Offline
Зарегистрирован: 03.05.2016

Ой, извиняюсь. Про текст ошибки забыл)

cannot convert 'unsigned int*' to 'const uint32_t* {aka const long unsigned int*}' for argument '3' to 'void xtea_encipher(unsigned int, uint32_t*, const uint32_t*)'

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

строка 06 - замените unsigned int на const uint32_t

megarak
Offline
Зарегистрирован: 03.05.2016

Компиляция успешна. Спасибо большое. Сейчас попробую затестить)))

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Если получится, просьба выложить скетч, может кому поможет.
При поиске набирал что то типа "XTEA C++" и нашлось не в первой ссылке, конечно. Плюс сначала Вики почитал, поскольку с таким шифрованием не знаком.

megarak
Offline
Зарегистрирован: 03.05.2016

Успешным оказался этот вариант. Все работает. Правда не разобрался еще с кодом да и с самим шифром нормально. 

#include <SPI.h>
#include <WString.h>

using namespace std;

const uint32_t 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);
    }
}

void setup() 
{
  
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  Serial.println("dozhdalis port");

  char str[32]={"Hello, word!"};//должно быть кратно размеру блока
  //int len=strlen(str)+1; // length of the string including null character
  int len = sizeof(str);

  StringCrypt(str,len,true);

  
  Serial.println("Encrypted string:");
   Serial.println(str);

  StringCrypt(str,len,false);

  Serial.println("Decrypted string:");
   Serial.println(str);


}

void loop() {
  // put your main code here, to run repeatedly:

}

 

megarak
Offline
Зарегистрирован: 03.05.2016

И все же.

xtea_encipher(32,(uint32_t*)(inout+(i*BLOCK_SIZE)),key);

Как тут у нас char в uint32_t умудряется превратиться?

megarak
Offline
Зарегистрирован: 03.05.2016

Попробовал так в вижуал студио:

char str[16]={"Hello, world!"};
uint32_t roww = (uint32_t)str;
cout<<roww<<endl;

Каждый раз выдает разные семизначные цифры. Что это вообще? И как тогда он каждый раз одинаково шифрует и расшифровывает?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Ярик! Вот Вам не пришелся мой, ну и Клапауция тоже, метод воспитания?

Тогда ищите  желающего отвечать на это:

megarak пишет:

Попробовал так в вижуал студио:

char str[16]={"Hello, world!"};
uint32_t roww = (uint32_t)str;
cout<<roww<<endl;

Каждый раз выдает разные семизначные цифры. Что это вообще? И как тогда он каждый раз одинаково шифрует и расшифровывает?

Ну или сами, раз Вы нам продемострировани истино христианское терпение и милосердие...

==========================

Автору на вопрос: "Что это вообще?" - все таки отвечу, не совсеми же я зверь: это указатели, сэр (подпорченные слегка). Вот так они выглядят "не одетыми". Это не стыдно - подглядывать за ними. ;) Так все делали...в юности.

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Метод воспитания?

В Вашем посте было строчки 2-3 объяснений. В остальных вы, скажем так, чихвостили ТС.

Да, ТС разбирается не очень от слова совсем. Но (почти) все люди обучаемы, и ТС, ИМХО, в круг таких водит.

2megarak: Читайте http://people.toiit.sgu.ru/Sinelnikov/PT/C/Kern_Ritch.pdf - будет меньше нелепых вопросов)

megarak
Offline
Зарегистрирован: 03.05.2016

Спасибо всем за объяснения.

Тут есть 2 стороны. Конечно самому разбираться хорошо и полезно - перерыв кучу инфы и перепробовав кучу примеров все таки доходишь до истины.

Но лично у меня такая ситуация - на то чтобы понять элементарную вещь порой уходит несколько суток. Потом очень жаль потерянного времени, а сейчас его вообще нет. А эту же элементарщину понимающий человек мог бы толково объяснить за 5-10 минут или за пару предложений, если бы действительно захотел.

Если бы 5 лет назад у меня не было предмета "алгоритмизация" и я бы захотел научиться писать программы, то я бы бросил это дело через пару дней. Просто не знаешь с чего начать, некому направить. Простые термины тебе не понятны в силу того, что нормальных объяснений их нет. А те, которые есть, вводят незнающего еще в большее заблуждение.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Во-первых. Если человек не знает буквы, то ему даже академик не сможет объяснить что означает определенное сочетание букв. Объяснять, что такое if или for -  пустая трата времени, море информации в интернете.

Во-вторых. 5-10 минут, на одного, а вас таких "учеников" даже если не сотня, а десяток, и где взять на всех эти 5-10 минут? (только не надо говорить, что 1-2 часа в день - это немного). Риторический вопрос, поскольку ответ тоже простой, нет такого времени, ни у кого, а если есть, то лично я лучше его потрачу на себя, почитаю что нибудь новое, поучусь, узнаю что то новое, попробую это новое и буду знать немного больше.

Это не для дискуссии, а для информации. Если кто то считает иначе, считайте дальше.

 

megarak
Offline
Зарегистрирован: 03.05.2016

Люди все равно дают ответы таким нубам как я. И на написание таких сообщений, которые порождают бессмысленные споры, тоже уходит время. Так чем потратить 5 минут и дать умный совет, который будет понятен НАМ ДУРАКАМ только через пару лет, лучше дать хороший ответ доступным языком. ИМХО, как тут пишут. А ваши "методы воспитания" только порождают бессмысленные срачи, которые потом длятся десятками страниц (и, почти уверен, не одним десятком минут). 

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

Представьте, как сложно человеку, который еще не привык управлять машиной, ехать в городе по правилам. Хотя отдельно у него может по чуть чуть и то и другое получается.

megarak
Offline
Зарегистрирован: 03.05.2016

Из вопроса то почти всегда понятно на каком уровне владения предметной областью находится человек

megarak
Offline
Зарегистрирован: 03.05.2016

Люди стали такие - лишь бы высмеять, лишь бы подколоть, лишь бы самоутвердиться. "Хахаха какой глупый вопрос. Хахаха какой тупой ТС". Все злые стали. Надо быть добрее ко всем и помогать друг другу. 

Ну можно посмеяться над глупостью, это да. Но если это перед всеми высмеять хотят, то это точно попытка самоутвердиться. 

megarak
Offline
Зарегистрирован: 03.05.2016

И если кто-то все таки мне объяснит, я буду очень благодарен.

megarak пишет:

И все же.

xtea_encipher(32,(uint32_t*)(inout+(i*BLOCK_SIZE)),key);

Как тут у нас char в uint32_t умудряется превратиться?

 

megarak пишет:

Попробовал так в вижуал студио:

char str[16]={"Hello, world!"};
uint32_t roww = (uint32_t)str;
cout<<roww<<endl;

Каждый раз выдает разные семизначные цифры. Что это вообще? И как тогда он каждый раз одинаково шифрует и расшифровывает?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

В моем комменте есть ответ. Нормальный и правильный. Поймите его, хотя бы для доказательства старания.

megarak
Offline
Зарегистрирован: 03.05.2016

Вместо самой строки, переменной присваивается указатель на место, где лежит эта строка?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Да

megarak
Offline
Зарегистрирован: 03.05.2016

А как же тогда шифрование происходит? Ведь мы по сути в функцию передаем указатель?

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

А потом функция находит строку по этому указателю.

megarak
Offline
Зарегистрирован: 03.05.2016

Так функция xtea_encipher работает с этой строкой как с массивом чисел uint32_t. Как так получается?

megarak
Offline
Зарегистрирован: 03.05.2016

А потом чаровский массив оказывается зашифрованным. И, кстати, большего размера, чем был объявлен вначале.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

А почитать, как работает XTEA слабо? Я за несколько минут в вики прочитал и у меня странных вопросов не возникает.

megarak
Offline
Зарегистрирован: 03.05.2016

Все ясно с людьми на этом форуме (большинством людей). Я вот просто сижу и пишу вам - делать мне нечего, да. Читал я все по сотне раз. Не пойму говорю, объясните. 

Как можно быть такими оленями? Я же просил такие комменты оставлять при себе! 

Получается так примерно:

- "Я перечитал кучу информации как разобрать ноутбук АСУС - ничего не пойму"

- "Странно. Я открыл первую же ссылку и все понял. Я, сука, молодец. А ты, сука, тупой!"

А ничего, что ты до этого уже сотню компов разбирал и собирал????

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

"Не пойму говорю, объясните."

Что объяснить то? То, что написано по русски, что "Так как это блочный шифроалгоритм, где длина блока 64-бит, а длина данных может быть не кратна 64-битам, значения всех байтов дополняющих блок до кратности в 64-бит устанавливается в 0x01 ."

Объяснить, что 64 бита - это 8 байт. Один символ - один байт. Следовательно если длина текста не крастна 8 байтам, то блок будет расширен. Это надо объяснить?

На счет "оленей", поаккуратней, я тебе помог, так теперь твоя благодарность в том, что нужно переходить на личности? Продолжай в том же духе. Добро пожаловать в черный список.

 

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

megarak пишет:

А ничего, что ты до этого уже сотню компов разбирал и собирал????

кто тебе мешает разобрать сотню компов, неалень?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

megarak пишет:

Все ясно с людьми на этом форуме (большинством людей). Я вот просто сижу и пишу вам - делать мне нечего, да. Читал я все по сотне раз. Не пойму говорю, объясните. 

Как можно быть такими оленями? Я же просил такие комменты оставлять при себе! 

Ярик! Вот об этом я и говорил. Он не "просит", а "говорит" - "объясните". 

Здорово? Мне - весело.