Скачиваний:
29
Добавлен:
01.05.2014
Размер:
2.81 Кб
Скачать
//---------------------------------------------------------------------------


#pragma hdrstop

#include <stdlib.h>

#include "alg.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

using namespace std;

CTea::CTea() : m_passSize(16),m_appendChar(' ')
{
}

void CTea::setPassword(std::string str)
{
  for(uint i = str.length();i<m_passSize;++i)
    str.append(&m_appendChar);

  for(uint i = 0;i<4;++i)
  {
    convert tmp;

    for(uint k = 0;k<4;++k)
      tmp.m_char[k] = str[i*4+k];

    m_password[i] = tmp.m_long;
  }
}

void CTea::encrypt(std::string str)
{
  div_t divStruct;

  divStruct = div(str.length(),8);
  m_origString = str;
  m_encString.clear();

  if(divStruct.rem!=0)
    for(uint i = 8-divStruct.rem;i!=0;--i)
      str.append(&m_appendChar);

  divStruct = div(str.length(),8);

  for(int i = 0;i<divStruct.quot;++i)
  {
    convert first,second;

    for(uint k = 0;k<4;++k)
    {
      first.m_char[k] = str[i*8+k];
      second.m_char[k] = str[i*8+k+4];
    }

    uint left  = first.m_long,  //Инициализация алгоритма
         right = second.m_long,
         sum   = 0;
    uint delta=0x9e3779b9;      //Значение для улучшения ключа

    for (uint i = 0;i<32;++i)
    {
      sum   += delta;
      left  += ((right<<4)+m_password[0])^(right+sum)^((right>>5)+m_password[1]);
      right += ((left<<4)+m_password[2])^(left+sum)^((left>>5)+m_password[3]);
    }
    first.m_long =left;
    second.m_long=right;

    for(uint k = 0;k<4;++k)
      m_encString.push_back(first.m_char[k]);
    for(uint k = 0;k<4;++k)
      m_encString.push_back(second.m_char[k]);
  }
}

void CTea::decrypt(std::string str)
{
  div_t divStruct;

  divStruct = div(str.length(),8);
  m_encString = str;
  m_origString.clear();

  for(int i = 0;i<divStruct.quot;++i)
  {
    convert first,second;

    for(uint k = 0;k<4;++k)
    {
      first.m_char[k] = str[i*8+k];
      second.m_char[k] = str[i*8+k+4];
    }

    uint left  = first.m_long,  //Инициализация алгоритма
         right = second.m_long,
         sum;
    uint delta=0x9e3779b9;

    sum = delta<<5;
    for (uint i = 0;i<32;++i)
    {
      right -= ((left<<4)+m_password[2])^(left+sum)^((left>>5)+m_password[3]);
      left  -= ((right<<4)+m_password[0])^(right+sum)^((right>>5)+m_password[1]);
      sum   -= delta;
    }
    first.m_long =left;
    second.m_long=right;

    for(uint k = 0;k<4;++k)
      m_origString.push_back(first.m_char[k]);
    for(uint k = 0;k<4;++k)
      m_origString.push_back(second.m_char[k]);
  }
}

std::string CTea::getEncrypted()
{
  return m_encString;
}

std::string CTea::getDecrypted()
{
  return m_origString;
}
Соседние файлы в папке Лабораторная работа 21