基于AES 128算法的Seed&key DLL的生成

2 篇文章 0 订阅
2 篇文章 0 订阅

作者: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诊断模块进行测试即可。

运行结果如下图:

图片

如果有任何疑问,欢迎留言交流!欢迎转发,也欢迎关注!也欢迎关注公众号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值