home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
BBS 1
/
BBS#1.iso
/
document
/
mn195.ha
/
VINOCURO.TXT
< prev
Wrap
Text File
|
1994-12-26
|
34KB
|
1,052 lines
;-----------------------------------------------------
; ÉÑ὿ºáµ¿∩ π¡¿óÑαßá½∞¡«ú« µ¿¬½á Φ¿Σα«óá¡¿∩ á½ú«α¿Γ¼á
; ¬α¿»Γ«úαáΣ¿τÑ߬«ú« »αÑ«íαẫóá¡¿∩ âÄæÆ 28147-89.
; Copyright (C) 1992-1994 é¿¡«¬πα«ó Ç.₧.,ú.î«ß¬óá.
;-----------------------------------------------------
;>Åáαá¼ÑΓαδ »α¿ ó맮óÑ:
; (DX,AX)=N1, (BP,DI)=N2;
; ES:SI - áñαÑß ¬½ετá;
; DS:BX - áñαÑß Γáí½¿µδ ºá¼Ñ¡;
; CX - τ¿ß½« «ß¡«ó¡δσ Φáú«ó
;>ÉѺπ½∞ΓáΓδ ¡á óδσ«ñÑ:
; (BP,DI)=N1, (DX,AX)=N2 ñ½∩ µ¿¬½«ó 32-ç,32-É;
; (DX,AX)=N1, (BP,DI)=N2 ñ½∩ µ¿¬½á 16-ç;
;>êß»«½∞ºπѼδÑ αÑú¿ßΓαδ: éæà
;>çá¼Ñτá¡¿∩:
; é ¬«¡µÑ óδ»«½¡Ñ¡¿∩ ß«ñÑন¼«Ñ αÑú¿ßΓα«ó ß½ÑñπεΘÑÑ:
; BX-(π¬áºáΓѽ∞ Γáí½¿µδ ºá¼Ñ¡) - Γ« ªÑ, τΓ« ó ¡áτá½Ñ
; SI-(π¬áºáΓѽ∞ ¬½ετá) - π¬áºδóáÑΓ ¡á »Ñαóδ⌐ íá⌐Γ ºá
; ¬½ετ«¼ - φΓ« ¡á 32*4=128 í«½∞ΦÑ »Ñαó«¡áτá½∞¡«ú«
; º¡áτÑ¡¿∩ SI ñ½∩ µ¿¬½«ó Φ¿Σα«óá¡¿∩ ¿ ¡á 16*4=64
; í«½∞ΦÑ »Ñαó«¡áτá½∞¡«ú« º¡áτÑ¡¿∩ ñ½∩ µ¿¬½á óδαá-
; í«Γ¬¿ ¿¼¿Γ«»α¿ßΓáó¬¿
; CX=0
; æ«ñÑন¼«Ñ ßÑú¼Ñ¡Γ¡δσ αÑú¿ßΓα«ó ¡Ñ ¿º¼Ñ¡∩ÑΓß∩.
;-----------------------------------------------------
;
.model large,C
.code $gost
gost proc near
public gost
; é¡πΓαÑ¡¡¿⌐ µ¿¬½ αáí«Γδ Å/Å
; 1. ìáτὫ µ¿¬½á ¿ ß«σαá¡Ñ¡¿Ñ ßΓáα«ú« N1
iloop: push DX
push AX
; 2. ä«íáó½Ñ¡¿Ñ ¬ N1 ¬½ετá »« ¼«ñπ½ε 2^32
add AX,ES:[SI]
adc DX,ES:[SI+2]
add SI,4
; 3. Å«í½«τ¡á∩ ºá¼Ñ¡á ó S ß« ßñó¿ú«¼ ¡á 8 í¿Γ ó½Ñó« !
xlat ; »ÑαѬ«ñ¿απѼ AL
xchg AH,AL ; ¿ ¼Ñ¡∩Ѽ Ñú« ß AH
inc BH ; »α«ñó¿úáѼ π¬áºáΓѽ∞ ºá¼Ñ¡δ
xlat ; »ÑαѬ«ñ¿απѼ AH
xchg DL,AL ; ¿ ¼Ñ¡∩Ѽ Ñú« ß DL
inc BH ; »α«ñó¿úáѼ π¬áºáΓѽ∞ ºá¼Ñ¡δ
xlat ; »ÑαѬ«ñ¿απѼ DL
xchg DH,AL ; ¿ ¼Ñ¡∩Ѽ Ñú« ß DH
inc BH ; »α«ñó¿úáѼ π¬áºáΓѽ∞ ºá¼Ñ¡δ
xlat ; »ÑαѬ«ñ¿απѼ DH
sub BH,3 ; BX <- Ñú« »αѪ¡ÑÑ º¡áτÑ¡¿Ñ
; 4. éαáΘÑ¡¿Ñ S ÑΘÑ ¡á 3 í¿Γá ó½Ñó«
REPT 3
shl AX,1
rcl DX,1
adc AX,0
ENDM
; 5. éδτ¿ß½Ñ¡¿Ñ ¡«óδσ º¡áτÑ¡¿⌐ N1,N2
xor DX,BP
xor AX,DI
pop DI
pop BP
; çáóÑαΦÑ¡¿Ñ ó¡πΓαÑ¡¡Ñú« µ¿¬½á
loop iloop
ret
gost endp
end
;-----------------------------------------------------
; ÿ¿Σα«óá¡¿Ñ ¼áßß¿óá ñá¡¡δσ ó αѪ¿¼Ñ »α«ßΓ«⌐ ºá¼Ñ¡δ
; Copyright (C) 1992-1994 é¿¡«¬πα«ó Ç.₧., ú. î«ß¬óá.
;-----------------------------------------------------
; Åáαá¼ÑΓαδ »α¿ ó맮óÑ »ÑαÑñáεΓß∩ ó ßΓφ¬Ñ :
; æ¼ÑΘÑ¡¿Ñ ÉẼÑα Å Ç É Ç î à Æ É
; NEAR FAR
; 2 4 4 FAR-áñαÑß ¬½ετá
; 6 8 4 FAR-áñαÑß í½«¬á ñá¡¡δσ
; 10 12 4 FAR-áñαÑß Γáí½¿µδ ºá¼Ñ¡
; 14 16 2 諽¿τÑßΓó« Φ¿ΣαπѼδσ í½«¬«ó
;-----------------------------------------------------
; Åα¿ óδσ«ñÑ: áñαÑß Φ¿ΣαπѼ«⌐ «í½áßΓ¿ ߬«ααÑ¬Γ¿α«óá¡
; æτÑΓτ¿¬ ñ½¿¡δ = 0
;-----------------------------------------------------
; çáΦ¿Σα«óá¡¿Ñ ¿½¿ αáßΦ¿Σα«óá¡¿Ñ ºáñáÑΓß∩ »ÑαÑñáτÑ⌐
; ß««ΓóÑΓßΓóπεΘÑú« áñαÑßá ¬½ετá - »«α∩ñ«¬ φ½Ñ¼Ñ¡Γ«ó
; ó ¬½ετáσ ºáΦ¿Σα«óá¡¿∩ ¿ αáßΦ¿Σα«óá¡¿∩ óºá¿¼¡«
; «íαáΓ¡δ⌐.
;-----------------------------------------------------
;
.model large,C
.code $gost
extrn gost:near
simple proc
public simple
; óδτ¿ß½∩Ѽ ß¼ÑΘÑ¡¿Ñ »áαá¼ÑΓα«ó ó ßΓφ¬Ñ
a=8 ; 4 αÑú¿ßΓαá ó ßΓφ¬Ñ
IF (TYPE simple) EQ 0FFFEh
a=a+2 ; Ñß½¿ simple - far-»α«µÑñπαá
ENDIF
; çáñáѼ ß¼ÑΘÑ¡¿Ñ áαúπ¼Ñ¡Γ«ó ó ßΓφ¬Ñ
;
key= 2+a ; ß¼ÑΘÑ¡¿Ñ áñαÑßá ¬½ετá
syn= 6+a ; ß¼ÑΘÑ¡¿Ñ áñαÑßá ñá¡¡δσ
chg= 10+a ; ß¼ÑΘÑ¡¿Ñ áñαÑßá Γáí½. ºá¼Ñ¡
len= 14+a ; ß¼ÑΘÑ¡¿Ñ ßτÑΓτ¿¬á í½«¬«ó
;
; æ«σαá¡Ñ¡¿Ñ αÑú¿ßΓα«ó ó ß««ΓóÑΓßΓó¿¿ ß ß«ú½. Turbo C
push BP
push DS ; φΓ« ¡Ñ óßÑúñá «í∩ºáΓѽ∞¡«
push SI
push DI
; ìáßΓα«⌐¬á αáí«τ¿σ αÑú¿ßΓα«ó
mov BP,SP ; ßΓφ¬«óδ⌐ ¬áñα
lds BX,chg[BP] ; Γáí½¿µá ºá¼Ñ¡
; çáúαπº¬á í½«¬á ó αÑú¿ßΓαδ
circle: les SI,syn[BP] ; ºáúαπº¬á áñα.ß-»«c佬¿
mov AX,ES:[SI] ; AX <- ¼½áñΦÑÑ ß½«ó« N1
mov DX,ES:2[SI] ; DX <- ßΓáαΦÑÑ ß½«ó« N1
mov DI,ES:4[SI] ; DI <- ¼½áñΦÑÑ ß½«ó« N2
mov CX,ES:6[SI] ; CX <- ßΓáαΦÑÑ ß½«ó« N2
; â«Γ«ó¿¼ αÑú¿ßΓαδ ¿ óδºδóáѼ »α«ßΓπε ºá¼Ñ¡π
les SI,key[BP]
mov BP,CX
mov CX,32
call gost
mov CX,BP
mov BP,SP
; çỿß∞ αѺπ½∞ΓáΓá ¡á ¼ÑßΓ«
les SI,syn[BP] ; ºáúαπº¬á áñαÑßá ß¿¡σα«»«»δ½¬¿
mov ES:[SI],DI ; º á ¡ « ß ¿ ¼
mov ES:2[SI],CX ; α Ñ º π ½ ∞ Γ á Γ
mov ES:4[SI],AX ; ¡ á Ñ ú «
mov ES:6[SI],DX ; ¼ Ñ ß Γ « !!!
; Åα«óÑα¬á ¡á ¬«¡Ñµ µ¿¬½á
dec WORD PTR len[BP]; ¬«ααѬµ¿∩ ßτÑΓτ¿¬á
jnz circle ; µ¿¬½¿¼ß∩
; é«ßßΓá¡«ó½Ñ¡¿Ñ αÑú¿ßΓα«ó
pop DI
pop SI
pop DS
pop BP
ret
simple endp
end
;------------------------------------------------------
; ÿ¿Σα«óá¡¿Ñ ¼áßß¿óá ñá¡¡δσ ó αѪ¿¼Ñ úá¼¼¿α«óá¡¿∩
; ß«ú½áß¡« ¬α¿»Γ«á½ú«α¿Γ¼π âÄæÆ 28147-89
; Copyright (C) 1992-1994 é¿¡«¬πα«ó Ç.₧., ú. î«ß¬óá.
;------------------------------------------------------
; Åáαá¼ÑΓαδ »α¿ ó맮óÑ »ÑαÑñáεΓß∩ ó ßΓφ¬Ñ :
; æ¼ÑΘÑ¡¿Ñ ÉẼÑα Å Ç É Ç î à Æ É
;NEAR FAR
; 2 4 4 FAR-áñαÑß ¬½ετá
; 6 8 4 FAR-áñαÑß ß¿¡σα«»«ß佬¿ (S1,S2)
; 10 12 4 FAR-áñαÑß Γáí½¿µδ ºá¼Ñ¡
; 14 16 4 FAR-áñαÑß «í½áßΓ¿ ¡áº¡áτÑ¡¿∩
; 18 20 2 τ¿ß½« Φ¿ΣαπѼδσ í½«¬«ó
;------------------------------------------------------
; Åα¿ óδσ«ñÑ: áñαÑß «í½áßΓ¿ ¡áº¡áτÑ¡¿∩ ¿ ñ½¿¡á
; ß«ñÑαªáΓ ß¬«ααÑ¬Γ¿α«óá¡¡δÑ »áαá¼ÑΓαδ
;------------------------------------------------------
; «»αÑñѽ∩Ѽ ¬«¡ßΓá¡Γδ C1,C2 »« âÄæÆ
;
C1low equ 0101h
C1high equ 0101h
C2low equ 0104h
C2high equ 0101h
;
.model large,C
.code $gost
extrn gost:near
gamma proc
public gamma
; óδτ¿ß½∩Ѽ ß¼ÑΘÑ¡¿Ñ »áαá¼ÑΓα«ó ó ßΓφ¬Ñ
a=8 ; 4 αÑú¿ßΓαá ó ßΓφ¬Ñ
IF (TYPE gamma) EQ 0FFFEh
a=a+2 ; Ñß½¿ gamma - far-»α«µÑñπαá
ENDIF
; çáñáѼ ß¼ÑΘÑ¡¿Ñ áαúπ¼Ñ¡Γ«ó ó ßΓφ¬Ñ
;
key= 2+a
syn= 6+a
chg= 10+a
con= 14+a
tar= 14+a
len= 18+a
;
; æ«σαá¡Ñ¡¿Ñ αÑú¿ßΓα«ó ß«ú½áß¡« ß«ú½áΦÑ¡¿∩¼ Turbo C
push BP
push DS ; φΓ« ¡πª¡« ¡Ñ óßÑúñá !
push SI
push DI
; ¡áßΓα«⌐¬á αÑú¿ßΓα«ó
mov BP,SP ; ßΓφ¬«óδ⌐ ¬áñα
lds BX,chg[BP] ; DS:BX <- áñαÑß Γáí½.ºá¼Ñ¡
; ä«íáó½Ñ¡¿Ñ ¬«¡ßΓá¡Γ
circle: les SI,syn[BP] ; áñαÑß ß¿¡σα«»«»δ½¬¿
mov AX,ES:[SI] ; AX <- ¼½áñΦÑÑ ß½«ó« S1
mov DX,ES:2[SI] ; DX <- ßΓáαΦÑÑ ß½«ó« S1
mov DI,ES:4[SI] ; DI <- ¼½áñΦÑÑ ß½«ó« S2
mov CX,ES:6[SI] ; CX <- ßΓáαΦÑÑ ß½«ó« S2
add AX,C1low ; ¿º¼Ñ¡Ñ¡¿Ñ S1:
adc DX,C1high ; S1=(S1+C1) mod 2^32
stc ; ñ½∩ ñ«íáó½Ñ¡¿Ñ 1 ¬ N2
adc DI,C2low ; ¿º¼Ñ¡Ñ¡¿Ñ S2:
adc CX,C2high ; S2=(S2+C2) mod (2^32-1)
cmc ; Ñß½¿ ¡Ñ í佫 »ÑαÑ¡«ßá,Γ«
sbb DI,0 ; ¡Ñ ßΓ«¿½« ñ«íáó½∩Γ∞ 1,
sbb CX,0 ; »«φΓ«¼π S2=S2-1
mov ES:[SI],AX ; ºá¡«ß¿¼ ¡«óδÑ
mov ES:2[SI],DX ; º¡áτÑ¡¿∩ S1,S2
mov ES:4[SI],DI ; ¡á ¿σ
mov ES:6[SI],CX ; ¼ÑßΓ« !!!
; â«Γ«ó¿¼ αÑú¿ßΓαδ ñ½∩ ó맮óá µ¿¬½á 32-ç;
les SI,key[BP] ; ES:SI <- áñαÑß ¬½ετá
mov BP,CX ; BP <- ßΓáαΦÑÑ ß½«ó« S2
mov CX,32 ; CX <- τ¿ß½« «ß¡«ó¡. Φáú«ó
call gost ; Φáú »α«ßΓ«⌐ ºá¼Ñ¡δ
mov CX,BP ; CX <- ßΓáαΦÑÑ ß½«ó« S2
mov BP,SP ; BP <- ßΓѬ«óδ⌐ ¬áñα
; êß»«½∞º«óá¡¿Ñ ßúÑ¡Ñα¿α«óá¡¡«ú« í½«¬á úá¼¼δ
les SI,tar[BP] ; DS:SI<-áñαÑß ¡áº¡áτÑ¡¿∩
xor ES:[SI],DI ; âá¼¼¿απѼ
xor ES:2[SI],CX ; 8-íá⌐Γ¡δ⌐
xor ES:4[SI],AX ; í½«¬
xor ES:6[SI],DX ; ñá¡¡δσ
add word ptr tar[BP],8; ¬«ααѬµ¿∩ π¬áºáΓѽ∩
dec word ptr len[BP] ; ¬«ααѬµ¿∩ ßτÑΓτ¿¬á
jnz circle ; ¡á úÑ¡Ñαáµ¿ε ¡«ó«ú« í½«¬á
; é«ßßΓá¡«ó½Ñ¡¿Ñ αÑú¿ßΓα«ó ¿º ßΓφ¬á
pop DI
pop SI
pop DS
pop BP
ret
gamma endp
end
;------------------------------------------------------
; çáΦ¿Σα«óá¡¿Ñ ¼áßß¿óá ñá¡¡δσ ó αѪ¿¼Ñ úá¼¼¿α«óá¡¿∩ ß
; «íαáΓ¡«⌐ ßó∩º∞ε ß«ú½áß¡« á½ú«α¿Γ¼π âÄæÆ 28147-89
; Copyright (C) 1992-1994 é¿¡«¬πα«ó Ç.₧., ú. î«ß¬óá.
;------------------------------------------------------
; Åáαá¼ÑΓαδ »α¿ ó맮óÑ »ÑαÑñáεΓß∩ ó ßΓφ¬Ñ :
; æ¼ÑΘÑ¡¿Ñ ÉẼÑα Å Ç É Ç î à Æ É
;NEAR FAR
; 2 4 4 FAR-áñαÑß ¬½ετá
; 6 8 4 FAR-áñαÑß ß¿¡σα«»«ß佬¿ (S1,S2)
; 10 12 4 FAR-áñαÑß Γáí½¿µδ ºá¼Ñ¡
; 14 16 4 FAR-áñαÑß «í½áßΓ¿ ¡áº¡áτÑ¡¿∩
; 18 20 2 τ¿ß½« Φ¿ΣαπѼδσ í½«¬«ó
;------------------------------------------------------
; Åα¿ óδσ«ñÑ: áñαÑß «í½áßΓ¿ ¡áº¡áτÑ¡¿∩ ¿ ß¿¡σα«»«ß佬á
; ß«ñÑαªáΓ ß¬«ααÑ¬Γ¿α«óá¡¡δÑ »áαá¼ÑΓαδ, ßτÑΓτ¿¬ = 0
;------------------------------------------------------
;
.model large,C
.code $gost
extrn gost:near
gammaLE proc
public gammaLE
; óδτ¿ß½∩Ѽ ß¼ÑΘÑ¡¿Ñ »áαá¼ÑΓα«ó ó ßΓφ¬Ñ
a=8 ; 4 αÑú¿ßΓαá ó ßΓφ¬Ñ
IF (TYPE gammaLE) EQ 0FFFEh
a=a+2 ; Ñß½¿ gamma - far-»α«µÑñπαá
ENDIF
; çáñáѼ ß¼ÑΘÑ¡¿Ñ áαúπ¼Ñ¡Γ«ó ó ßΓφ¬Ñ
;
key= 2+a
syn= 6+a
chg= 10+a
tar= 14+a
len= 18+a
;
; æ«σαá¡Ñ¡¿Ñ αÑú¿ßΓα«ó ß«ú½áß¡« ß«ú½áΦÑ¡¿∩¼ Turbo C
push BP
push DS ; φΓ« ¡πª¡« ¡Ñ óßÑúñá !
push SI
push DI
; ä«íáó½Ñ¡¿Ñ ¬«¡ßΓá¡Γ
mov BP,SP ; ¡áßΓα«⌐¬á ßΓφ¬«ó«ú« ¬áñαá
lds SI,syn[BP] ; DS:SI -> ß¿¡σα«»«»δ½¬á
mov AX,[SI] ; AX <= ¼½áñΦÑÑ ß½«ó« S1
mov DX,2[SI] ; DX <= ßΓáαΦÑÑ ß½«ó« S1
mov DI,4[SI] ; DI <= ¼½áñΦÑÑ ß½«ó« S2
mov CX,6[SI] ; CX <= ßΓáαΦÑÑ ß½«ó« S2
lds BX,chg[BP] ; DS:BX <- áñαÑß Γáí½.ºá¼Ñ¡
; â«Γ«ó¿¼ αÑú¿ßΓαδ ¿ óδºδóáѼ µ¿¬½ 32-ç
circle: les SI,key[BP] ; ES:SI <- áñαÑß ¬½ετá
mov BP,CX ; BP <- ßΓáαΦÑÑ ß½«ó« S2
mov CX,32 ; CX <- τ¿ß½« «ß¡«ó¡. Φáú«ó
call gost ; Φáú »α«ßΓ«⌐ ºá¼Ñ¡δ
mov CX,BP ; CX <- ßΓáαΦÑÑ ß½«ó« S2
mov BP,SP ; BP <- ßΓѬ«óδ⌐ ¬áñα
; êß»«½∞º«óá¡¿Ñ ßúÑ¡Ñα¿α«óá¡¡«ú« í½«¬á úá¼¼δ
les SI,tar[BP] ; DS:SI<-áñαÑß ¡áº¡áτÑ¡¿∩
; íπñÑΓ á½∞ΓÑα¡áΓ¿óá
xor DI,ES:[SI] ; âá¼¼¿απѼ
xor CX,ES:2[SI] ; 8-íá⌐Γ¡δ⌐
xor AX,ES:4[SI] ; í½«¬
xor DX,ES:6[SI] ; ñá¡¡δσ
mov ES:[SI],DI ; ¿ ºá»¿ßδóáѼ
mov ES:2[SI],CX ; Ñú«
mov ES:4[SI],AX ; ¡á ¡πª¡«Ñ
mov ES:6[SI],DX ; ¼ÑßΓ«
xchg AX,DI ; «í¼Ñ¡ º¡áτÑ¡¿∩¼¿
xchg DX,CX ; S1 <--> S2
; á½∞ΓÑα¡áΓ¿óá »«ß½Ññ¡¿¼ 10 ßΓ᫬á¼:¬«α«τÑ,¡« ¼Ññ½Ñ¡¡ÑÑ
; ¡á »α«µÑßß«αáσ 8086,8088.
; xor ES:[SI],DI ; âá¼¼¿απѼ
; xor ES:2[SI],CX ; 8-íá⌐Γ¡δ⌐
; xor ES:4[SI],AX ; í½«¬
; xor ES:6[SI],DX ; ñá¡¡δσ
; mov AX,ES:[SI] ; ºáúαπªáѼ
; mov DX,ES:2[SI] ; í½«¬ ñ½∩
; mov DI,ES:4[SI] ; ß½ÑñπεΘÑú«
; mov CX,ES:6[SI] ; Φáúá
; á½∞ΓÑα¡áΓ¿óá ºá¬«¡τÑ¡á
add word ptr tar[BP],8; ¬«ααѬµ¿∩ π¬áºáΓѽ∩
dec word ptr len[BP] ; ¬«ααѬµ¿∩ ßτÑΓτ¿¬á
jnz circle ; ¡á úÑ¡Ñαáµ¿ε ¡«ó«ú« í½«¬á
; ºá¡«ß¿¼ ¡«ó«Ñ º¡áτÑ¡¿Ñ ß¿¡σα«»«ß佬¿ ¡á Ñú« ¼ÑßΓ«
; (φΓ« ¡πª¡« ñ½∩ «íαáí«Γ¬¿ ¼áßß¿óá ñá¡¡δσ τáßΓ∩¼¿)
lds SI,syn[BP] ; DS:SI -> ß¿¡σα«»«ß佬á
mov [SI],AX ; ºá¡«ß¿¼ ¡«óδÑ
mov 2[SI],DX ; º¡áτÑ¡¿∩ S1,S2
mov 4[SI],DI ; ¡á ¿σ
mov 6[SI],CX ; ¼ÑßΓ« !!!
; é«ßßΓá¡«ó½Ñ¡¿Ñ αÑú¿ßΓα«ó ¿º ßΓφ¬á
pop DI
pop SI
pop DS
pop BP
ret
gammaLE endp
end
;------------------------------------------------------
; ÉáßΦ¿Σα«óá¡¿Ñ ¼áßß¿óá ñá¡¡δσ ó αѪ¿¼Ñ úá¼¼¿α«óá¡¿∩ ß
; «íαáΓ¡«⌐ ßó∩º∞ε ß«ú½áß¡« á½ú«α¿Γ¼π âÄæÆ 28147-89
; Copyright (C) 1992-1994 é¿¡«¬πα«ó Ç.₧., ú. î«ß¬óá.
;------------------------------------------------------
; Åáαá¼ÑΓαδ »α¿ ó맮óÑ »ÑαÑñáεΓß∩ ó ßΓφ¬Ñ :
; æ¼ÑΘÑ¡¿Ñ ÉẼÑα Å Ç É Ç î à Æ É
;NEAR FAR
; 2 4 4 FAR-áñαÑß ¬½ετá
; 6 8 4 FAR-áñαÑß ß¿¡σα«»«ß佬¿ (S1,S2)
; 10 12 4 FAR-áñαÑß Γáí½¿µδ ºá¼Ñ¡
; 14 16 4 FAR-áñαÑß «í½áßΓ¿ ¡áº¡áτÑ¡¿∩
; 18 20 2 τ¿ß½« Φ¿ΣαπѼδσ í½«¬«ó
;------------------------------------------------------
; Åα¿ óδσ«ñÑ: áñαÑß «í½áßΓ¿ ¡áº¡áτÑ¡¿∩ ¿ ß¿¡σα«»«ß佬á
; ß«ñÑαªáΓ ß¬«ααÑ¬Γ¿α«óá¡¡δÑ »áαá¼ÑΓαδ, ßτÑΓτ¿¬ = 0
;------------------------------------------------------
;
.model large,C
.code $gost
extrn gost:near
gammaLD proc
public gammaLD
; óδτ¿ß½∩Ѽ ß¼ÑΘÑ¡¿Ñ »áαá¼ÑΓα«ó ó ßΓφ¬Ñ
a=8 ; 4 αÑú¿ßΓαá ó ßΓφ¬Ñ
IF (TYPE gammaLD) EQ 0FFFEh
a=a+2 ; Ñß½¿ gamma - far-»α«µÑñπαá
ENDIF
; çáñáѼ ß¼ÑΘÑ¡¿Ñ áαúπ¼Ñ¡Γ«ó ó ßΓφ¬Ñ
;
key= 2+a
syn= 6+a
chg= 10+a
tar= 14+a
len= 18+a
;
; æ«σαá¡Ñ¡¿Ñ αÑú¿ßΓα«ó ß«ú½áß¡« ß«ú½áΦÑ¡¿∩¼ Turbo C
push BP
push DS ; φΓ« ¡πª¡« ¡Ñ óßÑúñá !
push SI
push DI
; çáúαπº¬á αÑú¿ßΓα«ó ñ½∩ ó맮óá µ¿¬½á Φ¿Σα«óá¡¿∩
mov BP,SP ; ¡áßΓα«⌐¬á ßΓφ¬«ó«ú« ¬áñαá
lds SI,syn[BP] ; DS:SI -> ß¿¡σα«»«»δ½¬á
mov AX,[SI] ; AX <= ¼½áñΦÑÑ ß½«ó« S1
mov DX,2[SI] ; DX <= ßΓáαΦÑÑ ß½«ó« S1
mov DI,4[SI] ; DI <= ¼½áñΦÑÑ ß½«ó« S2
mov CX,6[SI] ; CX <= ßΓáαΦÑÑ ß½«ó« S2
lds BX,chg[BP] ; DS:BX <- áñαÑß Γáí½.ºá¼Ñ¡
; â«Γ«ó¿¼ αÑú¿ßΓαδ ñ½∩ ó맮óá µ¿¬½á 32-ç;
circle: les SI,key[BP] ; ES:SI <- áñαÑß ¬½ετá
mov BP,CX ; BP <- ßΓáαΦÑÑ ß½«ó« S2
mov CX,32 ; CX <- τ¿ß½« «ß¡«ó¡. Φáú«ó
call gost ; Φáú »α«ßΓ«⌐ ºá¼Ñ¡δ
mov CX,BP ; CX <- ßΓáαΦÑÑ ß½«ó« S2
mov BP,SP ; BP <- ßΓѬ«óδ⌐ ¬áñα
; êß»«½∞º«óá¡¿Ñ ßúÑ¡Ñα¿α«óá¡¡«ú« í½«¬á úá¼¼δ
les SI,tar[BP] ; DS:SI<-áñαÑß ¡áº¡áτÑ¡¿∩
xor DI,ES:[SI] ; âá¼¼¿απѼ
xor CX,ES:2[SI] ; 8-íá⌐Γ¡δ⌐
xor AX,ES:4[SI] ; í½«¬
xor DX,ES:6[SI] ; ñá¡¡δσ
xchg ES:[SI],DI ; ¼Ñ¡∩Ѽ
xchg ES:2[SI],CX ; Ñú« ß
xchg ES:4[SI],AX ; í½«¬«¼
xchg ES:6[SI],DX ; Φ¿Σα«ΓѬßΓá
xchg AX,DI ; «í¼Ñ¡ º¡áτÑ¡¿∩¼¿
xchg DX,CX ; S1 <--> S2
add word ptr tar[BP],8; ¬«ααѬµ¿∩ π¬áºáΓѽ∩
dec word ptr len[BP] ; ¬«ααѬµ¿∩ ßτÑΓτ¿¬á
jnz circle ; ¡á úÑ¡Ñαáµ¿ε ¡«ó«ú« í½«¬á
; ºá¡«ß¿¼ ¡«ó«Ñ º¡áτÑ¡¿Ñ ß¿¡σα«»«ß佬¿ ¡á Ñú« ¼ÑßΓ«
; (φΓ« ¡πª¡« ñ½∩ «íαáí«Γ¬¿ ¼áßß¿óá ñá¡¡δσ τáßΓ∩¼¿)
lds SI,syn[BP] ; DS:SI -> ß¿¡σα«»«ß佬á
mov [SI],AX ; ºá¡«ß¿¼ ¡«óδÑ
mov 2[SI],DX ; º¡áτÑ¡¿∩ S1,S2
mov 4[SI],DI ; ¡á ¿σ
mov 6[SI],CX ; ¼ÑßΓ« !!!
; é«ßßΓá¡«ó½Ñ¡¿Ñ αÑú¿ßΓα«ó ¿º ßΓφ¬á
pop DI
pop SI
pop DS
pop BP
ret
gammaLD endp
end
;------------------------------------------------------
; éδαáí«Γ¬á ¿¼¿Γ«»α¿ßΓáó¬¿ ñ½∩ ¼áßß¿óá ñá¡¡δσ ß«ú½áß¡«
; á½ú«α¿Γ¼π âÄæÆ 28147-89
; Copyright (C) 1992-1994 é¿¡«¬πα«ó Ç.₧., ú. î«ß¬óá.
;------------------------------------------------------
; Åáαá¼ÑΓαδ »α¿ ó맮óÑ »ÑαÑñáεΓß∩ ó ßΓφ¬Ñ :
; æ¼ÑΘÑ¡¿Ñ ÉẼÑα Å Ç É Ç î à Æ É
;NEAR FAR
; 2 4 4 FAR-áñαÑß ¬½ετá
; 6 8 4 FAR-áñαÑß ¿ßσ«ñ¡«⌐ ¬«¼í¿¡áµ¿¿
; 10 12 4 FAR-áñαÑß Γáí½¿µδ ºá¼Ñ¡
; 14 16 4 FAR-áñαÑß «í½áßΓ¿ ¡áº¡áτÑ¡¿∩
; 18 20 2 τ¿ß½« ßó«αáτ¿óáѼδσ í½«¬«ó
;------------------------------------------------------
; Åα¿ óδσ«ñÑ: áñαÑß «í½áßΓ¿ ñá¡¡δσ ¿ ¬«¡Γα«½∞¡á∩ ¬«¼í¿-
; ¡áµ¿∩ ß«ñÑαªáΓ ß¬«ααÑ¬Γ¿α«óá¡¡δÑ »áαá¼ÑΓαδ, ßτÑΓτ¿¬=0
; DX:AX ß«ñÑαª¿Γ ¼½áñΦÑÑ ñó«⌐¡«Ñ ß½«ó« ¬«¡Γα«½∞¡«⌐
; ¬«¼í¿¡áµ¿¿, ¿ß»«½∞ºπѼ«Ñ «íδτ¡« ¬á¬ ¿¼¿Γ«»α¿ßΓáó¬á -
; ß««ΓóÑΓßΓóπÑΓ ó«ºóαáΓπ Γ¿»á Item (=unsigned long).
;------------------------------------------------------
;
.model large,C
.code $gost
extrn gost:near
imito proc
public imito
; óδτ¿ß½∩Ѽ ß¼ÑΘÑ¡¿Ñ »áαá¼ÑΓα«ó ó ßΓφ¬Ñ
a=8 ; 4 αÑú¿ßΓαá ó ßΓφ¬Ñ
IF (TYPE imito) EQ 0FFFEh
a=a+2 ; Ñß½¿ gamma - far-»α«µÑñπαá
ENDIF
; çáñáѼ ß¼ÑΘÑ¡¿Ñ áαúπ¼Ñ¡Γ«ó ó ßΓφ¬Ñ
;
key= 2+a
syn= 6+a
chg= 10+a
tar= 14+a
len= 18+a
;
; æ«σαá¡Ñ¡¿Ñ αÑú¿ßΓα«ó ß«ú½áß¡« ß«ú½áΦÑ¡¿∩¼ Turbo C
push BP
push DS ; φΓ« ¡πª¡« ¡Ñ óßÑúñá !
push SI
push DI
; çáúαπªáѼ º¡áτÑ¡¿Ñ ¬«¼í¿¡áµ¿¿ «Γ »α«Φ½«ú« αáºá
mov BP,SP ; ¡áßΓα«⌐¬á ßΓφ¬«ó«ú« ¬áñαá
lds SI,syn[BP] ; DS:SI -> ß¿¡σα«»«»δ½¬á
mov AX,[SI] ; AX <= ¼½áñΦÑÑ ß½«ó« S1
mov DX,2[SI] ; DX <= ßΓáαΦÑÑ ß½«ó« S1
mov DI,4[SI] ; DI <= ¼½áñΦÑÑ ß½«ó« S2
mov CX,6[SI] ; CX <= ßΓáαΦÑÑ ß½«ó« S2
lds BX,chg[BP] ; DS:BX <- áñαÑß Γáí½.ºá¼Ñ¡
; ä«íáó½∩Ѽ í½«¬ ñá¡¡δσ
circle: les SI,tar[BP] ; DS:SI<-áñαÑß ¡áº¡áτÑ¡¿∩
xor AX,ES:[SI] ; âá¼¼¿απѼ
xor DX,ES:2[SI] ; 8-íá⌐Γ¡δ⌐
xor DI,ES:4[SI] ; í½«¬
xor CX,ES:6[SI] ; ñá¡¡δσ
; â«Γ«ó¿¼ αÑú¿ßΓαδ ¿ óδºδóáѼ µ¿¬½ 32-ç
les SI,key[BP] ; ES:SI <- áñαÑß ¬½ετá
mov BP,CX ; BP <- ßΓáαΦÑÑ ß½«ó« S2
mov CX,16 ; CX <- τ¿ß½« «ß¡«ó¡. Φáú«ó
call gost ; Φáú »α«ßΓ«⌐ ºá¼Ñ¡δ
mov CX,BP ; CX <- ßΓáαΦÑÑ ß½«ó« S2
mov BP,SP ; BP <- ßΓѬ«óδ⌐ ¬áñα
add word ptr tar[BP],8; ¬«ααѬµ¿∩ π¬áºáΓѽ∩
dec word ptr len[BP] ; ¬«ααѬµ¿∩ ßτÑΓτ¿¬á
jnz circle ; ¡á úÑ¡Ñαáµ¿ε ¡«ó«ú« í½«¬á
; ºá¡«ß¿¼ ¡«ó«Ñ º¡áτÑ¡¿Ñ ¬«¼í¿¡áµ¿¿ ¡á Ñú« ¼ÑßΓ«
; (φΓ« ¡πª¡« ñ½∩ «íαáí«Γ¬¿ ¼áßß¿óá ñá¡¡δσ τáßΓ∩¼¿)
les SI,syn[BP] ; DS:SI -> ß¿¡σα«»«ß佬á
mov ES:[SI],AX ; ºá¡«ß¿¼ ¡«óδÑ
mov ES:2[SI],DX ; º¡áτÑ¡¿∩ S1,S2
mov ES:4[SI],DI ; ¡á ¿σ
mov ES:6[SI],CX ; ¼ÑßΓ« !!!
; é«ßßΓá¡«ó½Ñ¡¿Ñ αÑú¿ßΓα«ó ¿º ßΓφ¬á
pop DI
pop SI
pop DS
pop BP
ret
imito endp
end
/*-----------------------------------------------------
Å«ßΓα«Ñ¡¿Ñ αáßΦ¿αÑ¡¡«⌐ Γáí½¿µδ ºá¼Ñ¡ (1024 üá⌐Γ) ¿º
Γáí½¿µδ ºá¼Ñ¡ (128 üá⌐Γ) á½ú«α¿Γ¼á âÄæÆ 28147-89.
Copyright (C) 1992-1994 é¿¡«¬πα«ó Ç.₧., ú. î«ß¬óá.
-----------------------------------------------------
Åáαá¼ÑΓαδ »α¿ ó맮óÑ:
source - áñαÑß Γáí½¿µδ ºá¼Ñ¡ ó ¿ßσ«ñ¡«¼ Σ«α¼áΓÑ
target - áñαÑß «í½áßΓ¿ ñ½∩ αáßΦ¿αÑ¡¡«⌐ Γáí½¿µδ
-----------------------------------------------------
*/
#pragma inline
#include <dos.h> // FP_SEG,FP_OFF
void ExpCht (void far *source, void far *target)
{
// ìáßΓα«⌐¬á αÑú¿ßΓα«ó ñ½∩ αáí«Γδ Å/Å
asm push DS
_DS= FP_SEG (source);
_SI= FP_OFF (source);
_ES= FP_SEG (target);
_DI= FP_OFF (target);
asm {
cld // ¡á»αáó½Ñ¡¿Ñ »α«ß¼«Γαá
// û¿¬½ »« í½«¬á¼ Γáí½¿µδ ºá¼Ñ¡
mov CX,4 // ºáúαπº¿Γ∞ ßτÑΓτ¿¬ í½«¬«ó
}
blocks: asm {
mov BX,SI // BX<-áñαÑß ¡áτá½á ½¿¡¿¿
add BX,10h // ßΓáαΦ¿σ íá⌐Γ«ó í½«¬á
// û¿¬½ »« ½¿¡¿∩¼ í½«¬á
push CX // ß«σαá¡¿Γ∞ ßτÑΓτ¿¬ í½«¬«ó
mov CX,16 // ºáúαπº¿Γ∞ ßτÑΓτ¿¬ ½¿¡¿⌐
}
lines: asm {
push SI // ß«σα. π¬áº. ΓѬπΘ. í½«¬á
mov AH,[BX] // AH <- ßΓáαΦ¿⌐ »«½πíá⌐Γ
push CX // ß«σαá¡¿Γ∞ ßτÑΓτ¿¬ ½¿¡¿⌐
mov CL,4 // ßñó¿ú »«½πíá⌐Γá ¡á ¼ÑßΓ«
shl AH,CL // ßΓáαΦÑú« »«½πíá⌐Γá
// û¿¬½ »« íá⌐Γá¼ ½¿¡¿¿
mov CX,16 // ºáúαπº¿Γ∞ ßτÑΓτ¿¬ íá⌐Γ«ó
}
bytes: asm {
lodsb // ºáúαπº¿Γ∞ «τÑαÑñ¡«⌐ íá⌐Γ
or AL,AH // ñ«íáó¿Γ∞ ßΓáαΦ¿⌐ »«½πíá⌐Γ
stosb // ... ¿ ºá»¿ßáΓ∞ αѺπ½∞ΓáΓ
loop bytes // µ¿¬½ »« íá⌐Γá¼ ½¿¡¡¿
// Åα«óÑα¬á µ¿¬½á »« ½¿¡¿∩¼
pop CX // ó«ßßΓá¡«ó. ßτÑΓτ¿¬ ½¿¡¿⌐
pop SI // ó«ßßΓ. π¬áºáΓ. ΓѬ. í½«¬á
inc BX // »α«ñó¿¡πΓ∞ π¬áºáΓѽ∞ íá⌐Γ
loop lines // µ¿¬½ »« ßΓα«¬á¼ Γáí½¿µδ
// Åα«óÑα¬á µ¿¬½á »« í½«¬á¼
pop CX // ó«ßßΓá¡«ó. ßτÑΓτ¿¬ í½«¬«ó
add SI,20h // »α«ñó¿¡πΓ∞ π¬áºáΓ. í½«¬á
loop blocks // µ¿¬½ »« í½«¬á¼
}
asm pop DS
return ;
}
/*-----------------------------------------------------
Å«ßΓα«Ñ¡¿Ñ αáßΦ¿αÑ¡¡ú« ¬½ετá ºáΦ¿Σα«óá¡¿∩ (128 íá⌐Γ)
¿º ¬½ετá (32 íá⌐Γá) ¬α¿»Γ«á½ú«α¿Γ¼á âÄæÆ 28147-89.
Copyright (C) 1992-1994 é¿¡«¬πα«ó Ç.₧., ú. î«ß¬óá.
-----------------------------------------------------
Åáαá¼ÑΓαδ »α¿ ó맮óÑ:
source - FAR-áñαÑß ¬½ετá ó ¿ßσ«ñ¡«¼ Σ«α¼áΓÑ
target - FAR-áñαÑß «í½áßΓ¿ ñ½∩ αáßΦ¿αÑ¡¿∩ ¬½ετá
æσѼá αáßΦ¿αÑ¡¿∩ 3+1: 3 αáºá ó»ÑαÑñ, 1 αẠ¡áºáñ
-----------------------------------------------------
*/
#pragma inline
#include <dos.h>
void ExpKey31 (void far *source, void far *target)
{
// ìáßΓα«⌐¬á αÑú¿ßΓα«ó ñ½∩ αáí«Γδ Å/Å
asm push DS
_DS= FP_SEG (source);
_SI= FP_OFF (source);
_ES= FP_SEG (target);
_DI= FP_OFF (target);
asm {
cld // ¡á»αáó½Ñ¡¿Ñ »α«ß¼«Γαá
; Æα¿ »α∩¼δσ í½«¬á
mov CX,16 // ¬«»¿α«óáΓ∞
rep movsw // »Ñαóδ⌐
sub SI,32 // í½«¬
mov CX,16 // ¬«»¿α«óáΓ∞
rep movsw // óΓ«α«⌐
sub SI,32 // í½«¬
mov CX,16 // ¬«»¿α«óáΓ∞
rep movsw // ΓαÑΓ¿⌐ í½«¬
; «ñ¿¡ «íαáΓ¡δ⌐ í½«¬
mov CX,8 // ßτÑΓτ¿¬ ñó«⌐¡δσ ß½«ó
}
xlp: asm {
sub SI,4 // π¬áºáΓѽ∞ ñó«⌐¡. ß½«óá
mov AX,[SI] // ºáúαπº¿Γ∞ ¼½áñΦ. ß½«ó«
stosw // ... ¿ ºá»«¼¡¿Γ∞ Ñú«
mov AX,2[SI]// ºáúαπº¿Γ∞ ßΓáαΦ. ß½«ó«
stosw // ... ¿ ºá»«¼¡¿Γ∞ Ñú«
loop xlp // µ¿¬½ »« ñó«⌐¡δ¼ ß½«óá¼
pop DS
}
return ;
}/*----------------------------------------------------
gost.h -- «»¿ßá¡¿∩ ñá¡¡δσ ¿ »α«Γ«Γ¿¿»δ Σπ¡¬µ¿⌐ Φ¿Σ-
α«óá¡¿∩.
----------------------------------------------------
éÑαß¿∩ 1.00 «Γ 25.06.94, (c) 1994 é¿¡«¬πα«ó Ç.₧.
----------------------------------------------------
*/
typedef unsigned long Item; // φ½Ñ¼Ñ¡Γ ñá¡¡δσ
typedef struct
{
Item low,high;
} CrBlock;
void ExpCht ( // ÉáßΦ¿αÑ¡¿Ñ Γáí½¿µδ ºá¼Ñ¡
void far *source, // «í½áßΓ∞ ¿ßσ«ñ¡«⌐ Æç
void far *target); // «í½áßΓ∞ αáßΦ¿αÑ¡¡«⌐ Æç
void ExpKey31 ( // ÉáßΦ¿αÑ¡¿Ñ ¬½ετá '3+1'
void far *source, // «í½áßΓ∞ ¿ßσ«ñ¡«ú« ¬½ετá
void far *target); // «í½áßΓ∞ αáßΦ¿αÑ¡. ¬½ετá
void ExpKey33 ( // ÉáßΦ¿αÑ¡¿Ñ ¬½ετá '3+3'
void far *source, // «í½áßΓ∞ ¿ßσ«ñ¡«ú« ¬½ετá
void far *target); // «í½áßΓ∞ αáßΦ¿αÑ¡. ¬½ετá
void ExpKey13 ( // ÉáßΦ¿αÑ¡¿Ñ ¬½ετá '1+3'
void far *source, // «í½áßΓ∞ ¿ßσ«ñ¡«ú« ¬½ετá
void far *target); // «í½áßΓ∞ αáßΦ¿αÑ¡. ¬½ετá
void gamma ( // âá¼¼¿α«óá¡¿Ñ ñá¡¡δσ
void far *key, // áñαÑß ¬½ετá
void far *synchro, // áñαÑß ß¿¡σα«»«ß佬¿
void far *xcht, // áñαÑß Γáí½¿µδ ºá¼Ñ¡
void far *data, // áñαÑß úá¼¼¿απѼδσ ñá¡¡δσ
unsigned short blocks);// τ¿ß½« Φ¿ΣαπѼδσ í½«¬«ó
void gammaLE( // çáΦ¿Σα«óá¡¿Ñ-úá¼¼¿α. ß Äæ
void far *key, // áñαÑß ¬½ετá
void far *synchro, // áñαÑß ß¿¡σα«»«ß佬¿
void far *xcht, // áñαÑß Γáí½¿µδ ºá¼Ñ¡
void far *data, // áñαÑß úá¼¼¿απѼδσ ñá¡¡δσ
unsigned short blocks);// τ¿ß½« Φ¿ΣαπѼδσ í½«¬«ó
void gammaLD( // ÉáßΦ¿Σα«óá¡¿Ñ-úá¼¼¿α. ß Äæ
void far *key, // áñαÑß ¬½ετá
void far *synchro, // áñαÑß ß¿¡σα«»«ß佬¿
void far *xcht, // áñαÑß Γáí½¿µδ ºá¼Ñ¡
void far *data, // áñαÑß úá¼¼¿απѼδσ ñá¡¡δσ
unsigned short blocks);// τ¿ß½« Φ¿ΣαπѼδσ í½«¬«ó
void simple( // ÿ¿Σα«óá¡¿Ñ »α«ßΓ«⌐ ºá¼Ñ¡«⌐
void far *key, // áñαÑß ¬½ετá
void far *data, // áñαÑß Φ¿ΣαπѼδσ ñá¡¡δσ
void far *xcht, // áñαÑß Γáí½¿µδ ºá¼Ñ¡
unsigned short blocks);// τ¿ß½« Φ¿ΣαπѼδσ í½«¬«ó
Item imito ( // éδτ¿ß½Ñ¡¿Ñ ¿¼¿Γ«»α¿ßΓáó¬¿
void far *key, // áñαÑß ¬½ετá
void far *combine, // áñαÑß ¡áτá½∞¡«⌐ ¬«¼í¿¡áµ¿¿
void far *xcht, // áñαÑß Γáí½¿µδ ºá¼Ñ¡
void far *data, // áñαÑß úá¼¼¿απѼδσ ñá¡¡δσ
unsigned short blocks);// τ¿ß½« í½«¬«ó
/*----------------------------------------------------
cryptor.c -- ¿ßσ«ñ¡δ⌐ ΓѬßΓ »α«úαá¼¼δ Φ¿Σα«óá¡¿∩
Σá⌐½«ó.
----------------------------------------------------
éÑαß¿∩ 1.00 «Γ 25.06.94, (c) 1994 é¿¡«¬πα«ó Ç.₧.
----------------------------------------------------
¥Γá »α«úαá¼¼á ߻ѵ¿á½∞¡« ß«ßΓáó½Ñ¡á ñ½∩ »πí½¿¬áµ¿¿
ó ªπα¡á½Ñ - ß¼. Γá¼ «»¿ßá¡¿Ñ »α¿¼Ñ¡Ñ¡¿∩.
----------------------------------------------------
*/
#include <io.h> // open, filelength
#include <fcntl.h> // O_RDONLY
#include <dir.h> // MAXPATH
#include <ctype.h> // toupper
#include <stdlib.h> // strtoul
#include <stdio.h> // printf
#include <memory.h> // setmem
#include "gost.h" // äá¡¡δÑ ¿ »α«Γ«Γ¿»δ âÄæÆá
// αẼÑα íπΣÑαá «í¼Ñ¡á - ñ«½ªÑ¡ íδΓ∞ ¬αáΓÑ¡ 8
#define BUFFER_SIZE 8192
// ⽫íá½∞¡δÑ ßΓáΓ¿τÑ߬¿Ñ ñá¡¡δÑ
unsigned _stklen=BUFFER_SIZE+4096; // αẼÑα ßΓφ¬á
typedef enum
{
O_K_=0, // óßÑ Γ¿»-Γ«»
errDoNotMatch, // ¡Ñß«ó»áñÑ¡¿Ñ ¿¼¿Γ«»α¿ßΓáó¬¿
errInvalidFlag, // ¡ÑóÑα¡δ⌐ Σ½áú ó맮óá »α«úαá¼¼δ
errBadSynchro, // ¡ÑóÑα¡« ºáñá¡á ß¿¡σα«»«ß佬á
errBadImito, // ¡ÑóÑα¡« ºáñá¡á ¿¼¿Γ«»α¿ßΓáó¬á
errTooFiewParm, // ¼á½« »áαá¼ÑΓα«ó ó맮óá
errTooManyParm, // ¼¡«ú« »áαá¼ÑΓα«ó ó맮óá
errBadKey, // »½«σ«⌐ Σá⌐½ ¬½ετá
errBadXCHT, // »½«σ«⌐ Σá⌐½ ß Γáí½¿µÑ⌐ ºá¼Ñ¡
errInvalidOper, // ¡ÑóÑα¡á∩ «»Ñαᵿ∩
errSourceFailure, // «Φ¿í¬á ¡á Σá⌐½Ñ-¿ßΓ«τ¡¿¬Ñ
errTargetFailure, // «Φ¿í¬á ¡á Σá⌐½Ñ-»α¿Ñ¼¡¿¬Ñ
errRenameFailure, // «Φ¿í¬á »α¿ »ÑαÑ¿¼Ñ¡«óá¡¿¿
errDeleteFailure // «Φ¿í¬á »α¿ πñá½Ñ¡¿¿ ¿ßσ. Σá⌐½á
} errList;
unsigned char chtab[1024];
Item Key[32]; // αáºóÑα¡πΓδ⌐ ¬½ετ
Item Synchro[2]= // ß¿¡σα«»«ß佬á
{
0UL,0UL
};
Item Imito[2]=
{
0UL,0UL
};
Item _Imito;
errList code=O_K_; // ¬«ñ óδσ«ñá
int BackLink= 0; // Φ¿Σα«óáΓ∞ ß Äæ
int ShowImito= 0; // »«¬áºáΓ∞ ¿¼¿Γ«»α¿ßΓáó¬π
int CheckImito=0; // »α«óÑα¿Γ∞ ¿¼¿Γ«»α¿ßΓáó¬π
int Operation= 0; // ºáΦ¿Σα«óá¡¿Ñ
int ParmCount= 0; // ßτÑΓτ¿¬ »áαá¼ÑΓα«ó
int Deletion= 0; // πñá½Ñ¡¿Ñ ¿ßσ«ñ¡¿¬á
char *KeyFile= NULL;// Σá⌐½ ¬½ετá
char *ChtFile= NULL;// Σá⌐½ Γáí½¿µδ ºá¼Ñ¡
char *InFile= NULL;// ¿ßσ«ñ¡δ⌐ Σá⌐½
char *OutFile= NULL;// Σá⌐½ αѺπ½∞ΓáΓá
// Åα«Γ«Γ¿»δ Σπ¡¬µ¿⌐
errList setParam (int argc, char **argv);
errList SignalError (errList errType,
char *errPlace);
errList loadCht (void);
errList loadKey (void);
errList execute (void);
// â½áó¡á∩ »α«úαá¼¼á ¼«ñπ½∩
errList main(int argc, char *argv[])
{
unsigned short i;
printf("Åα«úαá¼¼á Φ¿Σα«óá¡¿∩ ñá¡¡δσ ß »«¼«Θ∞ε "
"¬α¿»Γ«úαáΣ¿τÑ߬«ú« á½ú«α¿Γ¼á âÄæÆ 28147-89\n"
"æ«ßΓáó¿½ Ç.₧. é¿¡«¬πα«ó, ¿ε¡∞ 1994 ú«ñá,"
" ßó«í«ñ¡«Ñ ¿ß»«½∞º«óá¡¿Ñ ¿ ¬«»¿α«óá¡¿Ñ\n");
// ¥Γ«Γ µ¿¬½ ßΓα«¿Γ Γα¿ó¿á½∞¡πε Γáí½¿µπ ºá¼Ñ¡
for (i=0; i<1024; i++) chtab[i]=i;
// ôñ὿ΓÑ Ñú«, Ñß½¿ íπñÑΓÑ ¿¡¿µ¿á½¿º¿α«óáΓ∞ chtab
return
(code=setParam(argc,argv))!=O_K_ ? code :
!InFile ? SignalError(errTooFiewParm,NULL) :
(ChtFile && loadCht() != O_K_) ?
SignalError(errBadXCHT,ChtFile) :
(KeyFile && loadKey() != O_K_) ?
SignalError(errBadKey,KeyFile) :
execute();
}
// πßΓá¡«ó¬á αѪ¿¼«ó ß«ú½áß¡« Σ½áúá¼ ó맮óá
errList setParam(int argc, char **argv)
{
for ( ; ++argv,--argc; ) // »α«ß¼«Γα áαúπ¼Ñ¡Γ«ó
{
char *c;
if (**argv=='/') // ¬½ετ ¬«¼á¡ñ¡«⌐ ßΓ᫬¿
switch (toupper(*(*argv+1))) // óδí«α »« íπ¬óÑ
{
case 'D': Deletion=1; break;
case 'B': BackLink=1; break;
case 'N': BackLink=0; break;
case 'K': KeyFile=*argv+2;break;
case 'C': ChtFile=*argv+2;break;
case 'S':
if (Synchro[0]=strtoul(*argv+2,&c,16),*c)
return SignalError(errBadSynchro,*argv+2),1;
break;
case 'I':
if (*(*argv+2))
if (_Imito=strtoul(*argv+2,&c,16),*c)
return SignalError(errBadImito,*argv+2);
else CheckImito=ShowImito=1;
else ShowImito=1;
break;
default:
return SignalError(errInvalidFlag,*argv);
}
else switch(ParmCount++) // ñαπú«⌐ áαúπ¼Ñ¡Γ
{
default:
return SignalError(errTooManyParm,*argv);
case 0: // ñѬ«ñ¿απѼ Σπ¡¬µ¿ε
if (*(*argv+1)) // ¡Ñ «ñ¡á íπ¬óá
return SignalError(errInvalidOper,*argv);
switch(toupper(**argv)) // τΓ« ºá íπ¬óá ?
{
default: // «Φ¿í¬á
return SignalError(errInvalidOper,*argv);
case 'D': Operation=1;// αáßΦ¿Σα«óá¡¿Ñ
case 'E':; // ºáΦ¿Σα«óá¡¿Ñ
}
break;
case 1: // «»αÑñѽ∩Ѽ ¿ßΓ«τ¡¿¬
InFile=*argv; break;
case 2: // «»αÑñѽ∩Ѽ »α¿Ñ¼¡¿¬
OutFile=*argv;
}
}
return O_K_;
}
// çáúαπº¬á Γáí½¿µδ ºá¼Ñ¡
errList loadCht(void)
{
int handle,FileSize;
unsigned char buffer[128];
if ((handle=open(ChtFile,O_RDONLY))==-1 ||
((FileSize=filelength(handle)) != 128 &&
FileSize != 1024) ||
read(handle,
FileSize==128 ? buffer : chtab,FileSize)==-1)
return errBadKey;
if (FileSize == 128) ExpCht(buffer,chtab);
close(handle);
return O_K_;
}
// çáúαπº¬á ¬½ετá
errList loadKey(void)
{
int handle,FileSize;
unsigned char buffer[32];
if ((handle=open(KeyFile,O_RDONLY))==-1 ||
((FileSize=filelength(handle)) != 32 &&
FileSize != 128) ||
read(handle, FileSize==32 ?
(void*) buffer : (void*) Key, FileSize)==-1)
return errBadKey;
if (FileSize==32) ExpKey31(buffer,Key);
close(handle);
return O_K_;
}
// ÄßπΘÑßΓó½Ñ¡¿Ñ Φ¿Σα«óá¡¿∩
errList execute(void)
{
int inHandle,outHandle,same;
long FileSize;
char buffer[BUFFER_SIZE];
// »«ñú«Γ«ó¬á Σá⌐½«ó
simple(Key,Synchro,chtab,1);
if (same=!OutFile)
OutFile="$$$$$$$$.$$$";
if((inHandle=open(InFile,O_RDONLY|O_BINARY))==-1 ||
(FileSize=filelength(inHandle))== -1)
return SignalError(errSourceFailure,InFile);
if((outHandle=open(OutFile,
O_WRONLY|O_CREAT|O_BINARY))==-1)
return SignalError(errTargetFailure,OutFile);
printf("%sΦ¿Σα«óá¡¿Ñ Σá⌐½á %s\n",
Operation ? "Éáß" : "çá", InFile);
// µ¿¬½ Φ¿Σα«óá¡¿∩
for ( ; FileSize>0 ; FileSize-=BUFFER_SIZE)
{
unsigned short quant=min(BUFFER_SIZE,FileSize),
blocks=(quant+sizeof(CrBlock)-1)/sizeof(CrBlock);
if (read(inHandle,buffer, quant) == -1)
return SignalError(errSourceFailure,InFile);
if (!Operation && ShowImito)
{
if (FileSize % 8)
setmem(buffer+FileSize,8-FileSize % 8,0);
imito (Key,Imito,chtab,buffer,blocks);
}
(BackLink ? Operation ? gammaLD : gammaLE : gamma)
(Key,Synchro,chtab,buffer,blocks);
if (Operation && ShowImito)
{
if (FileSize % 8)
setmem(buffer+FileSize,8-FileSize % 8,0);
imito (Key,Imito,chtab,buffer,blocks);
}
if (write(outHandle,buffer, quant) == -1)
return SignalError(errTargetFailure,OutFile);
}
// ºáóÑαΦáεΘ¿Ñ ñÑ⌐ßΓó¿∩
close(inHandle);
close(outHandle);
if(ShowImito)
{
printf("ê¼¿Γ«»α¿ßΓáó¬á");
if(CheckImito)
printf(" %s ß«ó»áñáÑΓ !\n",
Imito[1]==_Imito ? "" : " ìà ");
else
printf("=%lx\n",Imito[1]);
}
if (Deletion || same)
{
if (unlink(InFile)==-1)
return SignalError(errDeleteFailure,InFile);
if (same && rename(OutFile,InFile)==-1)
return SignalError(errRenameFailure,InFile);
}
return O_K_;
}
// éδñáτá ß««íΘÑ¡¿∩ «í «Φ¿í¬Ñ
errList SignalError(errList errType, char *errPlace)
{
char *errText[]=
{
"ìÑóÑα¡δ⌐ Σ½áú ó맮óá α«úαá¼¼δ - %s\n",
"ìÑóÑα¡« ºáñá¡á ß¿¡σα«»«ß佬á - %s\n",
"ìÑóÑα¡« ºáñá¡á ¿¼¿Γ«»α¿ßΓáó¬á - %s\n",
"ìÑ«íσ«ñ¿¼ ¬«ñ Σπ¡¬µ¿¿ ¿ ¿¼∩ Φ¿ΣαπѼ«ú« Σá⌐½á\n",
"ï¿Φ¡¿⌐ »áαá¼ÑΓα ó맮óá - %s\n",
"ìÑóÑα¡« ºáñá¡ Σá⌐½ ß ¬½ετ«¼ - %s\n",
"ìÑóÑα¡« ºáñá¡ Σá⌐½ ß Γáí½¿µÑ⌐ ºá¼Ñ¡ - %s\n",
"ìÑóÑα¡« ºáñá¡á óδ»«½¡∩Ѽá∩ «»Ñαᵿ∩ - %s "
"(¡πª¡« E ¿½¿ D)\n",
"ÄΦ¿í¬á ¡á ¿ßσ«ñ¡«¼ Σá⌐½Ñ - %s\n",
"ÄΦ¿í¬á ¡á Σá⌐½Ñ αѺπ½∞ΓáΓá - %s\n",
"ìÑ󫺼«ª¡« »ÑαÑ¿¼Ñ¡«óáΓ∞ Σá⌐½ $$$$$$$$.$$$ ó %s\n",
"ìÑ󫺼«ª¡« πñ὿Γ∞ Σá⌐½ %s\n"
};
printf(errText[errType-2],errPlace);
return errType;
}
ï¿ßΓ¿¡ú 11
.AUTODEPEND
# Ä»αÑñѽѡ¿∩ Γαá¡ß½∩Γ«αá, áßßѼí½Ñαá, ¬«¼»«¡«óΘ¿¬á
CC = bcc +CRYPTOR.CFG
TASM = TASM /MX /ZI /O
TLINK = tlink
# ìà∩ó¡δÑ »αáó¿½á
.c.obj:
$(CC) -c {$< }
.cpp.obj:
$(CC) -c {$< }
# Ä»αÑñѽѡ¡δÑ ß¿¼ó«½δ
EXE_dependencies = \
cryptor.obj \
expcht.obj \
expkey31.obj \
gost.obj \
simple.obj \
gamma.obj \
gammald.obj \
gammale.obj \
imito.obj
# ƒó¡δÑ »αáó¿½á
cryptor.exe: cryptor.cfg $(EXE_dependencies)
$(TLINK) /v/x/c/LC:\BC\LIB @&&|
c0c.obj+
cryptor.obj+
expcht.obj+
expkey31.obj+
gost.obj+
simple.obj+
gamma.obj+
gammald.obj+
gammale.obj+
imito.obj
cryptor
# no map file
emu.lib+
mathc.lib+
cc.lib
|
# ê¡ñ¿ó¿ñπá½∞¡δÑ ºáó¿ß¿¼«ßΓ¿
cryptor.obj: cryptor.c
expcht.obj: expcht.c
expkey31.obj: expkey31.c
gost.obj: gost.asm
$(TASM) GOST.ASM,GOST.OBJ
simple.obj: simple.asm
$(TASM) SIMPLE.ASM,SIMPLE.OBJ
gamma.obj: gamma.asm
$(TASM) GAMMA.ASM,GAMMA.OBJ
gammald.obj: gammald.asm
$(TASM) GAMMALD.ASM,GAMMALD.OBJ
gammale.obj: gammale.asm
$(TASM) GAMMALE.ASM,GAMMALE.OBJ
imito.obj: imito.asm
$(TASM) IMITO.ASM,IMITO.OBJ
# *Compiler Configuration File*
cryptor.cfg: cryptor.mak
copy &&|
-mc
-C
-v
-y
-IC:\BC\INCLUDE
-LC:\BC\LIB
| cryptor.cfg