算法介绍
AES加密主要分为四个基本步骤:字节替代,行位移,列混淆,轮密钥加,AES的明文是放在4*4矩阵中的,一个矩阵经过上面四步为一轮,加解密的刚开始都需要进行轮密钥加步骤,之后按顺序执行上面四个步骤,在最后一轮中不执行列混淆操作,因为最后一轮加列混淆并不会加大AES算法的安全性,只会降低算法效率。在每一轮中都会参一点密钥,每一轮的密钥都是由初始密钥扩展得到。密钥长度可选128位(10轮),192位(12轮),256位(14轮),由此可知循环轮数越多,秘钥长度越长,信息加密也就会越安全。
GPON中AES使用计数器(CTR)模式。密码算法产生一个16字节的伪随机码块流,伪随机码块与输入的明文进行异或运算后产生密文输出。密文与同样的伪随机码进行异或运算后可以重产生明文。密钥长度是固定128bit。CTR模式中,OLT和所有ONU使用公共的经过同步的密码计数器。密码计数器的结构,计数器宽度为46比特,低16比特为帧内计数器,高30比特是帧间计数器。帧内计数器在下行帧开始时置为0,第1个字节是PCBd,每4字节递增。在1.244Gb/s下行速率系统中,计数器的运行范围是0到4859。帧间计数器与在PCBd的Ident域中传递的复帧计数器保持一致。ONU实现一个经过同步的本地计数器因此可以修复这个域的错误。随机密码块与数据包净荷的起始位置对齐。只对GEM帧/分片的净荷进行加密,GEM帧头不进行加密。由于GEM分片不一定是一个完整的编码块,所以尾数据块(长度为1到16字节)与尾AES密码块(长度为16字节)的MSB进行异或运算。尾密码块的其余部分将会被丢弃。
密码计数器与GTC下行帧对齐,但是AES密码块与数据净荷对齐。这两个序列的关系如图所示。当数据包在OLT上发送或者在ONU上接收时帧头第一个字节的位置被标注。该字节位置的密码计数器值用作数据包的密码块计数器的开始值。对于数据包中接下来的密码块计数器对每个块递增1。这种方法可以保证计数器的同一值不会被重复使用。
46比特长的块计数器值按照如下方式推导出AES算法的128比特输入46比特复制3次后变成一个138比特的序列,高位10比特会被丢弃。剩余的128比特按照AES算法加密生成128比特随机密码,然后于用户净荷数据进行异或操作。
GPON协议中AES加密的流程如下:
- 确定AES-128的密钥
- 取出帧内计数器和帧间计数器,帧内计数器作为低16bit,帧间计数器作为高30bit,组装成46bit的密码块
- 密码块复制3次去掉最高10bit,得到128bit明文,对该明文进行AES-128加密,得到伪随机密文
- 将得到的伪随机密文和128bit数据块进行异或(数据不足128bit时从最高位依次异或至末位),得到加密内容
解密流程类似,得到伪随机密文后将其与加密数据异或,得到真实数据。
样例
样例1:
密钥:0x112233445566778899AABBCCDDEEFF00
帧内计数器:0x0027
帧间计数器:0x3DCAE120
待加密数据序列:0x000102030405060708090A0B0C0D0E0F
46比特密码块序列:1111011100101011100001001000000000000000100111
加密后数据序列:0x3AFB97EEFCBCC16B6C571AA4FF7AC3AD
样例2:
密钥:0x112233445566778899AABBCCDDEEFF00
帧内计数器:0x0028
帧间计数器:0x3DCAE120
待加密数据序列:0x101112131415161718191A1B1C1D1E1F202122
46bit密码块序列:1111011100101011100001001000000000000000101000
加密后数据序列:0x6C85285A57F89E7A3607CA8ACE450A97
样例3:
密钥:0x112233445566778899AABBCCDDEEFF00
帧内计数器:0x0031
帧间计数器:0x3DCAE120
待加密数据序列:0xAABBCCDDEEFF
46bit密码块序列:1111011100101011100001001000000000000000110001
加密后数据序列:0x8B5F94E48F34
样例4:
密钥:0x112233445566778899AABBCCDDEEFF00
帧内计数器:0x0034
帧间计数器:0x3DCAE120
待加密数据序列:0x112233445566778899AABBCCDDEEFF
46bit密码块序列:1111011100101011100001001000000000000000110100
加密后数据序列:0x9DF4F415F6A43CD0300FF69288EE54