java代码 实现AES_CMAC 算法测试

简介: 该代码实现了一个AES-CMAC算法的简单测试,使用Bouncy Castle作为安全提供者。静态变量K定义了固定密钥。`Aes_Cmac`函数接受密钥和消息,返回AES-CMAC生成的MAC值。在`main`方法中,程序对给定的消息进行AES-CMAC加密,然后模拟接收ECU的加密结果并进行比较。如果两者匹配,输出"验证成功",否则输出"验证失败"。辅助方法包括将字节转为16进制字符串和将16进制字符串转为字节。

{

public static String K = "4e25a17527b9a2f32d47023f055c7e95";//固定密钥

static {
    // 添加 Bouncy Castle 作为安全提供者
    if (Security.getProvider("BC") == null) {
        Security.addProvider(new BouncyCastleProvider());
    }
}

//得到加密后数据 MAC
public static byte[] Aes_Cmac(byte[] key, byte[] message) {

    // 将密钥K转换为KeyParameter类型
    KeyParameter keyParam = new KeyParameter(key);

    // 创建CMAC对象,使用AES算法
    CMac cmac = new CMac(new org.bouncycastle.crypto.engines.AESEngine(), 16 * 8); // AES-128
    cmac.init(keyParam);

    // 进行CMAC处理
    cmac.update(message, 0, message.length);

    // 获取计算出的MAC值
    byte[] mac = new byte[cmac.getMacSize()];
    cmac.doFinal(mac, 0);

    return mac;
}

public static void main(String[] args) throws Exception {
    byte[] key = hexStrtoByte(K); // 密钥
    byte[] message = hexStrtoByte("ae 38 dc af ff 9f 39 f6 8c 61 62 d8 69 e1 97 31".replace(" ",""));

    // 使用AES-CMAC进行加密(实际是消息认证)
    byte[] Encrypt = Aes_Cmac(key, message);
    System.out.println(bytesToHex(Encrypt));

    // 在这里发送27 02 + Encrypt 给ECU,并接收ECU计算的 Encrypt1并进行比较...

    // 省略了网络通信部分,仅保留逻辑核心(模拟67 02 ECU的比较过程)
    byte[] Encrypt1FromECU = receiveEncryptedCMACFromECU();
    System.out.println(bytesToHex(Encrypt1FromECU));

    // 比较两个加密后的数据是否一致
    boolean isMatch = Arrays.equals(Encrypt, Encrypt1FromECU);
    if (isMatch) {
        System.out.println("验证成功,返回67 02");
    } else {
        System.out.println("验证失败,返回NRC 35 36");
    }
}

// 辅助方法:模拟从ECU接收加密后的 CMAC(此处假设)
private static byte[] receiveEncryptedCMACFromECU() {
    // 实际情况下,这应该是通过网络通信接收到的数据
    // 此处仅为示例,返回一个假定的CMAC结果
    byte[] key = hexStrtoByte("4e25a17527b9a2f32d47023f055c7e95");
    byte[] message = hexStrtoByte("AE38DCAFFF9F39F68C6162D869E19731");
    return Aes_Cmac(key, message);
}

//bytes --> 16进制
private static String bytesToHex(byte[] bytes) {
    StringBuilder sb = new StringBuilder();
    for (byte b : bytes) {
        sb.append(String.format("%02x", b));
    }
    return sb.toString();
}

/**
 * 十六进制字符串转换 bytes
 */
public static byte[] hexStrtoByte(String hexStr) {
    byte[] bytes = new byte[hexStr.length() / 2];
    for (int i = 0; i < hexStr.length(); i += 2) {
        bytes[i / 2] = (byte) Integer.parseInt(hexStr.substring(i, i + 2), 16);
    }
    return bytes;
}

}

相关文章
|
2月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
268 0
|
2月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
388 35
|
2月前
|
机器学习/深度学习 算法 机器人
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
178 8
|
2月前
|
机器学习/深度学习 算法 自动驾驶
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
188 8
|
2月前
|
安全 Java 测试技术
《深入理解Spring》单元测试——高质量代码的守护神
Spring测试框架提供全面的单元与集成测试支持,通过`@SpringBootTest`、`@WebMvcTest`等注解实现分层测试,结合Mockito、Testcontainers和Jacoco,保障代码质量,提升开发效率与系统稳定性。
|
2月前
|
存储 算法 搜索推荐
《数据之美》:Java数据结构与算法精要
本系列深入探讨数据结构与算法的核心原理及Java实现,涵盖线性与非线性结构、常用算法分类、复杂度分析及集合框架应用,助你提升程序效率,掌握编程底层逻辑。
|
3月前
|
机器学习/深度学习 传感器 算法
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
244 2
|
2月前
|
机器学习/深度学习 数据采集 负载均衡
结合多种启发式解码方法的混合多目标进化算法,用于解决带工人约束的混合流水车间调度问题(Matlab代码实现)
结合多种启发式解码方法的混合多目标进化算法,用于解决带工人约束的混合流水车间调度问题(Matlab代码实现)
168 0
|
2月前
|
机器学习/深度学习 人工智能 算法
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
157 0
|
2月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。

热门文章

最新文章