java代码 实现AES_CMAC 算法测试

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 该代码实现了一个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;
}

}

相关文章
|
1月前
|
数据采集 机器学习/深度学习 大数据
行为检测代码(一):超详细介绍C3D架构训练+测试步骤
这篇文章详细介绍了C3D架构在行为检测领域的应用,包括训练和测试步骤,使用UCF101数据集进行演示。
43 1
行为检测代码(一):超详细介绍C3D架构训练+测试步骤
|
1月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
69 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
8天前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
16天前
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
32 2
|
19天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
20 3
|
18天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
24天前
|
Java 程序员 测试技术
Java|让 JUnit4 测试类自动注入 logger 和被测 Service
本文介绍如何通过自定义 IDEA 的 JUnit4 Test Class 模板,实现生成测试类时自动注入 logger 和被测 Service。
22 5
|
1月前
|
存储 缓存 算法
如何通过优化算法和代码结构来提升易语言程序的执行效率?
如何通过优化算法和代码结构来提升易语言程序的执行效率?
|
29天前
|
存储 人工智能 Java
将 Spring AI 与 LLM 结合使用以生成 Java 测试
AIDocumentLibraryChat 项目通过 GitHub URL 为指定的 Java 类生成测试代码,支持 granite-code 和 deepseek-coder-v2 模型。项目包括控制器、服务和配置,能处理源代码解析、依赖加载及测试代码生成,旨在评估 LLM 对开发测试的支持能力。
36 1
|
1月前
|
搜索推荐
插入排序算法的讲解和代码
【10月更文挑战第12天】插入排序是一种基础的排序算法,理解和掌握它对于学习其他排序算法以及数据结构都具有重要意义。你可以通过实际操作和分析,进一步深入了解插入排序的特点和应用场景,以便在实际编程中更好地运用它。