Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. ;
  2. ; áèáëèîòåêà äëÿ øèôðîâàíèÿ ïî àëãîðèòìó DES
  3. ;
  4.  
  5. format MS COFF
  6. public EXPORTS
  7. section '.flat' code readable align 16
  8.  
  9. include '../../../../macros.inc'
  10. include '../../../../proc32.inc'
  11.  
  12. ;description:
  13. ; ôóíêöèÿ øèôðîâàíèÿ ôàéëîâ
  14. ;input:
  15. ; key - âõîäíîé êëþ÷ 64 áèò
  16. ; mem_keys - ïàìÿòü äëÿ ôîðìèðîâàíèÿ êëþ÷åé (ðàçìåð 120 áàéò)
  17. ; block - óêàçàòåëü íà ïåðâûé øèôðóåìûé 8 áàéòíûé áëîê
  18. ; b_count - ÷èñëî áëîêîâ äëÿ øèôðîâàíèÿ
  19. align 4
  20. proc des_encryption, key:dword, mem_keys:dword, block:dword, b_count:dword
  21. locals
  22.     n dd ? ;ïåðåìåííàÿ öèêëà
  23. endl
  24. pushad
  25.     stdcall encryption_key, [key],[mem_keys]
  26.  
  27.     ;íà÷àëüíàÿ ïåðåñòàíîâêà ip
  28.     mov ecx,[b_count]
  29.         cmp ecx,1
  30.         jl .end_funct
  31.     mov edi,[block]
  32.     cld
  33.     @@:
  34.         mov esi,[mem_keys]
  35.         add esi,112
  36.         stdcall fun_convert_bits, edi, esi, oper_ip, 64
  37.         movsd
  38.         movsd
  39.         loop @b
  40.  
  41.     mov ecx,[b_count]
  42.     mov esi,[block]
  43.     ;cld
  44.         .cycle_3:
  45.         mov dword[n],0
  46.         .funct_f:
  47.         mov edi,[mem_keys]
  48.         add edi,112
  49.         ;ïåðåñòàâëÿåì áëîê R0(32) ïî ìàòðèöå e
  50.         stdcall fun_convert_bits, esi, edi, oper_e, 48
  51.    
  52.         ;edi - R0~e (48 áèò)
  53.         ;esi - L0R0 (64 áèòà)
  54.         stdcall fun_r0xorki_si, edi,[mem_keys],[n]
  55.  
  56.         ;edi - (R0~e xor ki)~Si (32 áèòà)
  57.         ;ïåðåñòàíîâêà p
  58.         mov eax,edi
  59.         add eax,4
  60.         stdcall fun_convert_bits, edi, eax, oper_p, 32
  61.  
  62.         ;ïèøåì R0 â L0, è (L0 xor (R0~e xor ki)~Si) â R0
  63.         mov edx,dword[esi+4]
  64.         mov ebx,dword[esi]
  65.         xor edx,dword[eax]
  66.         mov dword[esi],edx
  67.         mov dword[esi+4],ebx
  68.    
  69.         inc dword[n]
  70.         cmp dword[n],16
  71.         jl .funct_f
  72.  
  73.         add esi,8 ;ïåðåõîä íà ñëåäóþùèé 64 áèòíûé øèôðóåìûé áëîê
  74.         loop .cycle_3
  75.  
  76.     ;êîíå÷íàÿ ïåðåñòàíîâêà ip_inv
  77.     mov ecx,[b_count]
  78.     mov edi,[block]
  79.     ;cld
  80.     @@:
  81.         mov esi,[mem_keys]
  82.         add esi,112
  83.         stdcall fun_convert_bits, edi, esi, oper_ip_inv, 64
  84.         movsd
  85.         movsd
  86.         loop @b
  87.  
  88.         .end_funct:
  89. popad
  90.     ret
  91. endp
  92.  
  93. ;description:
  94. ; ôóíêöèÿ ðàñøèôðîâàíèÿ ôàéëîâ
  95. ;input:
  96. ; key - âõîäíîé êëþ÷ 64 áèò
  97. ; mem_keys - ïàìÿòü äëÿ ôîðìèðîâàíèÿ êëþ÷åé (ðàçìåð 120 áàéò)
  98. ; block - óêàçàòåëü íà ïåðâûé ðàñøèôðîâûâàåìûé 8 áàéòíûé áëîê
  99. ; b_count - ÷èñëî áëîêîâ äëÿ ðàñøèôðîâàíèÿ
  100. align 4
  101. proc des_decryption, key:dword, mem_keys:dword, block:dword, b_count:dword
  102. locals
  103.     n dd ? ;ïåðåìåííàÿ öèêëà
  104. endl
  105. pushad
  106.     stdcall encryption_key, [key],[mem_keys]
  107.  
  108.     ;íà÷àëüíàÿ ïåðåñòàíîâêà ip
  109.     mov ecx,[b_count]
  110.         cmp ecx,1
  111.         jl .end_funct
  112.     mov edi,[block]
  113.     cld
  114.     @@:
  115.         mov esi,[mem_keys]
  116.         add esi,112
  117.         stdcall fun_convert_bits, edi, esi, oper_ip, 64
  118.         movsd
  119.         movsd
  120.         loop @b
  121.  
  122.     mov ecx,[b_count]
  123.     mov esi,[block]
  124.         ;cld
  125.     .cycle_3:
  126.         mov dword[n],16
  127.         .funct_f:
  128.         dec dword[n]
  129.         mov edi,[mem_keys]
  130.         add edi,112
  131.         ;ïåðåñòàâëÿåì áëîê L0(32) ïî ìàòðèöå e
  132.         add esi,4
  133.         stdcall fun_convert_bits, esi, edi, oper_e, 48
  134.         sub esi,4
  135.    
  136.         ;edi - L0~e (48 áèò)
  137.         ;esi - L0R0 (64 áèòà)
  138.         stdcall fun_r0xorki_si, edi,[mem_keys],[n]
  139.  
  140.         ;edi - (L0~e xor ki)~Si (32 áèòà)
  141.         ;ïåðåñòàíîâêà p
  142.         mov eax,edi
  143.         add eax,4
  144.         stdcall fun_convert_bits, edi, eax, oper_p, 32
  145.  
  146.         ;ïèøåì L0 â R0, è (R0 xor (L0~e xor ki)~Si) â L0
  147.         mov edx,dword[esi]
  148.         mov ebx,dword[esi+4]
  149.         xor edx,dword[eax]
  150.         mov dword[esi+4],edx
  151.         mov dword[esi],ebx
  152.        
  153.         cmp dword[n],0
  154.         jg .funct_f
  155.  
  156.         add esi,8 ;ïåðåõîä íà ñëåäóþùèé 64 áèòíûé øèôðóåìûé áëîê
  157.         loop .cycle_3
  158.  
  159.     ;êîíå÷íàÿ ïåðåñòàíîâêà ip_inv
  160.     mov ecx,[b_count]
  161.     mov edi,[block]
  162.     ;cld
  163.     @@:
  164.         mov esi,[mem_keys]
  165.         add esi,112
  166.         stdcall fun_convert_bits, edi, esi, oper_ip_inv, 64
  167.         movsd
  168.         movsd
  169.         loop @b
  170.  
  171.         .end_funct:
  172. popad
  173.     ret
  174. endp
  175.  
  176. ;description:
  177. ; ïåðåñòàíîâêà áèòîâ ïî óêàùàííîé ìàòðèöå
  178. ;input:
  179. ; m_inp - ïàìÿòü ñ èñõîäíûìè äàííûìè
  180. ; m_out - ïàìÿòü äëÿ ïðåîáðàçîâàííûõ äàííûõ
  181. ; c_tbl - òàáëèöà äëÿ ïåðåñòàíîâêè
  182. ; tbl_s - ðàçìåð òàáëèöû äëÿ ïåðåñòàíîâêè
  183. align 4
  184. proc fun_convert_bits, m_inp:dword, m_out:dword, c_tbl:dword, tbl_s:dword
  185. pushad
  186.     mov esi,[m_inp]
  187.     mov edi,[m_out]
  188.     mov eax,[c_tbl]
  189.     mov ecx,[tbl_s]
  190.     xor edx,edx
  191.     mov dword[edi],edx
  192.     cmp ecx,32
  193.     jle @f
  194.         mov dword[edi+4],edx
  195.     @@:
  196.     inc edx
  197.  
  198.     cld
  199.     .cycle_0:
  200.         movzx ebx,byte[eax]
  201.         btr ebx,5
  202.         jc .tbl_h
  203.  
  204.         bt dword[esi],ebx
  205.         jnc @f
  206.             or dword[edi],edx
  207.         @@:
  208.         jmp @f
  209.         .tbl_h:
  210.         bt dword[esi+4],ebx
  211.         jnc @f
  212.             or dword[edi],edx
  213.         @@:
  214.  
  215.         rol edx,1
  216.         jnc @f
  217.             add edi,4
  218.         @@:
  219.         inc eax
  220.     loop .cycle_0
  221. popad
  222.     ret
  223. endp
  224.  
  225. ;description:
  226. ; ñëîæåíèå R0(48) xor Ki(48) è 8 ïðåîáðàçîâàíèé ïî Si
  227. ;intput:
  228. ; data_r0 - R0 (48 áèò)
  229. ; data_key - óêàçàòåëü íà ìàññèâ êëþ÷åé (ïî 48 áèò)
  230. ; n - íîìåð êëþ÷à â ìàññèâå
  231. ;output:
  232. ; data_r0 - (R0 xor Ki)~Si (32 áèòà)
  233. align 4
  234. proc fun_r0xorki_si, data_r0:dword, data_key:dword, n:dword
  235. pushad
  236.     mov edi,[data_r0]
  237.     mov eax,[n]
  238.     imul eax,7 ;56 áèò - ðàññòîÿíèå ìåæäó êëþ÷àìè (ñàìè êëþ÷è 48 áèò)
  239.     add eax,[data_key]
  240.  
  241.     mov ebx,dword[eax]
  242.     xor dword[edi],ebx
  243.     mov ebx,dword[eax+4] ;mov bx,word[eax+4]
  244.     xor dword[edi+4],ebx ;xor word[edi+4],bx
  245.  
  246.     ;edi - óêàçàòåëü íà çíà÷åíèå R0 xor Ki
  247.     mov eax,dword[edi]
  248.     mov ebx,dword[edi+4]
  249.     ;bx:eax - 48 áèò çíà÷åíèå R0 xor Ki
  250.     lea esi,[oper_s] ;âûáèðàåì òàáëèöó S0
  251.     mov ecx,8
  252.     .cycle_0:
  253.         mov dl,al
  254.         and edx,31
  255.         shr dl,1
  256.         jnc @f
  257.             bts edx,4
  258.         @@:
  259.         bt eax,5
  260.         jnc @f
  261.             bts edx,5
  262.         @@:
  263.         add edx,esi
  264.         mov dl,byte[edx] ;dl - 4 áèòíîå çíà÷åíèå ïîëó÷åííîå èç Si
  265.  
  266.         bt ecx,0
  267.         jc @f
  268.             ;1) ecx - ÷åòíûé
  269.             mov byte[edi],dl
  270.             jmp .next
  271.         @@:
  272.             ;2) ecx - íå ÷åòíûé
  273.             shl dl,4
  274.             or byte[edi],dl
  275.             inc edi
  276.         .next:
  277.  
  278.         shr eax,6
  279.         ror ebx,6
  280.         mov edx,ebx
  281.         and edx,0xfc000000
  282.         or eax,edx
  283.         ;èëè 6 ðàç: shr ebx,1 rcr eax,1
  284.         add esi,64 ;ïåðåõîäèì íà ñëåäóþùóþ òàáëèöó Si
  285.         loop .cycle_0
  286. popad
  287.     ret
  288. endp
  289.  
  290. ;description:
  291. ; ïðîöåäóðà ôîðìèðîâàíèÿ êëþ÷åé äëÿ øèôðîâàíèÿ
  292. ;intput:
  293. ; key - âõîäíîé êëþ÷ 64 áèò
  294. ; key_b - 16 ïðåîáðàçîâàííûõ êëþ÷åé ïî 48 áèò
  295. ;         ðàçìåð ïàìÿòè key_b äîëæåí áûòü íå ìåíüøå 120 áàéò
  296. align 4
  297. proc encryption_key, key:dword, key_b:dword
  298. pushad
  299.     mov esi,[key]
  300.     mov edi,[key_b]
  301.  
  302.     ;ïåðåñòàâëÿåì âõîäíîé êëþ÷ ïî ìàòðèöå
  303.     stdcall fun_convert_bits, esi, edi, oper_b, 56
  304.  
  305.     ;â ebx íàõîäèì C0
  306.     mov ebx,dword[edi]
  307.     and ebx,0xfffffff
  308.     ;â edx íàõîäèì D0
  309.     mov edx,dword[edi+3]
  310.     shr edx,4
  311.  
  312.     ;íàõîäèì 16 ïîäêëþ÷åé, äëèííîé ïî 56 áèò
  313.     ;;;mov edi,[key_b]
  314.     lea esi,[oper_r]
  315.     .cycle_1:
  316.     mov cl,byte[esi]
  317.     cmp cl,0
  318.     je .cycle_end
  319.     shl ebx,cl
  320.     btr ebx,28
  321.     jnc @f
  322.         or ebx,1
  323.     @@:
  324.     btr ebx,29
  325.     jnc @f
  326.         or ebx,2
  327.     @@:
  328.     shl edx,cl
  329.     btr edx,28
  330.     jnc @f
  331.         or edx,1
  332.     @@:
  333.     btr edx,29
  334.     jnc @f
  335.         or edx,2
  336.     @@:
  337.    
  338.     mov dword[edi+3],0
  339.     mov dword[edi],ebx
  340.     shl edx,4
  341.     or dword[edi+3],edx
  342.     add edi,7
  343.     shr edx,4
  344.     inc esi
  345.  
  346.     jmp .cycle_1
  347.     .cycle_end:
  348.  
  349.     ;ñæàòèå êëþ÷åé ñ 56 äî 48 áèò
  350.     mov edi,[key_b]
  351.     mov esi,edi
  352.     add esi,112 ;112 - àäðåñ çà ïðåäåëàìè 16*7
  353.    
  354.     mov ecx,16
  355.     cld
  356.     @@:
  357.         stdcall fun_convert_bits, edi, esi, oper_c, 48
  358.         movsd
  359.         movsw
  360.         mov byte[edi],0 ;îáðåçàåì 7-é áàéò
  361.         inc edi
  362.         sub esi,6
  363.         loop @b
  364.        
  365. popad
  366.     ret
  367. endp
  368.  
  369. align 4
  370. oper_ip db 57,49,41,33,25,17,9,1,59,51,43,35,27,19,11,3,\
  371. 61,53,45,37,29,21,13, 5,63,55,47,39,31,23,15, 7,\
  372. 56,48,40,32,24,16, 8, 0,58,50,42,34,26,18,10, 2,\
  373. 60,52,44,36,28,20,12, 4,62,54,46,38,30,22,14, 6
  374.  
  375. align 4
  376. oper_ip_inv db 39,7,47,15,55,23,63,31,38,6,46,14,54,22,62,30,\
  377. 37, 5,45,13,53,21,61,29,36, 4,44,12,52,20,60,28,\
  378. 35, 3,43,11,51,19,59,27,34, 2,42,10,50,18,58,26,\
  379. 33, 1,41, 9,49,17,57,25,32, 0,40, 8,48,16,56,24
  380.  
  381. align 4
  382. oper_e db 31,0,1,2,3,4,\
  383.  3, 4, 5, 6, 7, 8,\
  384.  7, 8, 9,10,11,12,\
  385. 11,12,13,14,15,16,\
  386. 15,16,17,18,19,20,\
  387. 19,20,21,22,23,24,\
  388. 23,24,25,26,27,28,\
  389. 27,28,29,30,31, 0
  390.  
  391. align 4
  392. oper_b db 56,48,40,32,24,16,8,\
  393.  0,57,49,41,33,25,17,\
  394.  9, 1,58,50,42,34,26,\
  395. 18,10, 2,59,51,43,35,\
  396. 62,54,46,38,30,22,14,\
  397.  6,61,53,45,37,29,21,\
  398. 13, 5,60,52,44,36,28,\
  399. 20,12, 4,27,19,11, 3
  400.  
  401. oper_r db 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1,0
  402.  
  403. align 4
  404. oper_c db 13,16,10,23,0,4,\
  405.  2,27,14, 5,20, 9,\
  406. 22,18,11, 3,25, 7,\
  407. 15, 6,26,19,12, 1,\
  408. 40,51,30,36,46,54,\
  409. 29,39,50,44,32,47,\
  410. 43,48,38,55,33,52,\
  411. 45,41,49,35,28,31
  412.  
  413. align 4
  414. oper_s db 14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7,\
  415.  0,15, 7, 4,14, 2,13,1,10,6,12,11,9,5,3,8,\
  416.  4, 1,14, 8,13, 6,2,11,15,12,9,7,3,10,5,0,\
  417. 15,12, 8, 2, 4, 9,1,7,5,11,3,14,10,0,6,13,\
  418. 15, 1, 8,14, 6,11,3,4,9,7,2,13,12,0,5,10,\
  419.  3,13, 4, 7,15, 2,8,14,12,0,1,10,6,9,11,5,\
  420.  0,14, 7,11,10, 4,13,1,5,8,12,6,9,3,2,15,\
  421. 13, 8,10, 1, 3,15,4,2,11,6,7,12,0,5,14,9,\
  422. 10, 0, 9,14, 6, 3,15,5,1,13,12,7,11,4,2,8,\
  423. 13, 7, 0, 9, 3, 4,6,10,2,8,5,14,12,11,15,1,\
  424. 13, 6, 4, 9, 8,15,3,0,11,1,2,12,5,10,14,7,\
  425.  1,10,13, 0, 6, 9,8,7,4,15,14,3,11,5,2,12,\
  426.  7,13,14, 3, 0, 6,9,10,1,2,8,5,11,12,4,15,\
  427. 13, 8,11, 5, 6,15,0,3,4,7,2,12,1,10,14,9,\
  428. 10, 6, 9, 0,12,11,7,13,15,1,3,14,5,2,8,4,\
  429.  3,15, 0, 6,10, 1,13,8,9,4,5,11,12,7,2,14,\
  430.  2,12, 4, 1, 7,10,11,6,8,5,3,15,13,0,14,9,\
  431. 14,11, 2,12, 4, 7,13,1,5,0,15,10,3,9,8,6,\
  432.  4, 2, 1,11,10,13,7,8,15,9,12,5,6,3,0,14,\
  433. 11, 8,12, 7, 1,14,2,13,6,15,0,9,10,4,5,3,\
  434. 12, 1,10,15, 9, 2,6,8,0,13,3,4,14,7,5,11,\
  435. 10,15, 4, 2, 7,12,9,5,6,1,13,14,0,11,3,8,\
  436.  9,14,15, 5, 2, 8,12,3,7,0,4,10,1,13,11,6,\
  437.  4, 3, 2,12, 9, 5,15,10,11,14,1,7,6,0,8,13,\
  438.  4,11, 2,14,15, 0,8,13,3,12,9,7,5,10,6,1,\
  439. 13, 0,11, 7, 4, 9,1,10,14,3,5,12,2,15,8,6,\
  440.  1, 4,11,13,12, 3,7,14,10,15,6,8,0,5,9,2,\
  441.  6,11,13, 8, 1, 4,10,7,9,5,0,15,14,2,3,12,\
  442. 13, 2, 8, 4, 6,15,11,1,10,9,3,14,5,0,12,7,\
  443.  1,15,13, 8,10, 3,7,4,12,5,6,11,0,14,9,2,\
  444.  7,11, 4, 1, 9,12,14,2,0,6,10,13,15,3,5,8,\
  445.  2, 1,14, 7, 4,10,8,13,15,12,9,0,3,5,6,11
  446.  
  447. align 4
  448. oper_p db 15,6,19,20,28,11,27,16,\
  449.  0,14,22,25, 4,17,30, 9,\
  450.  1, 7,23,13,31,26, 2, 8,\
  451. 18,12,29, 5,21,10, 3,24
  452.  
  453.  
  454. align 16
  455. EXPORTS:
  456.         dd sz_des_encryption, des_encryption
  457.         dd sz_des_decryption, des_decryption
  458.         dd 0,0
  459.         sz_des_encryption db 'des_encryption',0
  460.         sz_des_decryption db 'des_decryption',0
  461.