一般需要分为三个步骤:
算出L的值,然后算出K1,K2的值,可以对比AES在线加密工具作为对比
/**
* 算法逻辑
*
* @param key
* @param data
* @return
*/
public static byte[] Aes_Cmac01(byte[] key, byte[] data) {
// 子密钥生成
// 步骤1,将具有密钥K的AES-128应用于全零输入块。
byte[] L = aesEncryptNoPadding(key, new byte[16], new byte[16]);
Log.i(TAG, "configUUIDValue L: " + ByteUtils.bytes2HexStr(L));
// 步骤2,通过以下操作得出K1:
//如果L的最高有效位等于0,则K1是L的左移1位。
byte[] FirstSubkey = Rol(L);
if ((L[0] & 0x80) == 0x80) {
// 否则,K1是const_Rb的异或和L左移1位。
FirstSubkey[15] ^= 0x87;
}
// Log.i(TAG, "configUUIDValue K1: "+ ByteUtils.bytes2HexStr(FirstSubkey));
// FirstSubkey = ByteUtils.hexStr2Bytes("AC362C7FCCE2BD996153C64B7D39A82A");
Log.i(TAG, "configUUIDValue K1: " + ByteUtils.bytes2HexStr(FirstSubkey));
// 步骤3,通过以下操作得出K2:
//如果K1的最高有效位等于0,则K2是K1左移1位
byte[] SecondSubkey = Rol(FirstSubkey);
if ((FirstSubkey[0] & 0x80) == 0x80) {
// 否则,K2是const_Rb的异或,且K1左移1位
SecondSubkey[15] ^= 0x87;
}
// Log.i(TAG, "configUUIDValue K2: "+ ByteUtils.bytes2HexStr(SecondSubkey));
// SecondSubkey = ByteUtils.hexStr2Bytes("586C58FF99C57B32C2A78C96FA7350D3");
Log.i(TAG, "configUUIDValue K2: " + By