⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 des2.asm

📁 51环境汇编des加密
💻 ASM
📖 第 1 页 / 共 2 页
字号:
                MOV        R1,8 
                MOV        R2,#8 
                CALL        MOVRAMBYTE                ;初始置换完毕,结果仍存到原位置(8)+0..(8)+7 

                MOV        R0,9                ;对密钥进行缩位变换,R0=源表基地址 
                MOV        R1,#10H                ;R1=目的表基地址 
                MOV        DPTR,#KEY_PC1        ;DPTR=位置换表基地址 
                MOV        R2,#0                ;R2=字节循环变量0..7 
DES4:                MOV        R3,#8          ;R3=位循环变量8..1 
DES5:                CALL        CALA                ;进行置换 
                DJNZ        R3,DES5 
                INC        R2 
                CJNE        R2,#7,DES4 
                
                MOV        R0,#10H                        ;将置换后的数转移到源地址 
                MOV        R1,9 
                MOV        R2,#7 
                CALL        MOVRAMBYTE                ;缩位置换完毕,结果仍存到原位置(9)+0..(9)+6 

                MOV        R6,#0                ;进行16次迭代,R6=16次迭代循环变量 
        
DES6:                MOV        A,8        ;对8字节数据的右32位作扩充冲变换扩充到48位,结果存到10H..15H中 
                ADD        A,#4 
                MOV        R0,A                ;R0=源表基地址 
                MOV        R1,#10H                ;R1=目的表基地址 
                MOV        DPTR,#DATA_EP        ;DPTR=位置换表基地址 
                MOV        R2,#0          ;R2=字节循环变量0..7 
DES7:                MOV        R3,#8          ;R3=位循环变量8..1 
DES8:                CALL        CALA                ;进行置换 
                DJNZ        R3,DES8 
                INC        R2 
                CJNE        R2,#6,DES7        ;对56位密钥进行移位结果仍在原位置(9)+0..(9)+6 
        
                MOV        R5,#0                ;循环变量 循环次数=每一次需要移位的次数 

                MOV        A,10 
                JZ        DES11                ;解密跳转 
                
DES9:                MOV        B,9                ;是加密过程 
                MOV        A,#7 
                CALL        GETBIT                ;R7=56位密钥第0位 
                PUSH        AR7                ;保存R7 
                MOV        R0,9 
                MOV        R4,#0                ;循环变量 56位=7字节 循环次数=7 从0到6 
DES10:                MOV        A,@R0 
                RL        A 
                MOV        @R0,A                ;左移一? 
                MOV        A,R0 
                MOV        R1,A 
                INC        R1 
                MOV        A,@R1                ;A=下一字节内容 
                ANL        A,#80H 
                MOV        R7,A                ;R7=下一字节BIT7 
                MOV        B,R0 
                MOV        A,#0 
                CALL        SETBIT                ;本字节BIT0=R7 
                INC        R0 
                INC        R4 
                CJNE        R4,#7,DES10        ;循环左移完毕 
                MOV        A,9 
                ADD        A,#3 
                MOV        R0,A 
                MOV        A,@R0                ;A=密钥3字节 
                ANL        A,#10H 
                MOV        R7,A                ;R7=密钥3字节4位即移位后的27位 
                MOV        A,9 
                ADD        A,#6 
                MOV        B,A 
                MOV        A,#0 
                CALL        SETBIT                ;移位后的密钥55位=移位后的密钥27位 
                POP        AR7                ;移位前密钥0位 
                MOV        A,9 
                ADD        A,#3 
                MOV        B,A 
                MOV        A,#4 
                CALL        SETBIT                ;移位后的密钥27位=R7,完成一次KEY的循环左移 
                MOV        A,R6 
                MOV        DPTR,#SHIFTBITS 
                MOVC        A,@A+DPTR        ;A=本次迭代循环次数 
                INC        R5 
                CJNE        A,5,DES9        ;全部循环完毕获得本次运算密钥 
                JMP        DES13                ;本次运算密钥计算完毕 
 
 
DES11:                MOV        A,R6 
                JZ        DES13                ;是解密过程,解密时第一轮不移位 
                MOV        A,9                ;9存放56位密钥起始地址 
                ADD        A,#6 
                MOV        R0,A                ;R0=56位密钥字节6 
                MOV        B,A                ;B=56位密钥字节6 
                MOV        A,#0                ;第0位 
                CALL        GETBIT                ;R7=为56位密钥55位 
                PUSH        AR7                ;保存R7 
                MOV        R4,#7                ;循环变量 56位=7字节 循环次数=7 从0到6 
DES12:                MOV        A,@R0 
                RR        A 
                MOV        @R0,A                ;右移一位 
                MOV        A,R0 
                MOV        R1,A 
                DEC        R1 
                MOV        A,@R1                ;A=上一字节内容 
                ANL        A,#1 
                MOV        R7,A                ;R7=上一字节BIT0 
                MOV        B,R0 
                MOV        A,#7 
                CALL        SETBIT                ;本字节BIT7=R7 
                DEC        R0 
                DJNZ        R4,DES12        ;循环右移完毕 
                MOV        A,9 
                ADD        A,#3 
                MOV        R0,A 
                MOV        A,@R0                ;A=密钥3字节 
                ANL        A,#8 
                MOV        R7,A                ;R7=密钥3字节3位即移位后的28位 
                MOV        B,9 
                MOV        A,#7 
                CALL        SETBIT                ;移位后56位密钥第0位=R7 
                POP        AR7                ;R7:移位前为56位密钥55位 
                MOV        A,9 
                ADD        A,#3 
                MOV        B,A 
                MOV        A,#3 
                CALL        SETBIT                ;移位后的密钥28位=R7,完成一次KEY的循环右移 
                MOV        A,#10H 
                CLR        C 
                SUBB        A,R6 
                MOV        DPTR,#SHIFTBITS 
                MOVC        A,@A+DPTR        ;A=本次循环移位次数 
                INC        R5 
                CJNE        A,5,DES11        ;全部循环完毕获得本次运算密钥 
        
DES13:                MOV        R0,9                ;R0=源表基地址 
                MOV        R1,#16H                ;R1=目的表基地址 
                MOV        DPTR,#KEY_PC2        ;DPTR=位置换表基地址 
                MOV        R2,#0                ;R2=字节循环变量0..7 
DES14:                MOV        R3,#8                ;R3=位循环变量8..1 
DES15:                CALL        CALA                ;进行置换 
                DJNZ        R3,DES15 
                INC        R2 
                CJNE        R2,#6,DES14        ;对本次运算密钥作缩位运算获得48位子金钥,结果存到16H..1BH 
                MOV        R0,#10H                ;将16H..1BH的内容和10H..15H的内容相异或然后放到16H..1BH中10H..15H的内容可以抛弃 
                MOV        R1,#16H 
                MOV        R2,#6 
DES16:                MOV        A,@R0 
                XRL        A,@R1 
                MOV        @R1,A 
                INC        R0 
                INC        R1 
                DJNZ        R2,DES16 

                MOV        DPTR,#DATA_SBOX        ;对16H..1BH的内容作S-BOX置换结果放入10H..13H 
                MOV        R2,#0                ;循环变量 从0..7 
DES17:                MOV        1CH,#0                ;(1CH)=0=SBOX表寻址单元 
                MOV        R3,#0                ;循环变量 从0..5 
DES18:                MOV        A,R2 
                MOV        B,#6 
                MUL        AB                ;A=R2*6 
                ADD        A,R3                ;A=R2*6+R3 
                PUSH        ACC 
                ANL        A,#0F8H 
                RR        A 
                RR        A 
                RR        A                ;A=(R2*6+R3)/8 
                ADD        A,#16H 
                MOV        B,A                ;B存放源表地址字节索引 
                POP        ACC 
                ANL        A,#7 
                CPL        A 
                INC        A 
                ADD        A,#7                ;A=7-(R2*6+R3)%8 存放源表位索引 
                CALL        GETBIT                ;R7=源表的B字节A位 
                CJNE        R3,#0,DES19 
                MOV        R0,#5                ;如R3==0,R0=SBOX表寻址单元1位 
                JMP        DES21 
DES19:                CJNE        R3,#5,DES20 
                MOV        R0,#4                ;如R3==5,R0=SBOX表寻址单元0位 
                JMP        DES21 
DES20:                MOV        A,#4 
                CLR        C 
                SUBB        A,R3 
                MOV        R0,A                ;如0 <R3 <5,R0=SBOX寻址单元8-R3位 
DES21:                MOV        B,#1CH                ;B=SBOX寻址单元地址=1CH 
                MOV        A,R0 
                CALL        SETBIT 
                INC        R3 
                CJNE        R3,#6,DES18 
                MOV        A,1CH                ;计算SBOX寻址单元 
                ANL        A,#1 
                PUSH        ACC 
                MOV        A,1CH 
                ANL        A,#0FEH 
                RR        A 
                MOV        1CH,A                
                MOV        A,R2                ;第R2个6BIT 
                MOV        B,#32 
                MUL        AB 
                ADD        A,1CH                ;(1CH)=SBOX地址? 
                MOVC        A,@A+DPTR        ;A=查SBOX表值 
                POP        AR0 
                CJNE        R0,#0,DES22 
                ANL        A,#0F0H 
                SWAP        A                ;如R0==0则A=SBOX表值高4位 
                JMP        DES23 
 
 

DES22:                ANL        A,#0FH                ;如R0==1则A=SBOX表值低4位 
DES23:                MOV        1CH,A                ;1CH的低4位存放6位源经SBOX变换后的结果 
                MOV        A,R2 
                ANL        A,#1 
                PUSH        ACC 
                MOV        A,R2 
                ANL        A,#0FEH 
                RR        A 
                ADD        A,#10H 
                MOV        R0,A                ;R0=目标绝对地址 
                POP        ACC 
                JNZ        DES24                ;如R2%2==0 则R0(H4BIT)=(1CH) 
                MOV        A,1CH 
                SWAP        A                ;A=SBOX结果 
                JMP        DES25 
DES24:                MOV        A,@R0 
                ORL        A,1CH 
DES25:                MOV        @R0,A 
                INC        R2 
                CJNE        R2,#8,DES17 
;                CJNE        R2,#8,DES33        ;SBOX变换完毕结果在10H..13H 
;                JMP        DES34 
;        DES33: 
;                JMP        DES17        
        ;进行PBOX变换 
;        DES34: 
                MOV        R0,#10H 
                MOV        R1,#14H 
                MOV        DPTR,#DATA_PBOX 
                MOV        R2,#0 
DES26:                MOV        R3,#8 
DES27:                CALL        CALA                ;进行置换 
                DJNZ        R3,DES27 
                INC        R2 
                CJNE        R2,#4,DES26        ;PBOX置换完毕结果在14H..17H 
                MOV        R0,#14H                ;14H..17H结果和8单元引用的起始地址相异或,结果放入14..17H中 
                MOV        R1,8 
                MOV        R2,#4 
DES28:                MOV        A,@R1 
                XRL        A,@R0 
                MOV        @R0,A 
                INC        R0 
                INC        R1 
                DJNZ        R2,DES28 
                MOV        A,8                ;将源码的后32位移到前32位 
                ADD        A,#4 
                MOV        R0,A 
                MOV        R1,8 
                MOV        R2,#4 
                CALL        MOVRAMBYTE 
                MOV        R0,#14H                ;将14H..17H移到源码的后32位 
                MOV        A,8 
                ADD        A,#4 
                MOV        R1,A 
                MOV        R2,#4 
                CALL        MOVRAMBYTE 
                INC        R6 
                CJNE        R6,#10H,DES32        ;16次迭代运算完毕 
                MOV        A,10                ;判断加密解密 
                JNZ        DES29                ;加密跳转 
                MOV        R0,8 
                MOV        A,8 
                ADD        A,#4 
                MOV        R1,A 
                MOV        R2,#4 
                CALL        XCHRAMBYTE 
                JMP        DES29 
DES32:                JMP        DES6 
DES29:                MOV        R0,8                ;对源作逆置换到10H..17H 
                MOV        R1,#10H 
                MOV        DPTR,#DATA_FP 
                MOV        R2,#0 
DES30:                MOV        R3,#8 
DES31:                CALL        CALA                ;进行置换 
                DJNZ        R3,DES31 
                INC        R2 
                CJNE        R2,#8,DES30 
                MOV        R0,#10H                ;将置换后的数转移到源地址 
                MOV        R1,8 
                MOV        R2,#8 
                CALL        MOVRAMBYTE 
                RET 
;ENDP 

                END  
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -