单片机学习小组
直播中

小黑羊

12年用户 1089经验值
擅长:31274
私信 关注

如何利用DES加密算法对随机数进行加密呢

RC522与STM32F103是怎样进行通信的?
如何利用DES加密算法对随机数进行加密呢?

回帖(1)

刘勉励

2022-1-20 09:44:20
RC522与STM32F103通信


void InitRc522(void)
{
        Spi_IO_Init();
            PcdReset();
        PcdAntennaOff();
        delay_ms(2);  
        PcdAntennaOn();
        M500PcdConfigISOType( 'A' );
}
使用的是SPI通信的方式与RC522进行通信,其中天线的初始化是必须的。通信成功后可以进行后续的配置。

寻卡、防冲突、完成选卡


void RC522_Config ( void )
{                                                                                       
        uint8_t ucStatusReturn;                    //返回状态                                       
        uint8_t flag_station = 1;                //跳出函数的标志位


  while ( flag_station )
  {
                /* 寻卡(方式:范围内全部),第一次寻卡失败后再进行一次,寻卡成功时卡片序列传入数组ucArray_ID中 */
                if ( ( ucStatusReturn = PcdRequest ( PICC_REQALL, ucArray_ID ) ) != MI_OK )
                        ucStatusReturn = PcdRequest ( PICC_REQALL, ucArray_ID );                  


                if ( ucStatusReturn == MI_OK  )
                {
                        /* 防冲突操作,被选中的卡片序列传入数组ucArray_ID中 */
                        if ( PcdAnticoll ( ucArray_ID ) == MI_OK )
                        {
                        //        sprintf ( id_cpu, "The Card ID is: %02X%02X%02X%02X", ucArray_ID [ 0 ], ucArray_ID [ 1 ], ucArray_ID [ 2 ], ucArray_ID [ 3 ] );                               
                        //        printf ("%srn", id_cpu );
                                if ( PcdSelect ( ucArray_ID ) == MI_OK )
                                        {
                                                printf ("nRC522 is Ready!n");
                                                flag_station = 0;                                                                                                       
                                        }                                                       
                        }
                }


  }
}


这里完成后就已经完成对复旦CPU卡的通信了,后面可以通过命令进行操作,接下来的发卡流程可以参考复旦微电子CPU卡发卡流程
这里博主已经写的很详细,我简略提一下其中我碰到的问题。
DES算法进行随机数加密

在进行外部认证进行随机数加密的时候,我发现开发手册里是没有给出DES加密的指令,因此当时是自己找了一个可以用的DES加密算法对随机数进行加密,然后将加密后的八字节数送入外部认证命令当中。

        //取随机数
        res = FM1208_GetChallenge(ran_number_long, ran_number);
        if (res == 0x9000) {       
                printf("random number generated: rn");
                for(int i = 0; i < 8; i++)
                        printf ( "%x " , ran_number);
                printf("rn");
        }
        else
                printf ( "random get failed!, error code: %xrn", res);
               
        memset(des_encrypted_code, 0x00, 8);  //清0
       
        //其中newkey是我自己写入的密钥,卡的初始密钥为八字节的FFFFFFFF。
        DES_Encrypt(ran_number, new_key, des_encrypted_code);
        printf("des encrypted code: rn");
        for(int i = 0; i < 8; i++)
                        printf ( "%x " , des_encrypted_code);
        printf("rn");
       
        //外部认证
        res = FM1208_External_Authenticate(0x00, des_encrypted_code, g_cReceBuf);
        if (res == 0x9000) {
                printf("card authenticated.rn");
        }
        else {
                printf("Authenticate failed, error code: %xrn", res);
        }
二进制文件的读写问题

当我外部认证完成,创建完二进制文件后,发现当外部认证失败的时候,二进制文件也同样可以进行读写,经过一段时间的研究后,发现可以通过PIN加密,来实现对读写操作的权限设置。这里可以先看明白手册中的FMCOS 独特的安全体系,然后可以进行相应的指令配置,就可以设置PIN进行安全认证了。
举报

更多回帖

×
20
完善资料,
赚取积分