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天前
|
Java 测试技术 数据库
【JAVA基础篇教学】第十七篇:Java单元测试
【JAVA基础篇教学】第十七篇:Java单元测试
|
1天前
|
Java Kotlin
java调用kotlin代码编译报错“找不到符号”的问题
java调用kotlin代码编译报错“找不到符号”的问题
16 10
|
2天前
|
Java
PTA帅到没朋友(Java语言)+测试点
PTA帅到没朋友(Java语言)+测试点
8 1
|
2天前
|
前端开发 Java Spring
Java Web ——MVC基础框架讲解及代码演示(下)
Java Web ——MVC基础框架讲解及代码演示
12 1
|
2天前
|
设计模式 前端开发 网络协议
Java Web ——MVC基础框架讲解及代码演示(上)
Java Web ——MVC基础框架讲解及代码演示
6 0
|
2天前
|
IDE Java 测试技术
Java测试三两事
Java测试三两事
10 1
|
2天前
|
Web App开发 缓存 前端开发
《手把手教你》系列技巧篇(四十四)-java+ selenium自动化测试-处理https 安全问题或者非信任站点-下篇(详解教程)
【5月更文挑战第8天】这篇文档介绍了如何在IE、Chrome和Firefox浏览器中处理不信任证书的问题。作者北京-宏哥分享了如何通过编程方式跳过浏览器的证书警告,直接访问不受信任的HTTPS网站。文章分为几个部分,首先简要介绍了问题背景,然后详细讲解了在Chrome浏览器中的两种方法,包括代码设计和运行效果,并给出了其他浏览器的相关信息和参考资料。最后,作者总结了处理此类问题的一些通用技巧。
16 2
|
2天前
|
搜索推荐 算法 Java
滚雪球学Java(29):数组长度和排序算法:让你的程序更高效
【5月更文挑战第4天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
11 0
滚雪球学Java(29):数组长度和排序算法:让你的程序更高效
|
2天前
|
Web App开发 JavaScript 前端开发
《手把手教你》系列技巧篇(四十三)-java+ selenium自动化测试-处理https 安全问题或者非信任站点-上篇(详解教程)
【5月更文挑战第7天】本文介绍了如何在Java+Selenium自动化测试中处理浏览器对不信任证书的处理方法,特别是针对IE、Chrome和Firefox浏览器。在某些情况下,访问HTTPS网站时会遇到证书不可信的警告,但可以通过编程方式跳过这些警告。
13 1
|
2天前
|
Java
Java的取余如何编写代码
【5月更文挑战第9天】Java的取余如何编写代码
19 5

热门文章

最新文章