Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа 21 / alg
.cpp//---------------------------------------------------------------------------
#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;
}