//标准DES算法430源程序.分为2个子程序:"子密钥DES_KEY";"加密/解密DES_MAIN".
//DES_test为试验主程序.
//采用试验数据时加密解密计算周期大约为58658个,在1MHZ的MCLK下大约要58ms
//使用R4,R5,R6,R7,r8. 及24个内存.280H~287H输入,288H~28FH缓冲,290H~297H输出
//包括DES_test在内,ROM用量近2K。flashROM的1080H~10DFH单元存放子密钥结果
#include "msp430x41x.h"
#define PTPOI R6 //交换表指针
#define PTBYTP R7 //输入表字节索引值
#define PTBITC R8 //输入表位(bit)索引值
PTIN DEFINE 280H //
PTOUT DEFINE 290H
DES_BUFFER DEFINE 288H
#define DES_KEY_CNT 2A0H
#define DES_CNT 2A0H //与上面使用同一单元
SFRW RAMFLAG3 =2A2H //位标志寄存器
#define FLAG_DES2 0002H,&RAMFLAG3 //
#define FLAG_DES1 0001H,&RAMFLAG3 //
#define FLAG_DES3 0004H,&RAMFLAG3 //0=加密;1=解密
ORG 0E000H
RESET MOV.W #300H,SP // Initialize stackpointer
mov #WDTPW+WDTHOLD,&WDTCTL // Stop Watchdog Timer
mov #200h,R4 //RAM初始化
RCL MOV.W #1111H , 0(R4)
INCD R4 //
CMP #2FFH,R4
JLO RCL
//
DES_Test
MOV #1080H,R4 //
CALL #CLEARFLASH //
MOV.B #01100011B , PTIN //63 computer 初始化:放好密码原文
MOV.B #01101111B , PTIN+1 //6f
MOV.B #01101101B , PTIN+2 //6d
MOV.B #01110000B , PTIN+3 //70
MOV.B #01110101B , PTIN+4 //75
MOV.B #01110100B , PTIN+5 //74
MOV.B #01100101B , PTIN+6 //65
MOV.B #01110010B , PTIN+7 //72
CALL #DES_KEY //计算子密钥,结果在Flash1080H~10DFH单元。
MOV.B #01101100B , PTIN //6c learning 初始化:要加密的数据
MOV.B #01100101B , PTIN+1 //65
MOV.B #01100001B , PTIN+2 //61
MOV.B #01110010B , PTIN+3 //72
MOV.B #01101110B , PTIN+4 //6e
MOV.B #01101001B , PTIN+5 //69
MOV.B #01101110B , PTIN+6 //6e
MOV.B #01100111B , PTIN+7 //67
BIC #FLAG_DES3 //加密
CALL #DES_MAIN
NOP //加密结束,结果在290H单元:89 4c b7 32 df 9d e1 03
MOV.W PTOUT , PTIN
MOV.W PTOUT+2 , PTIN+2
MOV.W PTOUT+4 , PTIN+4
MOV.W PTOUT+6 , PTIN+6
BIS #FLAG_DES3 //解密
CALL #DES_MAIN
nop //解密结束,结果在290H单元:6c 65 61 72 6e 69 6e 67
JMP $ //子程序结束*****************************
//***********************************************************
DES_MAIN //加密/解密子程序
MOV #IP,PTPOI // R6
CALL #PERMUT //
MOV.B #00H , DES_CNT //
MOV.W PTOUT,DES_BUFFER //
MOV.W PTOUT+2,DES_BUFFER+2
MOV.W PTOUT+4,DES_BUFFER+4 //
MOV.W PTOUT+6,DES_BUFFER+6
DES1 MOV.W DES_BUFFER+4,PTIN //
MOV.W DES_BUFFER+6,PTIN+2
MOV #DES_E,PTPOI // R6
CALL #PERMUT
MOV.B DES_CNT , R5
BIT #FLAG_DES3
JZ DES11
MOV.B #15 , R6
SUB.B R5 , R6
MOV.B R6 ,R5
DES11 MOV.B TAB_DESKEY(R5) , R6
XOR.W 1000H(R6) , PTOUT
XOR.W 1002H(R6) , PTOUT+2
XOR.W 1004H(R6) , PTOUT+4
// 试验结果为 F0 A9 10 6A 39 68 .
//S1处理********************************************
MOV.B PTOUT , R5
RRA.B R5
RRA.B R5
BIC.B #0C0H, R5 //
MOV.B DES_S1(R5),R5
MOV.B R5 , PTIN
MOV.B PTOUT+1 , R5
MOV.B PTOUT , R4
RRC.B R4
RRC.B R5
RRC.B R4
RRC.B R5
RRC.B R4
RRC.B R5
RRC.B R4
RRC.B R5
BIC.B #0C0H, R5 //
MOV.B DES_S2(R5),R5
ADD.B R5 , PTIN
MOV.B PTOUT+1 , R5
MOV.B PTOUT+2 , R4
RLC.B R4
RLC.B R5
RLC.B R4
RLC.B R5
BIC.B #0C0H, R5 //
MOV.B DES_S3(R5),R5
MOV.B R5 , PTIN+1
MOV.B PTOUT+2 , R5
BIC.B #0C0H, R5 //
//MOV.W DES_S4,R4
MOV.B DES_S4(R5),R5
ADD.B R5 , PTIN+1
//***************** S盒处理的方法太笨拙了,可以考虑循环:S1,S4--s5,s8
//S5处理
MOV.B PTOUT+3 , R5
RRA.B R5
RRA.B R5
BIC.B #0C0H, R5 //
MOV.B DES_S5(R5),R5
MOV.B R5 , PTIN+2
MOV.B PTOUT+4 , R5
MOV.B PTOUT+3 , R4
RRC.B R4
RRC.B R5
RRC.B R4
RRC.B R5
RRC.B R4
RRC.B R5
RRC.B R4
RRC.B R5
BIC.B #0C0H, R5 //
MOV.B DES_S6(R5),R5
ADD.B R5 , PTIN+2
MOV.B PTOUT+4 , R5
MOV.B PTOUT+5 , R4
RLC.B R4
RLC.B R5
RLC.B R4
RLC.B R5
BIC.B #0C0H, R5 //
MOV.B DES_S7(R5),R5
MOV.B R5 , PTIN+3
MOV.B PTOUT+5 , R5
BIC.B #0C0H, R5 //
//MOV.W DES_S4,R4
MOV.B DES_S8(R5),R5
ADD.B R5 , PTIN+3
// 至此,试验结果为: 5B 41 03 D9
MOV #DES_P,PTPOI //
CALL #PERMUT //
//至此, 试验结果为: ca 39 e8 03
XOR.W DES_BUFFER , PTOUT //
XOR.W DES_BUFFER+2 , PTOUT+2 //
MOV.W DES_BUFFER+4 , DES_BUFFER //
MOV.W DES_BUFFER+6 , DES_BUFFER+2 //
MOV.W PTOUT , DES_BUFFER+4 //
MOV.W PTOUT+2 , DES_BUFFER+6
INC.B DES_CNT //
CMP.B #16 , DES_CNT //LOOP again???
JLO DES1
MOV.W DES_BUFFER , PTIN+4
MOV.W DES_BUFFER+2 , PTIN+6
MOV.W DES_BUFFER+4 , PTIN
MOV.W DES_BUFFER+6 , PTIN+2
MOV #DES_IP1,PTPOI //
CALL #PERMUT //
RET //子程序结束 ****************************
//****************************************************************************
//密码原文在280H~287H单元,结果:1080H~10DFH单元,每6个字节为一个密码。
DES_KEY
MOV.B #00H , DES_KEY_CNT
BIC #FLAG_DES1 //
MOV #PC1,PTPOI //R6
CALL #PERMUT //
DES_KEY1 //
MOV.W PTOUT,PTIN //
MOV.W PTOUT+2,PTIN+2 //
MOV.W PTOUT+4,PTIN+4
MOV.W PTOUT+6,PTIN+6
DES_KEY2 //
MOV.B PTIN+3,R6 //
RLC.B PTIN+3
RLC.B PTIN+2 //
RLC.B PTIN+1
RLC.B PTIN
BIC.B #10H,PTIN+3 //该命令保持c标志位不变
JNC DES_KEY01 //
BIS.B #10H,PTIN+3
DES_KEY01
BIC.B #0FH,PTIN+3 //
MOV.B PTIN+3,R7 //
MOV.B R6,PTIN+3 //
RLC.B PTIN+6
RLC.B PTIN+5
RLC.B PTIN+4
RLC.B PTIN+3
BIC.B #01H,PTIN+6 //
BIT.B #10H,PTIN+3
JZ DES_KEY02 //
BIS.B #01H,PTIN+6
DES_KEY02
BIC.B #0F0H,PTIN+3
ADD.B R7,PTIN+3 //移位处理结束。结果仍在280H~286H单元
BIT #FLAG_DES1
JZ DES_KEY03
BIC #FLAG_DES1
JMP DES_KEY2 //再循环一次
DES_KEY03 //
MOV.W PTIN,DES_BUFFER
MOV.W PTIN+2,DES_BUFFER+2
MOV.W PTIN+4,DES_BUFFER+4
MOV.B PTIN+6,DES_BUFFER+6
CLR.B PTIN+7
MOV #PC2,PTPOI //PC2交换
CALL #PERMUT //
//写字密钥到Flash ROM
MOV.B DES_KEY_CNT,R5
MOV.B TAB_DESKEY(R5),R6 //
ADD.W #1000H , R6
MOV #PTOUT,R5
MOV #6,R4
CALL #WREEROM
MOV.W DES_BUFFER,PTIN //
MOV.W DES_BUFFER+2,PTIN+2
MOV.W DES_BUFFER+4,PTIN+4
MOV.W DES_BUFFER+6,PTIN+6
BIS #FLAG_DES1 //
INC.B DES_KEY_CNT
CMP.B #1 , DES_KEY_CNT
JEQ DES_KEY3
CMP.B #8 , DES_KEY_CNT
JEQ DES_KEY3
CMP.B #15 , DES_KEY_CNT
JEQ DES_KEY3
JMP DES_KEY4
DES_KEY3 BIC #FLAG_DES1 //
DES_KEY4
CMP.B #16 , DES_KEY_CNT //
JLO DES_KEY2
ret //字程序结束***
TAB_DESKEY DB 80H,86H,8CH,92H,98H,9EH,0A4H,0AAH,0B0H,0B6H,0BCH,0C2H,0C8H,0CEH,0D4H,0DAH