Android 中使用AES-CMAC数据加密

一般需要分为三个步骤:

算出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

你可能感兴趣的:(android,安全,java,AES,CMAC)