Показать сообщение отдельно

  #5  
Старый 11.11.2006, 00:18
rem
Новичок
Регистрация: 10.11.2006
Сообщений: 24
С нами: 10263974

Репутация: 17
По умолчанию

если хошь здеся лежит "почти" российский ГОСТ(стандарт шифрования)
#include <vcl.h>
#include <stdio.h>
#include <conio.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
union transform
{
unsigned __int64 X[4];
unsigned int _h[8];
unsigned short _s[16];
unsigned char ch[32];
}Y;
void crypt(unsigned int*n1,unsigned int*n2,unsigned long *k);
void multi(unsigned char*x,unsigned char *l);
void prisvUV(unsigned char *h,unsigned char *m);
void calc_key(unsigned char *u,unsigned char *v);
void A(unsigned char *u);
void preobr_KSI(transform*f,int kol);
void prost_zam(unsigned char*h);
void Hshag(unsigned char*h,unsigned char*m);
void k_sum(unsigned char*s1,unsigned char* s2);
int readM(unsigned char* m,FILE*f);

TForm1 *Form1;
unsigned char U[32]={0},V[32]={0},H[32]={0},W[32]={0},L[32]={0},E[32]={0};
unsigned char K[4][32]={0};
unsigned char M[32];
unsigned char C[3][32]={{0},{0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00,
0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff,
0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff},{0}};

boolean openf=false;

static unsigned char tab[8][16] ={
0x4,0xA,0x9,0x2,0xD,0x8,0x0,0xE,0x6,0xB,0x1,0xC,0x 7,0xF,0x5,0x3,
0xE,0xB,0x4,0xC,0x6,0xD,0xF,0xA,0x2,0x3,0x8,0x1,0x 0,0x7,0x5,0x9,
0x5,0x8,0x1,0xD,0xA,0x3,0x4,0x2,0xE,0xF,0xC,0x7,0x 6,0x0,0x9,0xB,
0x7,0xD,0xA,0x1,0x0,0x8,0x9,0xF,0xE,0x4,0x6,0xC,0x B,0x2,0x5,0x3,
0x6,0xC,0x7,0x1,0x5,0xF,0xD,0x8,0x4,0xA,0x9,0xE,0x 0,0x3,0xB,0x2,
0x4,0xB,0xA,0x0,0x7,0x2,0x1,0xD,0x3,0x6,0x8,0x5,0x 9,0xC,0xF,0xE,
0xD,0xB,0x4,0x1,0x3,0xF,0x5,0x9,0x0,0xA,0xE,0x7,0x 6,0x8,0x2,0xC,
0x1,0xF,0xD,0x0,0x5,0x7,0xA,0x4,0x9,0x2,0x3,0xE,0x 6,0xB,0x8,0xC};
//---------------------------------------------------------------------------

void crypt(unsigned int*n1,unsigned int*n2,unsigned long *k)
{
unsigned int N1=*n1,N2=*n2,n=0;
int buf[8];
for(int i=0;i<32;i++)
{
if (i<24)
N1=N1+k[i%8];
else N1=N1+k[7-i%8];
for (int j=0;j<=7;j++)
{
n=N1>>(4*j);
n=n&0xF;
buf[j]=tab[j][n];
}
N1=0;
for(int j=0;j<=7;j++)
N1=N1^(buf[j]<<(4*j));
N1=(N1<<11)|(N1>>21);
N1=N1^N2;
N2=*n1;
*n1=N1;
}
*n2=*n1;*n1=N2;
}
//---------------------------------------------------------------------------

void multi(unsigned char*x,unsigned char *l)
{
int c=0;char y=8;
int k;
for (int j=0;j<4;j++)
{
k=l[j]+x[j]*y+c;
l[j]=k%256;
c=k/256;
}
l[4]=c;
};

void A(unsigned char *u);
//---------------------------------------------------------------------------
void prisvUV(unsigned char *h,unsigned char *m)
{
for(int i=0;i<32;i++)
{
U[i]=h[i];
V[i]=m[i];
}
}

//---------------------------------------------------------------------------
void calc_key(unsigned char *u,unsigned char *v)
{
for(int i=0;i<32;i++) {W[i]=u[i]^v[i];}
for(int i=0;i<=3;i++) {
for(int k=1;k<=8;k++) {
K[0][(i+1+4*(k-1))-1]=W[(8*i+k)-1];}}

for(int ii=0;ii<3;ii++)
{
A(U);
for(int j=0;j<32;j++) {U[j]=U[j]^C[ii][j];}
A(V);A(V);
for(int j=0;j<32;j++) {W[j]=U[j]^V[j];}
for(int i=0;i<=3;i++) {
for(int k=1;k<=8;k++) {
K[ii+1][(i+1+4*(k-1))-1]=W[(8*i+k)-1];}}
}
}

//---------------------------------------------------------------------------
void A(unsigned char *u){
transform temp,YY;
for (int i=0;i<32;i++) {temp.ch[i]=u[i];}
YY.X[3]=temp.X[0]^temp.X[1];
YY.X[2]=temp.X[3];
YY.X[1]=temp.X[2];
YY.X[0]=temp.X[1];
for (int i=0;i<32;i++) {u[i]=YY.ch[i];}
}

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

void preobr_KSI(transform*f,int kol)
{
short temp1=0;
for(int i=0;i<kol;i++)
{
temp1=f->_s[0]^f->_s[1]^f->_s[2]^f->_s[3]^f->_s[12]^f->_s[15];
for(int ii=0;ii<15;ii++) {f->_s[ii]=f->_s[ii+1];}
f->_s[15]=temp1;
}
}
//---------------------------------------------------------------------------

void prost_zam(unsigned char*h)
{
unsigned int N1=0,N2=0;
transform for_zam;
for(int i=0;i<32;i++) {for_zam.ch[i]=h[i];}
for(int i=0;i<4;i++)
{
N1=for_zam._h[i*2];
N2=for_zam._h[i*2+1];
crypt(&N1,&N2,((unsigned long*)K)+i*8);
Y._h[i*2]=N1;Y._h[i*2+1]=N2;
}
}
//----------------------------------------------------------------------------

void Hshag(unsigned char*h,unsigned char*m)
{
preobr_KSI(&Y,12);
for(int i=0;i<32;i++) {Y.ch[i]=Y.ch[i]^m[i];}
preobr_KSI(&Y,1);
for(int i=0;i<32;i++) {Y.ch[i]=Y.ch[i]^h[i];}
preobr_KSI(&Y,61);
for(int y=31;y>=0;y--) {h[y]=Y.ch[y];}
}
//----------------------------------------------------------------------------

void k_sum(unsigned char*s1,unsigned char* s2)
{
int k=0;
for(int i=0;i<32;i++)
{
k=k+s1[i]+s2[i];
s1[i]=k%256;
k=k/256;
}
}
//----------------------------------------------------------------------------

int readM(unsigned char* m,FILE*f)
{
int i;
for(i=0;i<32;i++)
{
m[i]=fgetc(f);
if(feof(f)) break;
}
if(i!=32)
for(int y=i;y<32;y++) {m[y]=0x00;}
return i;
}

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

__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
if (openf)
{
int last=0;
FILE *f=fopen(OpenDialog1->FileName.c_str(),"rb");
fseek(f,0,SEEK_END);long int len=ftell(f);rewind(f);
multi((unsigned char*)&len,L);
int i=1;
do{
last=readM(M,f);
if(last==32&&i*32<len)
{prisvUV(H,M);
calc_key(U,V);
prost_zam(H);
Hshag(H,M);
k_sum(E,M);}
else
{
k_sum(E,M);
prisvUV(H,M);
calc_key(U,V);
prost_zam(H);
Hshag(H,M);
prisvUV(H,L);
calc_key(U,V);
prost_zam(H);
Hshag(H,L);
prisvUV(H,E);
calc_key(U,V);
prost_zam(H);
Hshag(H,E);
break;
}
i++;
}
while(1);
for(int i=31;i>=0;i--) {Edit1->Text=Edit1->Text+IntToHex(H[i],2);}
fcloseall();
}
}
//---------------------------------------------------------------------------

void __fastcall TForm1::N2Click(TObject *Sender)
{
if(OpenDialog1->Execute())
openf=true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::N3Click(TObject *Sender)
{
Form1->Close();
}
//---------------------------------------------------------------------------

разберешься сам? есть еще нормально написанный но я не помню куда его сунул....((((
 
Ответить с цитированием