一种SPI FLASH加密接口及加密数据的读写方法转让专利

申请号 : CN201510094016.8

文献号 : CN104657288B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 王运哲姚香君孙玉玺孙晓宁赵阳刘大铕刘奇浩

申请人 : 山东华芯半导体有限公司

摘要 :

本发明涉及一种SPI FLASH加密接口,包括命令模块、数据模块、加密模块、解密模块、状态机模块以及协议转换模块,命令模块与系统总线相连;数据模块与系统总线、命令模块、加密模块以及解密模块相连;加密模块与数据模块、命令模块以及状态机模块相连;解密模块与数据模块、状态机模块相连;状态机模块与命令模块、加密模块、解密模块以及协议转换模块相连;协议转换模块与状态机模块、SPI FLASH相连。将传统的按字加密方式改成按字节采用不同算法分别加密的方式,取消了字节间的加解密依赖关系,使得软件对SPI FLASH的操作大为简化,在保证系统保密安全的基础上有效降低了软件操作的复杂度,提升了整个系统的效率。

权利要求 :

1.一种SPI FLASH加密接口,包括命令模块、数据模块、加密模块、解密模块、状态机模块以及协议转换模块;其特征在于:所述命令模块与系统总线相连,用于寄存来自系统总线的地址、读写信息、数据块大小及传输类型,并将系统总线的读写需求传递至数据模块和状态机模块,将状态机模块的当前操作状态反馈至系统总线;

所述数据模块与系统总线、命令模块、加密模块以及解密模块相连,数据模块用于寄存系统总线要写入SPI FLASH的字节数据以及从SPI FLASH中读取的字节数据;

所述加密模块与数据模块、命令模块以及状态机模块相连,用于将写入SPI FLASH的字节数据按照特定的加密算法转换成密文;

所述解密模块与数据模块、状态机模块相连,用于将从FLASH内读出的字节数据按照特定的解密算法转换成明文;

所述状态机模块与命令模块、加密模块、解密模块以及协议转换模块相连,用于解析来自命令模块的数据,以实现对SPI FLASH读写擦状态的转换控制,并反馈FLASH的状态信息至命令模块;

所述协议转换模块与状态机模块、SPI FLASH相连,实现SPI协议转换,即将命令和数据按照SPI协议组成相应的串行命令序列格式转送至片外的SPI FLASH,或者将从SPI FLASH串行读入的数据寄存重新组成字节或者字的数据格式;

所述特定的加密算法包括以下具体算法:

对字节0的加密算法,如下:

wr_data_enc[0] = wr_data[0] ^ wr_data[2] ^ wr_addr[2];wr_data_enc[1] = wr_data[1] ^ wr_data[3] ^ wr_addr[3];wr_data_enc[2] = wr_data[2] ^ wr_data[5] ^ wr_addr[4];wr_data_enc[3] = wr_data[3] ^ wr_data[6] ^ wr_addr[5];wr_data_enc[4] = wr_data[4] ^ wr_data[7] ^ wr_addr[6];wr_data_enc[5] = wr_data[5] ^ wr_addr[7];~

wr_data_enc[6] = wr_data[6] ^ wr_data[0] ^ wr_addr[8];wr_data_enc[7] = wr_data[7] ^ wr_data[1] ^ wr_addr[9];其中,wr_data表示加密前的数据,wr_data_enc表示加密后的数据,wr_addr表示系统总线将数据要写入PSI FLASH的地址;

对字节1的加密算法,如下:

wr_data_enc[8]  = wr_data[ 8] ^ wr_data[8+6] ^ wr_addr[9];wr_data_enc[9]  = wr_data[ 9] ^ wr_data[8+7] ^ wr_addr[8];wr_data_enc[10] = wr_data[10] ^ wr_data[8+0] ^ wr_addr[7];wr_data_enc[11] = wr_data[11] ^ wr_addr[6];~

wr_data_enc[12] = wr_data[12] ^ wr_data[8+1] ^ wr_addr[5];wr_data_enc[13] = wr_data[13] ^ wr_data[8+3] ^ wr_addr[4];wr_data_enc[14] = wr_data[14] ^ wr_data[8+4] ^ wr_addr[3];wr_data_enc[15] = wr_data[15] ^ wr_data[8+5] ^ wr_addr[2];其中,wr_data表示加密前的数据,wr_data_enc表示加密后的数据,wr_addr表示系统总线将数据要写入PSI FLASH的地址;

对字节2的加密算法,如下:

wr_data_enc[16] = wr_data[16] ^ wr_data[16+3] ^ wr_addr[2];wr_data_enc[17] = wr_data[17] ^ wr_data[16+4] ^ wr_addr[4];wr_data_enc[18] = wr_data[18] ^ wr_data[16+6] ^ wr_addr[3];wr_data_enc[19] = wr_data[19] ^ wr_data[16+7] ^ wr_addr[9];wr_data_enc[20] = wr_data[20] ^ wr_data[16+0] ^ wr_addr[7];wr_data_enc[21] = wr_data[21] ^ wr_data[16+1] ^ wr_addr[8];wr_data_enc[22] = wr_data[22] ^ wr_addr[5];~

wr_data_enc[23] = wr_data[23] ^ wr_data[16+2] ^ wr_addr[6];其中,wr_data表示加密前的数据,wr_data_enc表示加密后的数据,wr_addr表示系统总线将数据要写入PSI FLASH的地址;

对字节3的加密算法,如下:

wr_data_enc[24] = wr_data[24] ^ wr_data[24+5] ^ wr_addr[5];wr_data_enc[25] = wr_data[25] ^ wr_data[24+7] ^ wr_addr[9];wr_data_enc[26] = wr_data[26] ^ wr_data[24+6] ^ wr_addr[7];wr_data_enc[27] = wr_data[27] ^ wr_data[24+1] ^ wr_addr[2];wr_data_enc[28] = wr_data[28] ^ wr_data[24+2] ^ wr_addr[3];wr_data_enc[29] = wr_data[29] ^ wr_data[24+3] ^ wr_addr[8];wr_data_enc[30] = wr_data[30] ^ wr_addr[6];~

wr_data_enc[31] = wr_data[31] ^ wr_data[24+4] ^ wr_addr[4];其中,wr_data表示加密前的数据,wr_data_enc表示加密后的数据,wr_addr表示系统总线将数据要写入PSI FLASH的地址;

所述特定的解密算法包括以下具体算法:

对字节0的解密算法:

rd_data_dec[0] = rd_data[0] ^ rd_data_dec[2] ^ rd_addr[2];rd_data_dec[1] = rd_data[1] ^ rd_data_dec[3] ^ rd_addr[3];rd_data_dec[2] = rd_data[2] ^ rd_data_dec[5] ^ rd_addr[4];rd_data_dec[3] = rd_data[3] ^ rd_data_dec[6] ^ rd_addr[5];rd_data_dec[4] = rd_data[4] ^ rd_data_dec[7] ^ rd_addr[6];rd_data_dec[5] = rd_data[5] ^ rd_addr[7];~

rd_data_dec[6] = rd_data[6] ^ rd_data_dec[0] ^ rd_addr[8];rd_data_dec[7] = rd_data[7] ^ rd_data_dec[1] ^ rd_addr[9];对字节1的解密算法:

rd_data_dec[8]  = rd_data[8]  ^ rd_data_dec[8+6] ^ rd_addr[9];rd_data_dec[9]  = rd_data[9]  ^ rd_data_dec[8+7] ^ rd_addr[8];rd_data_dec[10] = rd_data[10] ^ rd_data_dec[8+0] ^ rd_addr[7];rd_data_dec[11] = rd_data[11] ^ rd_addr[6];~

rd_data_dec[12] = rd_data[12] ^ rd_data_dec[8+1] ^ rd_addr[5];rd_data_dec[13] = rd_data[13] ^ rd_data_dec[8+3] ^ rd_addr[4];rd_data_dec[14] = rd_data[14] ^ rd_data_dec[8+4] ^ rd_addr[3];rd_data_dec[15] = rd_data[15] ^ rd_data_dec[8+5] ^ rd_addr[2];对字节2的解密算法:

rd_data_dec[16] = rd_data[16] ^ rd_data_dec[16+3] ^ rd_addr[2];rd_data_dec[17] = rd_data[17] ^ rd_data_dec[16+4] ^ rd_addr[4];rd_data_dec[18] = rd_data[18] ^ rd_data_dec[16+6] ^ rd_addr[3];rd_data_dec[19] = rd_data[19] ^ rd_data_dec[16+7] ^ rd_addr[9];rd_data_dec[20] = rd_data[20] ^ rd_data_dec[16+0] ^ rd_addr[7];rd_data_dec[21] = rd_data[21] ^ rd_data_dec[16+1] ^ rd_addr[8];rd_data_dec[22] = rd_data[22] ^ rd_addr[5];~

rd_data_dec[23] = rd_data[23] ^ rd_data_dec[16+2] ^ rd_addr[6];对字节3的解密算法:

rd_data_dec[24] = rd_data[24] ^ rd_data_dec[24+5] ^ rd_addr[5];rd_data_dec[25] = rd_data[25] ^ rd_data_dec[24+7] ^ rd_addr[9];rd_data_dec[26] = rd_data[26] ^ rd_data_dec[24+6] ^ rd_addr[7];rd_data_dec[27] = rd_data[27] ^ rd_data_dec[24+1] ^ rd_addr[2];rd_data_dec[28] = rd_data[28] ^ rd_data_dec[24+2] ^ rd_addr[3];rd_data_dec[29] = rd_data[29] ^ rd_data_dec[24+3] ^ rd_addr[8];rd_data_dec[30] = rd_data[30] ^ rd_addr[6];~

rd_data_dec[31] = rd_data[31] ^ rd_data_dec[24+4] ^ rd_addr[4];其中,rd_data表示解密前的数据,rd_data_dec表示解密后的数据,rd_addr表示读数据在FLASH中的地址。

2.根据权利要求1所述的一种SPI FLASH加密接口,其特征在于:所述数据模块内设置有读数据缓存单元和写数据缓存单元。

3.一种SPI FLASH加密数据的写入方法,包括如下步骤:S1:系统总线将写命令发送至命令模块,将字节写数据发送至数据模块;

S2:命令模块接收到写命令后,判断写命令中的地址是否在数据模块的写数据缓存单元中命中,如果命中,则将缓存数据更新,并转到S7,否则转到S3;

S3:命令模块将写命令传递至状态机模块,状态机模块对写命令进行状态转换;

S4:通过加密模块对数据模块中的字节写数据进行加密处理;

S5:将写命令以及经加密模块加密处理后的字节写数据依次传递至协议转换模块;

S6:协议转换模块按顺序将命令序列输出至SPI FLASH内;

S7:完成本次写操作;

所述步骤S4中包括如下步骤:

S401:对字节0的加密算法,如下:

wr_data_enc[0] = wr_data[0] ^ wr_data[2] ^ wr_addr[2];wr_data_enc[1] = wr_data[1] ^ wr_data[3] ^ wr_addr[3];wr_data_enc[2] = wr_data[2] ^ wr_data[5] ^ wr_addr[4];wr_data_enc[3] = wr_data[3] ^ wr_data[6] ^ wr_addr[5];wr_data_enc[4] = wr_data[4] ^ wr_data[7] ^ wr_addr[6];wr_data_enc[5] = wr_data[5] ^ wr_addr[7];~

wr_data_enc[6] = wr_data[6] ^ wr_data[0] ^ wr_addr[8];wr_data_enc[7] = wr_data[7] ^ wr_data[1] ^ wr_addr[9];其中,wr_data表示加密前的数据,wr_data_enc表示加密后的数据,wr_addr表示系统总线将数据要写入PSI FLASH的地址;

S402:对字节1的加密算法,如下:

wr_data_enc[8]  = wr_data[ 8] ^ wr_data[8+6] ^ wr_addr[9];wr_data_enc[9]  = wr_data[ 9] ^ wr_data[8+7] ^ wr_addr[8];wr_data_enc[10] = wr_data[10] ^ wr_data[8+0] ^ wr_addr[7];wr_data_enc[11] = wr_data[11] ^ wr_addr[6];~

wr_data_enc[12] = wr_data[12] ^ wr_data[8+1] ^ wr_addr[5];wr_data_enc[13] = wr_data[13] ^ wr_data[8+3] ^ wr_addr[4];wr_data_enc[14] = wr_data[14] ^ wr_data[8+4] ^ wr_addr[3];wr_data_enc[15] = wr_data[15] ^ wr_data[8+5] ^ wr_addr[2];其中,wr_data表示加密前的数据,wr_data_enc表示加密后的数据,wr_addr表示系统总线将数据要写入PSI FLASH的地址;

S403:对字节2的加密算法,如下:

wr_data_enc[16] = wr_data[16] ^ wr_data[16+3] ^ wr_addr[2];wr_data_enc[17] = wr_data[17] ^ wr_data[16+4] ^ wr_addr[4];wr_data_enc[18] = wr_data[18] ^ wr_data[16+6] ^ wr_addr[3];wr_data_enc[19] = wr_data[19] ^ wr_data[16+7] ^ wr_addr[9];wr_data_enc[20] = wr_data[20] ^ wr_data[16+0] ^ wr_addr[7];wr_data_enc[21] = wr_data[21] ^ wr_data[16+1] ^ wr_addr[8];wr_data_enc[22] = wr_data[22] ^ wr_addr[5];~

wr_data_enc[23] = wr_data[23] ^ wr_data[16+2] ^ wr_addr[6];其中,wr_data表示加密前的数据,wr_data_enc表示加密后的数据,wr_addr表示系统总线将数据要写入PSI FLASH的地址;

S404:对字节3的加密算法,如下:

wr_data_enc[24] = wr_data[24] ^ wr_data[24+5] ^ wr_addr[5];wr_data_enc[25] = wr_data[25] ^ wr_data[24+7] ^ wr_addr[9];wr_data_enc[26] = wr_data[26] ^ wr_data[24+6] ^ wr_addr[7];wr_data_enc[27] = wr_data[27] ^ wr_data[24+1] ^ wr_addr[2];wr_data_enc[28] = wr_data[28] ^ wr_data[24+2] ^ wr_addr[3];wr_data_enc[29] = wr_data[29] ^ wr_data[24+3] ^ wr_addr[8];wr_data_enc[30] = wr_data[30] ^ wr_addr[6];~

wr_data_enc[31] = wr_data[31] ^ wr_data[24+4] ^ wr_addr[4];其中,wr_data表示加密前的数据,wr_data_enc表示加密后的数据,wr_addr表示系统总线将数据要写入PSI FLASH的地址。

4.一种SPI FLASH加密数据的读取方法,包括如下步骤:S1:系统总线发送读命令至命令模块,并等待数据模块反馈读数据;

S2:命令模块判断读命令中的地址是否在数据模块的读数据缓存单元中命中,如果命中,则直接将字节数据反馈给总线,并转到步骤S10,否则转到步骤S3;

S3:向系统总线反馈等待信号;

S4:将读命令传递至状态机模块,通过状态机模块进行状态转换,将读命令解析后传递至协议转换模块;

S5:协议转换模块按照顺序将读命令序列输出至SPI FLASH;

S6:SPI FLASH接到读命令序列后,将字节数据序列发送至协议转换模块;

S7:协议转换模块将字节数据序列转成芯片内部的数据格式并反馈至状态机模块;

S8:状态机模块进行状态转换后将该字节数据传递至解密模块;

S9:解密模块通过解密算法对字节数据进行解密,然后将解密后的字节数据经数据模块反馈至系统总线;

S10:完成本次读操作;

所述步骤S9中包括如下步骤:

S901:对字节0的解密算法:

rd_data_dec[0] = rd_data[0] ^ rd_data_dec[2] ^ rd_addr[2];rd_data_dec[1] = rd_data[1] ^ rd_data_dec[3] ^ rd_addr[3];rd_data_dec[2] = rd_data[2] ^ rd_data_dec[5] ^ rd_addr[4];rd_data_dec[3] = rd_data[3] ^ rd_data_dec[6] ^ rd_addr[5];rd_data_dec[4] = rd_data[4] ^ rd_data_dec[7] ^ rd_addr[6];rd_data_dec[5] = rd_data[5] ^ rd_addr[7];~

rd_data_dec[6] = rd_data[6] ^ rd_data_dec[0] ^ rd_addr[8];rd_data_dec[7] = rd_data[7] ^ rd_data_dec[1] ^ rd_addr[9];S902:对字节1的解密算法:

rd_data_dec[8]  = rd_data[8]  ^ rd_data_dec[8+6] ^ rd_addr[9];rd_data_dec[9]  = rd_data[9]  ^ rd_data_dec[8+7] ^ rd_addr[8];rd_data_dec[10] = rd_data[10] ^ rd_data_dec[8+0] ^ rd_addr[7];rd_data_dec[11] = rd_data[11] ^ rd_addr[6];~

rd_data_dec[12] = rd_data[12] ^ rd_data_dec[8+1] ^ rd_addr[5];rd_data_dec[13] = rd_data[13] ^ rd_data_dec[8+3] ^ rd_addr[4];rd_data_dec[14] = rd_data[14] ^ rd_data_dec[8+4] ^ rd_addr[3];rd_data_dec[15] = rd_data[15] ^ rd_data_dec[8+5] ^ rd_addr[2];S903:对字节2的解密算法:

rd_data_dec[16] = rd_data[16] ^ rd_data_dec[16+3] ^ rd_addr[2];rd_data_dec[17] = rd_data[17] ^ rd_data_dec[16+4] ^ rd_addr[4];rd_data_dec[18] = rd_data[18] ^ rd_data_dec[16+6] ^ rd_addr[3];rd_data_dec[19] = rd_data[19] ^ rd_data_dec[16+7] ^ rd_addr[9];rd_data_dec[20] = rd_data[20] ^ rd_data_dec[16+0] ^ rd_addr[7];rd_data_dec[21] = rd_data[21] ^ rd_data_dec[16+1] ^ rd_addr[8];rd_data_dec[22] = rd_data[22] ^ rd_addr[5];~

rd_data_dec[23] = rd_data[23] ^ rd_data_dec[16+2] ^ rd_addr[6];S904:对字节3的解密算法:

rd_data_dec[24] = rd_data[24] ^ rd_data_dec[24+5] ^ rd_addr[5];rd_data_dec[25] = rd_data[25] ^ rd_data_dec[24+7] ^ rd_addr[9];rd_data_dec[26] = rd_data[26] ^ rd_data_dec[24+6] ^ rd_addr[7];rd_data_dec[27] = rd_data[27] ^ rd_data_dec[24+1] ^ rd_addr[2];rd_data_dec[28] = rd_data[28] ^ rd_data_dec[24+2] ^ rd_addr[3];rd_data_dec[29] = rd_data[29] ^ rd_data_dec[24+3] ^ rd_addr[8];rd_data_dec[30] = rd_data[30] ^ rd_addr[6];~

rd_data_dec[31] = rd_data[31] ^ rd_data_dec[24+4] ^ rd_addr[4];其中,rd_data表示解密前的数据,rd_data_dec表示解密后的数据,rd_addr表示读数据在FLASH中的地址。

说明书 :

一种SPI FLASH加密接口及加密数据的读写方法

技术领域

[0001] 本发明属于电子芯片技术领域,涉及一种电子芯片的加密设备及方法,尤其是一种针对SPI FLASH的加密接口及读写方法;采用该加密接口及读写方法,能够实现对SPI FLASH的按字节读写,以及按字节加密,提高了系统访问SPI FLASH的效率。

背景技术

[0002] 在一个加密主控芯片系统中,通常需要将启动程序部分的数据置于跟主控芯片一体封装的SPI NORFLASH中,以提高系统的安全系数。上述启动程序的数据在写入SPI FLASH之前必然需要对其进行加密处理,所以当读出上述数据后必然要进行反向的解密操作才能得到真实的数据。
[0003] 现有技术中的加密算法,是针对整个字进行的加密运算,使得加密后的数据与其存储地址以及同一字内的位于不同字节的位有相关性。虽然SPI FLASH的接口标准支持按字节写的命令,但是采用上述按字加密的方式使得同一字内的不同字节之间产生依赖关系,丧失了按字节写的灵活性。
[0004] 此外,由于FLASH的操作特性是先擦后写,而且擦除单位通常为一个扇区,如果只能按字写入的话,软件在要写入一个字节之前首先要判断该字节所在的字的所有字节是否有数据,如果没有数据可以直接写该字,如果任何一个字节有数据,都需要先将该字所在的扇区读出到缓存,将需要写的相应字节位置替换成新字节,然后进行擦除操作,然后再按照需要将整个扇区重新写入FLASH。该种方式不仅降低系统效率而且对软件有极高的要求,使得对SPI FLASH按字节写入加密数据的操作成本提高。此为现有技术的不足之处。
[0005] 因此,提供设计一种新型的针对SPI FLASH的加密接口及读写方法,以提高系统访问SPI FLASH的效率是非常有必要的。

发明内容

[0006] 本发明的目的在于,针对上述现有技术中存在的缺陷,提供设计一种针对SPI FLASH的加密接口及读写方法,以解决上述技术问题,在保持算法复杂度的同时,减少软件工作量,并提高系统访问SPI FLASH的效率。
[0007] 为实现上述目的,本发明给出以下技术方案:
[0008] 一种SPI FLASH加密接口,包括命令模块、数据模块、加密模块、解密模块、状态机模块以及协议转换模块;其特征在于:
[0009] 所述命令模块与系统总线相连,用于寄存来自系统总线的地址、读写信息、数据块大小及传输类型,并将系统总线的读写需求传递至数据模块和状态机模块,将状态机模块的当前操作状态反馈至系统总线;
[0010] 所述数据模块与系统总线、命令模块、加密模块以及解密模块相连,数据模块用于寄存系统总线要写入SPI FLASH的字节数据以及从SPI FLASH中读取的字节数据;
[0011] 所述加密模块与数据模块、命令模块以及状态机模块相连,用于将写入SPI FLASH的字节数据按照特定的加密算法转换成密文;
[0012] 所述解密模块与数据模块、状态机模块相连,用于将从FLASH内读出的字节数据按照特定的解密算法转换成明文;
[0013] 所述状态机模块与命令模块、加密模块、解密模块以及协议转换模块相连,用于解析来自命令模块的数据,以实现对SPI FLASH读写擦状态的转换控制,并反馈FLASH的状态信息至命令模块;
[0014] 所述协议转换模块与状态机模块、SPI FLASH相连,实现SPI协议转换,即将命令和数据按照SPI协议组成相应的串行命令序列格式转送至片外的SPI FLASH,或者将从SPI FLASH串行读入的数据寄存重新组成字节或者字的数据格式。
[0015] 优选地,所述数据模块内设置有读数据缓存单元和写数据缓存单元。
[0016] 一种SPI FLASH加密数据的写入方法,包括如下步骤:
[0017] S1:系统总线将写命令发送至命令模块,将字节写数据发送至数据模块;
[0018] S2:命令模块接收到写命令后,判断写命令中的地址是否在数据模块的写数据缓存单元中命中,如果命中,则将缓存数据更新,并转到S7,否则转到S3;
[0019] S3:命令模块将写命令传递至状态机模块,状态机模块对写命令进行状态转换;
[0020] S4:通过加密模块对数据模块中的字节写数据进行加密处理;
[0021] S5:将写命令以及经加密模块加密处理后的字节写数据依次传递至协议转换模块;
[0022] S6:协议转换模块按顺序将命令序列输出至SPI FLASH内;
[0023] S7:完成本次写操作。
[0024] 优选地,所述步骤S4中包括如下步骤:
[0025] S401:对字节0的加密算法,如下:
[0026] wr_data_enc[0] = wr_data[0] ^ wr_data[2] ^ wr_addr[2];
[0027] wr_data_enc[1] = wr_data[1] ^ wr_data[3] ^ wr_addr[3];
[0028] wr_data_enc[2] = wr_data[2] ^ wr_data[5] ^ wr_addr[4];
[0029] wr_data_enc[3] = wr_data[3] ^ wr_data[6] ^ wr_addr[5];
[0030] wr_data_enc[4] = wr_data[4] ^ wr_data[7] ^ wr_addr[6];
[0031] wr_data_enc[5] = wr_data[5] ^ wr_addr[7];~
[0032] wr_data_enc[6] = wr_data[6] ^ wr_data[0] ^ wr_addr[8];
[0033] wr_data_enc[7] = wr_data[7] ^ wr_data[1] ^ wr_addr[9];
[0034] 其中,wr_data表示加密前的数据,wr_data_enc表示加密后的数据,wr_addr表示系统总线将数据要写入PSI FLASH的地址。
[0035] 优选地,所述步骤S4还包括如下步骤:
[0036] S402:对字节1的加密算法,如下:
[0037] wr_data_enc[8]  = wr_data[ 8] ^ wr_data[8+6] ^ wr_addr[9];
[0038] wr_data_enc[9]  = wr_data[ 9] ^ wr_data[8+7] ^ wr_addr[8];
[0039] wr_data_enc[10] = wr_data[10] ^ wr_data[8+0] ^ wr_addr[7];
[0040] wr_data_enc[11] = wr_data[11] ^ wr_addr[6];~
[0041] wr_data_enc[12] = wr_data[12] ^ wr_data[8+1] ^ wr_addr[5];
[0042] wr_data_enc[13] = wr_data[13] ^ wr_data[8+3] ^ wr_addr[4];
[0043] wr_data_enc[14] = wr_data[14] ^ wr_data[8+4] ^ wr_addr[3];
[0044] wr_data_enc[15] = wr_data[15] ^ wr_data[8+5] ^ wr_addr[2];
[0045] 其中,wr_data表示加密前的数据,wr_data_enc表示加密后的数据,wr_addr表示系统总线将数据要写入PSI FLASH的地址。
[0046] 优选地,所述步骤S4还包括如下步骤:
[0047] S403:对字节2的加密算法,如下:
[0048] wr_data_enc[16] = wr_data[16] ^ wr_data[16+3] ^ wr_addr[2];
[0049] wr_data_enc[17] = wr_data[17] ^ wr_data[16+4] ^ wr_addr[4];
[0050] wr_data_enc[18] = wr_data[18] ^ wr_data[16+6] ^ wr_addr[3];
[0051] wr_data_enc[19] = wr_data[19] ^ wr_data[16+7] ^ wr_addr[9];
[0052] wr_data_enc[20] = wr_data[20] ^ wr_data[16+0] ^ wr_addr[7];
[0053] wr_data_enc[21] = wr_data[21] ^ wr_data[16+1] ^ wr_addr[8];
[0054] wr_data_enc[22] = wr_data[22] ^ wr_addr[5];~
[0055] wr_data_enc[23] = wr_data[23] ^ wr_data[16+2] ^ wr_addr[6];
[0056] 其中,wr_data表示加密前的数据,wr_data_enc表示加密后的数据,wr_addr表示系统总线将数据要写入PSI FLASH的地址。
[0057] 优选地,所述步骤S4还包括如下步骤:
[0058] S404:对字节3的加密算法,如下:
[0059] wr_data_enc[24] = wr_data[24] ^ wr_data[24+5] ^ wr_addr[5];
[0060] wr_data_enc[25] = wr_data[25] ^ wr_data[24+7] ^ wr_addr[9];
[0061] wr_data_enc[26] = wr_data[26] ^ wr_data[24+6] ^ wr_addr[7];
[0062] wr_data_enc[27] = wr_data[27] ^ wr_data[24+1] ^ wr_addr[2];
[0063] wr_data_enc[28] = wr_data[28] ^ wr_data[24+2] ^ wr_addr[3];
[0064] wr_data_enc[29] = wr_data[29] ^ wr_data[24+3] ^ wr_addr[8];
[0065] wr_data_enc[30] = wr_data[30] ^ wr_addr[6];~
[0066] wr_data_enc[31] = wr_data[31] ^ wr_data[24+4] ^ wr_addr[4];
[0067] 其中,wr_data表示加密前的数据,wr_data_enc表示加密后的数据,wr_addr表示系统总线将数据要写入PSI FLASH的地址。
[0068] 一种SPI FLASH加密数据的读取方法,包括如下步骤:
[0069] S1:系统总线发送读命令至命令模块,并等待数据模块反馈读数据;
[0070] S2:命令模块判断读命令中的地址是否在数据模块的读数据缓存单元中命中,如果命中,则直接将字节数据反馈给总线,并转到步骤S10,否则转到步骤S3;
[0071] S3:向系统总线反馈等待信号;
[0072] S4:将读命令传递至状态机模块,通过状态机模块进行状态转换,将读命令解析后传递至协议转换模块;
[0073] S5:协议转换模块按照顺序将读命令序列输出至SPI FLASH;
[0074] S6:SPI FLASH接到读命令序列后,将字节数据序列发送至协议转换模块;
[0075] S7:协议转换模块将字节数据序列转成芯片内部的数据格式并反馈至状态机模块;
[0076] S8:状态机模块进行状态转换后将该字节数据传递至解密模块;
[0077] S9:解密模块通过解密算法对字节数据进行解密,然后将解密后的字节数据经数据模块反馈至系统总线;
[0078] S10:完成本次读操作。
[0079] 优选地,所述步骤S9中包括如下步骤:
[0080] S901:对字节0的解密算法:
[0081] rd_data_dec[0] = rd_data[0] ^ rd_data_dec[2] ^ rd_addr[2];
[0082] rd_data_dec[1] = rd_data[1] ^ rd_data_dec[3] ^ rd_addr[3];
[0083] rd_data_dec[2] = rd_data[2] ^ rd_data_dec[5] ^ rd_addr[4];
[0084] rd_data_dec[3] = rd_data[3] ^ rd_data_dec[6] ^ rd_addr[5];
[0085] rd_data_dec[4] = rd_data[4] ^ rd_data_dec[7] ^ rd_addr[6];
[0086] rd_data_dec[5] = rd_data[5] ^ rd_addr[7];~
[0087] rd_data_dec[6] = rd_data[6] ^ rd_data_dec[0] ^ rd_addr[8];
[0088] rd_data_dec[7] = rd_data[7] ^ rd_data_dec[1] ^ rd_addr[9];
[0089] S902:对字节1的解密算法:
[0090] rd_data_dec[8]  = rd_data[8]  ^ rd_data_dec[8+6] ^ rd_addr[9];
[0091] rd_data_dec[9]  = rd_data[9]  ^ rd_data_dec[8+7] ^ rd_addr[8];
[0092] rd_data_dec[10] = rd_data[10] ^ rd_data_dec[8+0] ^ rd_addr[7];
[0093] rd_data_dec[11] = rd_data[11] ^ rd_addr[6];~
[0094] rd_data_dec[12] = rd_data[12] ^ rd_data_dec[8+1] ^ rd_addr[5];
[0095] rd_data_dec[13] = rd_data[13] ^ rd_data_dec[8+3] ^ rd_addr[4];
[0096] rd_data_dec[14] = rd_data[14] ^ rd_data_dec[8+4] ^ rd_addr[3];
[0097] rd_data_dec[15] = rd_data[15] ^ rd_data_dec[8+5] ^ rd_addr[2];
[0098] S903:对字节2的解密算法:
[0099] rd_data_dec[16] = rd_data[16] ^ rd_data_dec[16+3] ^ rd_addr[2];
[0100] rd_data_dec[17] = rd_data[17] ^ rd_data_dec[16+4] ^ rd_addr[4];
[0101] rd_data_dec[18] = rd_data[18] ^ rd_data_dec[16+6] ^ rd_addr[3];
[0102] rd_data_dec[19] = rd_data[19] ^ rd_data_dec[16+7] ^ rd_addr[9];
[0103] rd_data_dec[20] = rd_data[20] ^ rd_data_dec[16+0] ^ rd_addr[7];
[0104] rd_data_dec[21] = rd_data[21] ^ rd_data_dec[16+1] ^ rd_addr[8];
[0105] rd_data_dec[22] = rd_data[22] ^ rd_addr[5];~
[0106] rd_data_dec[23] = rd_data[23] ^ rd_data_dec[16+2] ^ rd_addr[6];
[0107] S904:对字节3的解密算法:
[0108] rd_data_dec[24] = rd_data[24] ^ rd_data_dec[24+5] ^ rd_addr[5];
[0109] rd_data_dec[25] = rd_data[25] ^ rd_data_dec[24+7] ^ rd_addr[9];
[0110] rd_data_dec[26] = rd_data[26] ^ rd_data_dec[24+6] ^ rd_addr[7];
[0111] rd_data_dec[27] = rd_data[27] ^ rd_data_dec[24+1] ^ rd_addr[2];
[0112] rd_data_dec[28] = rd_data[28] ^ rd_data_dec[24+2] ^ rd_addr[3];
[0113] rd_data_dec[29] = rd_data[29] ^ rd_data_dec[24+3] ^ rd_addr[8];
[0114] rd_data_dec[30] = rd_data[30] ^ rd_addr[6];~
[0115] rd_data_dec[31] = rd_data[31] ^ rd_data_dec[24+4] ^ rd_addr[4];
[0116] 其中,rd_data表示解密前的数据,rd_data_dec表示解密后的数据,rd_addr表示读数据在FLASH中的地址。
[0117] 本发明的有益效果在于,将传统的按字加密方式改成按字节采用不同算法分别加密的方式,取消了字节间的加解密依赖关系,使得软件对SPI FLASH的操作大为简化;本发明的硬件开销与传统方式相比不相上下,因为加密算法使用的异或门个数相对于上百至千万门的大规模集成电路而言所占面积比重微乎其微;加密算法采用二至三级异或对时序的影响不大,在UMC0.11工艺下至少可以保证时钟频率达到200M;本发明在保证系统保密安全的基础上有效降低了软件操作的复杂度,提升了整个系统的效率。此外,本发明设计原理可靠,结构简单,具有非常广泛的应用前景。
[0118] 由此可见,本发明与现有技术相比,具有突出的实质性特点和显著地进步,其实施的有益效果也是显而易见的。

附图说明

[0119] 图1为本发明提供的一种SPI FLASH加密接口的结构示意图。
[0120] 其中,1-系统总线,2-SPI FLASH加密接口,3-SPI FLASH,21-命令模块,22-数据模块,23-加密模块,24-解密模块,25-状态机模块,26-协议转换模块。

具体实施方式

[0121] 下面结合附图并通过具体实施例对本发明进行详细阐述,以下实施例是对本发明的解释,而本发明并不局限于以下实施方式。
[0122] 如图1所示,本发明提供的一种SPI FLASH加密接口,包括命令模块21、数据模块22、加密模块23、解密模块24、状态机模块25以及协议转换模块26;
[0123] 所述命令模块21与系统总线1相连,用于寄存来自系统总线1的地址、读写信息、数据块大小及传输类型,并将系统总线1的读写需求传递至数据模块22和状态机模块25,将状态机模块25的当前操作状态反馈至系统总线1;
[0124] 所述数据模块22与系统总线1、命令模块21、加密模块23以及解密模块24相连,数据模块22用于寄存系统总线1要写入SPI FLASH3的字节数据以及从SPI FLASH3中读取的字节数据;
[0125] 所述加密模块23与数据模块22、命令模块21以及状态机模块25相连,用于将写入SPI FLASH3的字节数据按照特定的加密算法转换成密文;
[0126] 所述解密模块24与数据模块22、状态机模块25相连,用于将从SPI FLASH3内读出的字节数据按照特定的解密算法转换成明文;
[0127] 所述状态机模块25与命令模块21、加密模块23、解密模块24以及协议转换模块26相连,用于解析来自命令模块21的数据,以实现对SPI FLASH3读写擦状态的转换控制,并反馈SPI FLASH3的状态信息至命令模块;
[0128] 所述协议转换模块26与状态机模块25、SPI FLASH3相连,实现SPI协议转换,即将命令和数据按照SPI协议组成相应的串行命令序列格式转送至片外的SPI FLASH3,或者将从SPI FLASH3串行读入的数据寄存重新组成字节或者字的数据格式。
[0129] 本实施例中,所述数据模块22内设置有读数据缓存单元和写数据缓存单元。
[0130] 本实施例中还提供了一种SPI FLASH加密数据的写入方法,包括如下步骤:
[0131] S1:系统总线将写命令发送至命令模块,将字节写数据发送至数据模块;
[0132] S2:命令模块接收到写命令后,判断写命令中的地址是否在数据模块的写数据缓存单元中命中,如果命中,则将缓存数据更新,并转到S7,否则转到S3;
[0133] S3:命令模块将写命令传递至状态机模块,状态机模块对写命令进行状态转换;
[0134] S4:通过加密模块对数据模块中的字节写数据进行加密处理;
[0135] S5:将写命令以及经加密模块加密处理后的字节写数据依次传递至协议转换模块;
[0136] S6:协议转换模块按顺序将命令序列输出至SPI FLASH内;
[0137] S7:完成本次写操作。
[0138] 本实施例中,所述步骤S4中包括如下步骤:
[0139] S401:对字节0的加密算法,如下:
[0140] wr_data_enc[0] = wr_data[0] ^ wr_data[2] ^ wr_addr[2];
[0141] wr_data_enc[1] = wr_data[1] ^ wr_data[3] ^ wr_addr[3];
[0142] wr_data_enc[2] = wr_data[2] ^ wr_data[5] ^ wr_addr[4];
[0143] wr_data_enc[3] = wr_data[3] ^ wr_data[6] ^ wr_addr[5];
[0144] wr_data_enc[4] = wr_data[4] ^ wr_data[7] ^ wr_addr[6];
[0145] wr_data_enc[5] = wr_data[5] ^ wr_addr[7];~
[0146] wr_data_enc[6] = wr_data[6] ^ wr_data[0] ^ wr_addr[8];
[0147] wr_data_enc[7] = wr_data[7] ^ wr_data[1] ^ wr_addr[9];
[0148] 其中,wr_data表示加密前的数据,wr_data_enc表示加密后的数据,wr_addr表示系统总线将数据要写入PSI FLASH的地址。
[0149] 本实施例中,所述步骤S4还包括如下步骤:
[0150] S402:对字节1的加密算法,如下:
[0151] wr_data_enc[8]  = wr_data[ 8] ^ wr_data[8+6] ^ wr_addr[9];
[0152] wr_data_enc[9]  = wr_data[ 9] ^ wr_data[8+7] ^ wr_addr[8];
[0153] wr_data_enc[10] = wr_data[10] ^ wr_data[8+0] ^ wr_addr[7];
[0154] wr_data_enc[11] = wr_data[11] ^ wr_addr[6];~
[0155] wr_data_enc[12] = wr_data[12] ^ wr_data[8+1] ^ wr_addr[5];
[0156] wr_data_enc[13] = wr_data[13] ^ wr_data[8+3] ^ wr_addr[4];
[0157] wr_data_enc[14] = wr_data[14] ^ wr_data[8+4] ^ wr_addr[3];
[0158] wr_data_enc[15] = wr_data[15] ^ wr_data[8+5] ^ wr_addr[2];
[0159] 其中,wr_data表示加密前的数据,wr_data_enc表示加密后的数据,wr_addr表示系统总线将数据要写入PSI FLASH的地址。
[0160] 本实施例中,所述步骤S4还包括如下步骤:
[0161] S403:对字节2的加密算法,如下:
[0162] wr_data_enc[16] = wr_data[16] ^ wr_data[16+3] ^ wr_addr[2];
[0163] wr_data_enc[17] = wr_data[17] ^ wr_data[16+4] ^ wr_addr[4];
[0164] wr_data_enc[18] = wr_data[18] ^ wr_data[16+6] ^ wr_addr[3];
[0165] wr_data_enc[19] = wr_data[19] ^ wr_data[16+7] ^ wr_addr[9];
[0166] wr_data_enc[20] = wr_data[20] ^ wr_data[16+0] ^ wr_addr[7];
[0167] wr_data_enc[21] = wr_data[21] ^ wr_data[16+1] ^ wr_addr[8];
[0168] wr_data_enc[22] = wr_data[22] ^ wr_addr[5];~
[0169] wr_data_enc[23] = wr_data[23] ^ wr_data[16+2] ^ wr_addr[6];
[0170] 其中,wr_data表示加密前的数据,wr_data_enc表示加密后的数据,wr_addr表示系统总线将数据要写入PSI FLASH的地址。
[0171] 本实施例中,所述步骤S4还包括如下步骤:
[0172] S404:对字节3的加密算法,如下:
[0173] wr_data_enc[24] = wr_data[24] ^ wr_data[24+5] ^ wr_addr[5];
[0174] wr_data_enc[25] = wr_data[25] ^ wr_data[24+7] ^ wr_addr[9];
[0175] wr_data_enc[26] = wr_data[26] ^ wr_data[24+6] ^ wr_addr[7];
[0176] wr_data_enc[27] = wr_data[27] ^ wr_data[24+1] ^ wr_addr[2];
[0177] wr_data_enc[28] = wr_data[28] ^ wr_data[24+2] ^ wr_addr[3];
[0178] wr_data_enc[29] = wr_data[29] ^ wr_data[24+3] ^ wr_addr[8];
[0179] wr_data_enc[30] = wr_data[30] ^ wr_addr[6];~
[0180] wr_data_enc[31] = wr_data[31] ^ wr_data[24+4] ^ wr_addr[4];
[0181] 其中,wr_data表示加密前的数据,wr_data_enc表示加密后的数据,wr_addr表示系统总线将数据要写入PSI FLASH的地址。
[0182] 本实施例还提供了一种SPI FLASH加密数据的读取方法,包括如下步骤:
[0183] S1:系统总线发送读命令至命令模块,并等待数据模块反馈读数据;
[0184] S2:命令模块判断读命令中的地址是否在数据模块的读数据缓存单元中命中,如果命中,则直接将字节数据反馈给总线,并转到步骤S10,否则转到步骤S3;
[0185] S3:向系统总线反馈等待信号;
[0186] S4:将读命令传递至状态机模块,通过状态机模块进行状态转换,将读命令解析后传递至协议转换模块;
[0187] S5:协议转换模块按照顺序将读命令序列输出至SPI FLASH;
[0188] S6:SPI FLASH接到读命令序列后,将字节数据序列发送至协议转换模块;
[0189] S7:协议转换模块将字节数据序列转成芯片内部的数据格式并反馈至状态机模块;
[0190] S8:状态机模块进行状态转换后将该字节数据传递至解密模块;
[0191] S9:解密模块通过解密算法对字节数据进行解密,然后将解密后的字节数据经数据模块反馈至系统总线;
[0192] S10:完成本次读操作。
[0193] 本实施例中,所述步骤S9中包括如下步骤:
[0194] S901:对字节0的解密算法:
[0195] rd_data_dec[0] = rd_data[0] ^ rd_data_dec[2] ^ rd_addr[2];
[0196] rd_data_dec[1] = rd_data[1] ^ rd_data_dec[3] ^ rd_addr[3];
[0197] rd_data_dec[2] = rd_data[2] ^ rd_data_dec[5] ^ rd_addr[4];
[0198] rd_data_dec[3] = rd_data[3] ^ rd_data_dec[6] ^ rd_addr[5];
[0199] rd_data_dec[4] = rd_data[4] ^ rd_data_dec[7] ^ rd_addr[6];
[0200] rd_data_dec[5] = rd_data[5] ^ rd_addr[7];~
[0201] rd_data_dec[6] = rd_data[6] ^ rd_data_dec[0] ^ rd_addr[8];
[0202] rd_data_dec[7] = rd_data[7] ^ rd_data_dec[1] ^ rd_addr[9];
[0203] S902:对字节1的解密算法:
[0204] rd_data_dec[8]  = rd_data[8]  ^ rd_data_dec[8+6] ^ rd_addr[9];
[0205] rd_data_dec[9]  = rd_data[9]  ^ rd_data_dec[8+7] ^ rd_addr[8];
[0206] rd_data_dec[10] = rd_data[10] ^ rd_data_dec[8+0] ^ rd_addr[7];
[0207] rd_data_dec[11] = rd_data[11] ^ rd_addr[6];~
[0208] rd_data_dec[12] = rd_data[12] ^ rd_data_dec[8+1] ^ rd_addr[5];
[0209] rd_data_dec[13] = rd_data[13] ^ rd_data_dec[8+3] ^ rd_addr[4];
[0210] rd_data_dec[14] = rd_data[14] ^ rd_data_dec[8+4] ^ rd_addr[3];
[0211] rd_data_dec[15] = rd_data[15] ^ rd_data_dec[8+5] ^ rd_addr[2];
[0212] S903:对字节2的解密算法:
[0213] rd_data_dec[16] = rd_data[16] ^ rd_data_dec[16+3] ^ rd_addr[2];
[0214] rd_data_dec[17] = rd_data[17] ^ rd_data_dec[16+4] ^ rd_addr[4];
[0215] rd_data_dec[18] = rd_data[18] ^ rd_data_dec[16+6] ^ rd_addr[3];
[0216] rd_data_dec[19] = rd_data[19] ^ rd_data_dec[16+7] ^ rd_addr[9];
[0217] rd_data_dec[20] = rd_data[20] ^ rd_data_dec[16+0] ^ rd_addr[7];
[0218] rd_data_dec[21] = rd_data[21] ^ rd_data_dec[16+1] ^ rd_addr[8];
[0219] rd_data_dec[22] = rd_data[22] ^ rd_addr[5];~
[0220] rd_data_dec[23] = rd_data[23] ^ rd_data_dec[16+2] ^ rd_addr[6];
[0221] S904:对字节3的解密算法:
[0222] rd_data_dec[24] = rd_data[24] ^ rd_data_dec[24+5] ^ rd_addr[5];
[0223] rd_data_dec[25] = rd_data[25] ^ rd_data_dec[24+7] ^ rd_addr[9];
[0224] rd_data_dec[26] = rd_data[26] ^ rd_data_dec[24+6] ^ rd_addr[7];
[0225] rd_data_dec[27] = rd_data[27] ^ rd_data_dec[24+1] ^ rd_addr[2];
[0226] rd_data_dec[28] = rd_data[28] ^ rd_data_dec[24+2] ^ rd_addr[3];
[0227] rd_data_dec[29] = rd_data[29] ^ rd_data_dec[24+3] ^ rd_addr[8];
[0228] rd_data_dec[30] = rd_data[30] ^ rd_addr[6];~
[0229] rd_data_dec[31] = rd_data[31] ^ rd_data_dec[24+4] ^ rd_addr[4];
[0230] 其中,rd_data表示解密前的数据,rd_data_dec表示解密后的数据,rd_addr表示读数据在FLASH中的地址。
[0231] 以上公开的仅为本发明的优选实施方式,但本发明并非局限于此,任何本领域的技术人员能思之的没有创造性的变化,以及在不脱离本发明原理前提下所作的若干改进和润饰,都应落在本发明的保护范围内。