Des Алгоритм

Тема в разделе "WASM.CRYPTO", создана пользователем MrNLO, 22 июл 2007.

  1. MrNLO

    MrNLO New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2006
    Сообщения:
    5
    Здраствуйте все!!!
    Я пиши алгоритм des кодирования вроде всё правельно но не работает не могли бы посмотреть а то уже не один день парюсь и немогу понять в чём дело может глаз ужо замылился, а может я чё не доганяю.Пишу как описано в Шнайберге, уже и английскую спецификацию скачал ну не выходит и усё.Посмотрите пожалуйсто если вас не затруднит очень надо.
    Код (Text):
    1. //---------------------------------------------------------------------------
    2.  
    3. #include <vcl.h>
    4. #pragma hdrstop
    5.  
    6. #include "Unit1.h"
    7. //---------------------------------------------------------------------------
    8. #pragma package(smart_init)
    9. #pragma resource "*.dfm"
    10. TForm1 *Form1;
    11. 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};
    12. 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};
    13. 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};
    14. 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};
    15. 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};
    16. 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};
    17. ULONGLONG S1[4]={0x7095C6A38BF21D4E,0x8359BC6A1D2E47F0,0x05A379CFB26D8E14,0xD60AE3B5719428CF};
    18. ULONGLONG S2[4]={0xA50CD27943B6E81F,0x5B96A10CE82F74D3,0xF2396C851D4AB7E0,0x9E50C76B24F31A8D};
    19. ULONGLONG S3[4]={0x824B7CD15F36E90A,0x1FBCE582A643907D,0x7EA5C21B03F8946D,0xC25B3EF478960DA1};
    20. ULONGLONG S4[4]={0xF4CB5821A9603ED7,0x9EA1C27430F65B8D,0x4825E31FD7BC096A,0xE27CB5498D1A60F3};
    21. ULONGLONG S5[4]={0x9E0DF3586BA714C2,0x6893AF051D74C2BE,0xE0365C9F87DAB124,0x354A90F6D2E17C8B};
    22. ULONGLONG S6[4]={0xB57E43D08629FA1C,0x83B0ED1659C724FA,0x6BD1A4073C825FE9,0xD80671EBAF59C234};
    23. ULONGLONG S7[4]={0x16A579C3D80FE2B4,0x68F2C53EA1947B0D,0x295086FAE73CDB41,0xC32EF0597A418DB6};
    24. ULONGLONG S8[4]={0x7C05E39A1BF6482D,0x29E0B65C473A8DF1,0x853FDA602EC914B7,0xB65309CFD8A47E12};
    25. //---------------------------------------------------------------------------
    26. __fastcall TForm1::TForm1(TComponent* Owner)
    27.         : TForm(Owner)
    28. {
    29. }
    30. ULONGLONG SwapBit(char* SwapMas,int size,ULONGLONG value)
    31.         {
    32.         ULONGLONG ret=0;
    33.         for(int i=0;i<size;i++)
    34.                 ret|=(((value>>SwapMas[i])&0x1)<<i);
    35.         return ret;
    36.         }
    37. //---------------------------------------------------------------------------
    38. ULONGLONG Des(ULONGLONG Message,ULONGLONG vkey,bool decode)
    39.         {
    40.         ULONGLONG mes,key;
    41.         ULONGLONG rkey,lkey,rmes,lmes,dop,vrmes;
    42.         int dec=0;
    43.         rkey=lkey=rmes=lmes=dop=vrmes=0;
    44.         mes=key=0;
    45. ////////////////////////////////////////////////////Pervii etap,pervie perestanovki
    46.         mes=SwapBit(IPSwap,64,Message);
    47.         key=SwapBit(P_1Swap,56,vkey);
    48. ///////////////////////////////////////////////////Vtoroi etap,etap delenia
    49.         rmes=(mes>>32)&0xFFFFFFFF;
    50.         lmes=mes&0xFFFFFFFF;
    51.         rkey=(key>>28)&0xFFFFFFF;
    52.         lkey=key&0xFFFFFFF;
    53.         if(decode) dec=17;//Znachenie dlia decodirivania
    54. //////////////////////////////////////////////////Tretii etap,cikl
    55.         for(int etap=1;etap<=16;etap++)
    56.                 {
    57.                 vrmes=rmes;
    58.                 switch(abs(dec-etap))
    59.                         {
    60.                         case 1:
    61.                         case 2:
    62.                         case 9:
    63.                         case 16:
    64.                                 lkey=((lkey>>0x1)|((lkey&0x1)<<27))&0xFFFFFFF;
    65.                                 rkey=((rkey>>0x1)|((rkey&0x1)<<27))&0xFFFFFFF;
    66.                                 break;
    67.                         default:
    68.                                 lkey=((lkey>>0x2)|((lkey&0x3)<<26))&0xFFFFFFF;
    69.                                 rkey=((rkey>>0x2)|((rkey&0x3)<<26))&0xFFFFFFF;
    70.                         }
    71. //Из двух половинок собираем ключ
    72.                 key=rkey;
    73.                 key=(key<<28)&0xFFFFFFF0000000;
    74.                 key|=lkey;
    75. //-------------------------------
    76.                 key=SwapBit(P_2Swap,48,key);//Перестановка с жатием
    77.                 rmes=SwapBit(ESwap,48,rmes);//Перестановка с расширением
    78.                 rmes=rmes^key;
    79.                 dop=0;
    80.                 dop|=((S1[((((rmes>>4)&0x2)|(rmes&0x1))&0x3)]>>(((rmes>>0x1)&0xF)<<0x4))&0xF);
    81.                 rmes>>=0x6;
    82.                 dop|=((S2[((((rmes>>4)&0x2)|(rmes&0x1))&0x3)]>>(((rmes>>0x1)&0xF)<<0x4))&0xF)<<0x4;
    83.                 rmes>>=0x6;
    84.                 dop|=((S3[((((rmes>>4)&0x2)|(rmes&0x1))&0x3)]>>(((rmes>>0x1)&0xF)<<0x4))&0xF)<<0x8;
    85.                 rmes>>=0x6;
    86.                 dop|=((S4[((((rmes>>4)&0x2)|(rmes&0x1))&0x3)]>>(((rmes>>0x1)&0xF)<<0x4))&0xF)<<0xC;
    87.                 rmes>>=0x6;
    88.                 dop|=((S5[((((rmes>>4)&0x2)|(rmes&0x1))&0x3)]>>(((rmes>>0x1)&0xF)<<0x4))&0xF)<<0x10;
    89.                 rmes>>=0x6;
    90.                 dop|=((S6[((((rmes>>4)&0x2)|(rmes&0x1))&0x3)]>>(((rmes>>0x1)&0xF)<<0x4))&0xF)<<0x14;
    91.                 rmes>>=0x6;
    92.                 dop|=((S7[((((rmes>>4)&0x2)|(rmes&0x1))&0x3)]>>(((rmes>>0x1)&0xF)<<0x4))&0xF)<<0x18;
    93.                 rmes>>=0x6;
    94.                 dop|=((S8[((((rmes>>4)&0x2)|(rmes&0x1))&0x3)]>>(((rmes>>0x1)&0xF)<<0x4))&0xF)<<0x1C;
    95.                 rmes=SwapBit(PSwap,32,dop);
    96.                 rmes=rmes^lmes;
    97.                 lmes=vrmes;
    98.                 }
    99.                 mes=0;
    100.                 mes=rmes;
    101.                 mes=(mes<<32)&0xFFFFFFFF00000000;
    102.                 mes|=lmes;
    103.                 return SwapBit(IP_1Swap,64,mes);
    104.  
    105.         }
    106.  
    107.  
    108.         //---------------------------------------------------------------------------
    109. ULONGLONG GetData(char* Pas,int size,int num)
    110.         {
    111.         ULONGLONG  p=0;
    112.         if ((num*8)<size)
    113.                 {
    114.                 Pas+=num*8;
    115.                 for (int i=0;i<8;i++)
    116.                         if (Pas[i]==0) break;
    117.                         else p=p|((ULONGLONG)(Pas[i])<<i*8);
    118.                 }
    119.         return p;
    120.         }
    121. //---------------------------------------------------------------------------
    122. ULONGLONG Des3Encoder(char *Message,char *Password)
    123.         {
    124.         //char *result=new char[strlen(Message)];
    125.         ULONGLONG k1,mes,res;
    126.         k1=mes=res=0;
    127.         k1=GetData(Password,strlen(Password),0);
    128.         mes=GetData(Message,strlen(Message),0);
    129.         res=Des(mes,k1,false);
    130.         //res=Des(res,k1,true);это для декодирования
    131.         ShowMessage((AnsiString)IntToHex((__int64)res,0x4));
    132.         return res;
    133.         }
    134. //---------------------------------------------------------------------------
    135. void __fastcall TForm1::FormCreate(TObject *Sender)
    136. {
    137.         Des3Encoder("abcdefgh","12345678");
    138. }
    139. //---------------------------------------------------------------------------
    Заранее блягодарин!!!!
     
  2. ECk

    ECk Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    454
    Адрес:
    Russia
    можно воспользоваться готовым бесплатным решением с сорцами - RSAREF (как я понимаю на сях нужно?)
     
  3. MrNLO

    MrNLO New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2006
    Сообщения:
    5
    Да нет готовое решение тут непойдёт мне нужно разобраться почему именно у меня не работает,мой алгоритм.