作者:Zhengshuang,修改:Ma
随着汽车电子的快速发展,车辆的安全性也逐渐被大家所重视。如何能够安全的访问ECU成了所有OEM的目标。本文主要介绍AES128算法的实现以及如何在CANoe中进行应用。
对于诊断工程师,相信大家对27服务非常熟悉,该服务(UDS 0x27)用于处理与诊断安全性有关的功能,通过特定的安全机制对一些服务和数据访问权限进行限制,从而保护数据。
此服务执行步骤:
(1) Client请求一个种子(Seed);
(2) Server发送种子(Seed);
(3) Client根据Seed & Key DLL的安全算法计算出Key1,并发送给Server;
(4) Server根据同样的算法和Seed计算出Key2,然后Key1和Key2进行比较,一致则解锁成功,不一致则解锁失败;
Seed & Key DLL介绍
Seed & Key DLL封装了用于进行安全解锁的特定算法,在UDS中定义了0x27服务用于更改安全级别,以解锁具有访问限制的诊断服务。通常ECU发送种子作为诊断测试仪的安全访问请求响应。然后,诊断测试仪为种子计算相应的密钥,并使用该密钥解锁服务器。
示例工程介绍
CANoe示例工程“UDSSystem”中提供了生成该DLL的C++工程。本文档在该示例工程的基础上集成OpenSSL库,将AES128算法应用到计算key值上来。Seed & Key DLL配置工程的参考路径:C:\Users\Public\Documents\Vector\CANoe\Sample Configurations 17.3.91\CAN\Diagnostics\UDSSystem\SecurityAccess\Sources,或者参考下图查看示例工程的路径。
编写&编译DLL
OpenSSL库下载
OpenSSL库下载地址:https://slproweb.com/products/Win32OpenSSL.html
可以根据实际需要选择64或者32位版本进行安装,在之后编译成DLL的时候需要使用对应版本来进行编译,同时也需与CANoe的RT Kernel的版本(32bit/64bit)保持一致。
本文档使用64位的OpenSSL v3.1.3为例进行介绍。
配置开发环境
本文档使用Visual Studio 2019作为编译环境,且使用默认的编译环境配置。如果在使用过程中碰到与编译环境相关问题,建议先根据报错内容自行搜索排查。
创建Visual Studio工程
步骤1:打开Visual Studio2019,选择Create a new project
步骤2:搜索DLL然后选择第一个Dynamic-Link Library with exports (DLL),点击Next
步骤3:自定义项目名称,这里项目名称设置为27_demo,点击create创建项目
步骤4:创建好的项目如图,右侧的Solution Explorer里面展示了当前项目的目录结构,其中我们会在framework.h里面编写头文件,程序主体逻辑则在dllmain.cpp里面实现
在Visual Studio中配置OpenSSL开发环境
步骤1:在项目上右键选择属性
步骤2:将“Planform”从“Win32”改变为“Active(x64)”
步骤3:在“VC++ Directories”中,将OpenSSL的include和lib目录分别添加到“Include Directories”和“Library Directories”中。
步骤4:Linker中选择Input,然后添加openssl.lib;libcrypto.lib;libssl.lib; 点击确定,完成OpenSSL 开发环境的设置
代码编写
头文件
头文件中定义了CANoe中实现Seed&Key计算所需要使用的DLL中的一个函数VKeyGenResultEx。将头文件,加载到2.21中新创建的DLL项目文件中。
AES128加密算法逻辑实现
AES128算法在dllmain.cpp中实现。首先添加头文件#include <openssl/aes.h>
然后添加函数AES_cfb128_encrypt用于加密计算,函数主要分5个步骤:
1. 定义key和iv和相关变量
2. 声明aes_key变量,使用AES_set_encrypt_key函数实例化变量aes_key
3.使用AES_cfb128_encrypt函数,基于key和 iv对传入的seed(iSeedArray)进行加密
4. 将加密的结果赋值给ioKeyArray
5. 返回对应结果运行状态码
编译DLL
步骤1:点击“生成”然后选择“生成解决方案”
步骤2:生成成功会有如下输出。输出中包含生成的DLL所在路径,可以在该路径获取生成的DLL,后续在CANoe中作为Seed&Key DLL使用。
CANoe中使用方法及结果
步骤1:切换CANoe RT kernel,CANoe版本低于13,建议使用32bit的库进行开发。CANoe版本高于13,切换RT Kernel 64 bit路径如下:
步骤2:在CANoe中对DLL进行配置,路径:Diagnostics & XCP | Diagnostic/TP
步骤3:导入诊断数据库后,在对应ECU Qualifier下的Diagnostic Layer | Security Access处导入编译后的DLL文件
步骤4:最后正常使用CANoe诊断模块进行测试即可。
运行结果如下图:
如果有任何疑问,欢迎留言交流!欢迎转发,也欢迎关注!也欢迎关注公众号。