Здраствуйте все!!! Я пиши алгоритм des кодирования вроде всё правельно но не работает не могли бы посмотреть а то уже не один день парюсь и немогу понять в чём дело может глаз ужо замылился, а может я чё не доганяю.Пишу как описано в Шнайберге, уже и английскую спецификацию скачал ну не выходит и усё.Посмотрите пожалуйсто если вас не затруднит очень надо. Код (Text): //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; char P_1Swap[56]={56,48,40,32,24,16,8,0,57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,60,52,44,36,28,20,12,4,27,19,11,3}; char P_2Swap[48]={13,16,10,23,0,4,2,27,14,5,20,9,22,18,11,3,25,7,15,6,26,19,12,1,40,51,30,36,46,54,29,39,50,44,32,47,43,48,38,55,33,52,45,41,49,35,28,31}; char IPSwap[64]={57,49,41,33,25,17,9,1,59,51,43,35,27,19,11,3,61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7,56,48,40,32,24,16,8,0,58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,62,54,46,38,30,22,14,6}; char ESwap[48]={31,0,1,2,3,4,3,4,5,6,7,8,7,8,9,10,11,12,11,12,13,14,15,16,15,16,17,18,19,20,19,20,21,22,23,24,23,24,25,26,27,28,27,28,29,30,31,0}; char PSwap[32]={15,6,19,20,28,11,27,16,0,14,22,25,4,17,30,9,1,7,23,13,31,26,2,8,18,12,29,5,21,10,3,24}; char IP_1Swap[64]={39,7,47,15,55,23,63,31,38,6,46,14,54,22,62,30,37,5,45,13,53,21,61,29,36,4,44,12,52,20,60,28,35,3,43,11,51,19,59,27,34,2,42,10,50,18,58,26,33,1,41,9,49,17,57,25,32,0,40,8,48,16,56,24}; ULONGLONG S1[4]={0x7095C6A38BF21D4E,0x8359BC6A1D2E47F0,0x05A379CFB26D8E14,0xD60AE3B5719428CF}; ULONGLONG S2[4]={0xA50CD27943B6E81F,0x5B96A10CE82F74D3,0xF2396C851D4AB7E0,0x9E50C76B24F31A8D}; ULONGLONG S3[4]={0x824B7CD15F36E90A,0x1FBCE582A643907D,0x7EA5C21B03F8946D,0xC25B3EF478960DA1}; ULONGLONG S4[4]={0xF4CB5821A9603ED7,0x9EA1C27430F65B8D,0x4825E31FD7BC096A,0xE27CB5498D1A60F3}; ULONGLONG S5[4]={0x9E0DF3586BA714C2,0x6893AF051D74C2BE,0xE0365C9F87DAB124,0x354A90F6D2E17C8B}; ULONGLONG S6[4]={0xB57E43D08629FA1C,0x83B0ED1659C724FA,0x6BD1A4073C825FE9,0xD80671EBAF59C234}; ULONGLONG S7[4]={0x16A579C3D80FE2B4,0x68F2C53EA1947B0D,0x295086FAE73CDB41,0xC32EF0597A418DB6}; ULONGLONG S8[4]={0x7C05E39A1BF6482D,0x29E0B65C473A8DF1,0x853FDA602EC914B7,0xB65309CFD8A47E12}; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } ULONGLONG SwapBit(char* SwapMas,int size,ULONGLONG value) { ULONGLONG ret=0; for(int i=0;i<size;i++) ret|=(((value>>SwapMas[i])&0x1)<<i); return ret; } //--------------------------------------------------------------------------- ULONGLONG Des(ULONGLONG Message,ULONGLONG vkey,bool decode) { ULONGLONG mes,key; ULONGLONG rkey,lkey,rmes,lmes,dop,vrmes; int dec=0; rkey=lkey=rmes=lmes=dop=vrmes=0; mes=key=0; ////////////////////////////////////////////////////Pervii etap,pervie perestanovki mes=SwapBit(IPSwap,64,Message); key=SwapBit(P_1Swap,56,vkey); ///////////////////////////////////////////////////Vtoroi etap,etap delenia rmes=(mes>>32)&0xFFFFFFFF; lmes=mes&0xFFFFFFFF; rkey=(key>>28)&0xFFFFFFF; lkey=key&0xFFFFFFF; if(decode) dec=17;//Znachenie dlia decodirivania //////////////////////////////////////////////////Tretii etap,cikl for(int etap=1;etap<=16;etap++) { vrmes=rmes; switch(abs(dec-etap)) { case 1: case 2: case 9: case 16: lkey=((lkey>>0x1)|((lkey&0x1)<<27))&0xFFFFFFF; rkey=((rkey>>0x1)|((rkey&0x1)<<27))&0xFFFFFFF; break; default: lkey=((lkey>>0x2)|((lkey&0x3)<<26))&0xFFFFFFF; rkey=((rkey>>0x2)|((rkey&0x3)<<26))&0xFFFFFFF; } //Из двух половинок собираем ключ key=rkey; key=(key<<28)&0xFFFFFFF0000000; key|=lkey; //------------------------------- key=SwapBit(P_2Swap,48,key);//Перестановка с жатием rmes=SwapBit(ESwap,48,rmes);//Перестановка с расширением rmes=rmes^key; dop=0; dop|=((S1[((((rmes>>4)&0x2)|(rmes&0x1))&0x3)]>>(((rmes>>0x1)&0xF)<<0x4))&0xF); rmes>>=0x6; dop|=((S2[((((rmes>>4)&0x2)|(rmes&0x1))&0x3)]>>(((rmes>>0x1)&0xF)<<0x4))&0xF)<<0x4; rmes>>=0x6; dop|=((S3[((((rmes>>4)&0x2)|(rmes&0x1))&0x3)]>>(((rmes>>0x1)&0xF)<<0x4))&0xF)<<0x8; rmes>>=0x6; dop|=((S4[((((rmes>>4)&0x2)|(rmes&0x1))&0x3)]>>(((rmes>>0x1)&0xF)<<0x4))&0xF)<<0xC; rmes>>=0x6; dop|=((S5[((((rmes>>4)&0x2)|(rmes&0x1))&0x3)]>>(((rmes>>0x1)&0xF)<<0x4))&0xF)<<0x10; rmes>>=0x6; dop|=((S6[((((rmes>>4)&0x2)|(rmes&0x1))&0x3)]>>(((rmes>>0x1)&0xF)<<0x4))&0xF)<<0x14; rmes>>=0x6; dop|=((S7[((((rmes>>4)&0x2)|(rmes&0x1))&0x3)]>>(((rmes>>0x1)&0xF)<<0x4))&0xF)<<0x18; rmes>>=0x6; dop|=((S8[((((rmes>>4)&0x2)|(rmes&0x1))&0x3)]>>(((rmes>>0x1)&0xF)<<0x4))&0xF)<<0x1C; rmes=SwapBit(PSwap,32,dop); rmes=rmes^lmes; lmes=vrmes; } mes=0; mes=rmes; mes=(mes<<32)&0xFFFFFFFF00000000; mes|=lmes; return SwapBit(IP_1Swap,64,mes); } //--------------------------------------------------------------------------- ULONGLONG GetData(char* Pas,int size,int num) { ULONGLONG p=0; if ((num*8)<size) { Pas+=num*8; for (int i=0;i<8;i++) if (Pas[i]==0) break; else p=p|((ULONGLONG)(Pas[i])<<i*8); } return p; } //--------------------------------------------------------------------------- ULONGLONG Des3Encoder(char *Message,char *Password) { //char *result=new char[strlen(Message)]; ULONGLONG k1,mes,res; k1=mes=res=0; k1=GetData(Password,strlen(Password),0); mes=GetData(Message,strlen(Message),0); res=Des(mes,k1,false); //res=Des(res,k1,true);это для декодирования ShowMessage((AnsiString)IntToHex((__int64)res,0x4)); return res; } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { Des3Encoder("abcdefgh","12345678"); } //--------------------------------------------------------------------------- Заранее блягодарин!!!!
Да нет готовое решение тут непойдёт мне нужно разобраться почему именно у меня не работает,мой алгоритм.