#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//------------------------------------------------------------------
__fastcall TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//------------------------------------------------------------------
void TForm1::encipher(unsigned int num_rounds, uint32_t v[2], uint32_t const k[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 + k[sum & 3]);
    sum += delta;
    v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]);
}
// ESSA LINHA já CONTEM OS VALORES ENCRIPTADOS
    v1[0]=V0; v[1]=v1;
}
void TForm1::decipher(unsignes int num_rounds, uint32_t v[2], uint32_t const k[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 + k[(sum>>11) & 3]);
        sum -= delta;
        v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);
    }
//ESSA LINHA já CONTEM OS VALORES DECRIPTADOS
    v[0]=v0; v[1]=v1;
//-----------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObjct *Sender)
    uint32_t v[2], chave[4];
    uint32_t tamaarq;
    FILE *origem, *destino;
    char buffer[2];
    int q;
    tamaarq = FileSizeByName(nomearq->Text); //OBTEM O TAMANHO DO ARQUIVO EM BYTES
    pb1->Max = tamaarq; //CONFIGURA A BARRA DE PROGRESSO
    pb1->Position = 0;
    tamaarq = 0;
//CONVERTE A CHAVE DO USUARIO PARA O FORMATO UINT32
    chave[0] = edtch->Text[1];
    chave[1] = edtch->Text[2];
    chave[2] = edtch->Text[3];
    chave[3] = edtch->Text[4];
    if((origem=fopen(nomearq->Text.c_str(),"rb"))!=NULL { // ABRE O ARQUIVO ORIGINAL
        if((destino=fopen(DESTINO,"wb"))!=NULL { // ABRE O ARQUIVO DE DESTINO TEMPORARIO
            do {
                q = fread(buffer,sizeof(char),2,origem); // LE DOIS BYTES DO AQUIVO ORIGINAL
                if(q>0) {
                    v[0] = buffer[0]; v[1] = buffer[1]; //TRANSFERE OS BYTES PARA A MATRIZ V
                }
                tamaarq += q; pb1->Position = tamaarq; // AJUSTA A BARRA DE PROGRESSO
                Application->ProcessMessages();
            } while(q==2);
            fclose(destino); //FECHA O ARQUIVO DE DESTINO
        }
        fclose(origem); // FECHA O ARQUIVO DE ORIGEM
    }
    DeleteFile(nomearq->Text); //DELETA O ARQUIVO ORIGINAL
    RenameFile(DESTINO, nomearq->Text); //RENOMEIA O ARQUIVO TEMPORARIO
    pb1->Position = 0;
    MessageBox(form1->Handle,"Operação de encriptação concluida","Atenção", MB_ICOINFORMATION);
//--------------------------------------------------------------------
void__fastcall TForm1::ButtoneClick(TObject *Sender)
{
    uint32_t v[2], chave[4];
    uint32_t tamaarq;
    FILE *origem, *destino;
    int q;
    char buffer[2];
    tamaarq = FileSizeByName(nomearq->Text); // OBTEM O TAMANHO DO ARQUIVO EM BYTES
    pb1->Max = tamaarq; // CONFIGURA A BARRA DE PROGRESSO
    pb1->Position =0;
    tamaarq = 0;
//CONVERTE A CHAVE DO USUARIO PARA O FORMATO UINT32
    chave[0] = edtch->Text[1];
    chave[1] = edtch->Text[2];
    chave[2] = edtch->Text[3];
    chave[3] = edtch->Text[4];
    if((origem=fopen(nomearq->Text.c_str(),"rb"))!=NULL) { //ABRE O ARQUIVO ORIGINAL ENCRIPTADO
        if((destino=fopen(DESTINO,"wb"))!=NULL { // ABRE O ARQUIVO DE DESTINO
            do {
                q = fread(v,sizeof(uint32_t),2,origem); //LE DUAS UNIDADES ENCRIPTADAS
                if(q>0) {
                    decipher(QDEPASSOS,v,chave); // DECRIPTA AS UNIDADES
                    buffer[0] = v[0]; buffer[1] = v[1]; // CONVERTE EM CARACTERES ASCII
                    fwrite(buffer,sizeof(char),2,destino); // GRAVA O ARQUIVO DE DESTINO DECRIPTADO
                }
                tamaarq += q; pb1->Position = tamaarq; // AJUSTA A BARRA DE PROGRESSO
                Application->ProcessMessages();
            } while(q==2);
            fclose(destino); //FECHA O ARQUIVO DE DESTINO
        }
        fclose(origem); // FECHA O ARQUIVO DE ORIGEM
    }
    // DELETA E RENOMEIA OS ARQUIVOS
    DeleteFile(nomearq->Text);
    RenameFile(DESTINO,nomearq->Text);
    pb1->Position = 0;
    MessageBox(Form1->Handle,"Operação de decriptação concluida","Atenção",MB_ICONINFORMATION);                
}