当前位置: 首页 > web >正文

C#调用c++ dll读取2进制文件时而正常,时而异常

前言

这个问题发生在一款正在开发的病例查看软件,病例查看软件为了保护病人的一些数据,对病例文件进行了加密,这些文件和密钥同时进行分发(这是存在一定风险的,然方案之前就定了,修改麻烦)。

密钥的读取、文件的加密解密由cpp开发的encryption.dll进行。

问题现象

使用C#调用cpp的一个dll读取2进制文件密钥,然后根据密钥解码文本文件,发现某些病例解码后文件和未加密前是一致的,有些文件则出现乱码,导致不能使用。

排查过程

开始怀疑是,在调用的C#端进行加密解密重构,哪里可能出现了异常,因为之前通过注入时,由于scope管理的问题,导致病例id在查看时没有更新,于是读取到密钥不是当前的密钥,从而不能正常解密文件;然一通查下来,重构没有问题,id更新正常,加密解密的输入没有问题。

那么就怀疑加密模块encryption.dll可能是出了什么问题。

但单独将encryption的项目重新配置了下,以console程序的方式,在主函数里添加测试代码后发现一切正常……

这时就怀疑,C#端调用时获取到的密钥可能失真了,与c++端给出的密钥可能不一致。试了下,确实如此。

以下为C++获取的密钥:

image

以下为C#调用端拿到的C++返回的密钥,忽略左侧的日期。

image

原因终于找到 ……

原因分析

C++在加载密钥后,以字符串的方式返回给调用的C#方法,C#方法临时保存密钥在内存中,在解密时将密钥与输入文件地址当作参数,再传入C++程序中进行解密。

然而C++中的string字符串:​​C++ std::string​​:可以包含任意字节(包括 \0),是字节容器

而C#中字符串:C# string:文本字符串

要试图让 C# string 和 C++ std::string 存储相同的二进制数据​​ - 这是不可能的任务,因为它们的根本设计目的不同。

解决方案

1.  不改变当前的密钥方式与存储方式的情况下,只能修改密钥的读取;C++程序加载密钥后,不再以字符串的方式返回给C#调用,而是以char数组或char*方式返回。

2.  C++端直接不再返回密钥,而是自行在读取后保存在内存中,只将加密解密方法暴露出来即可。这应该是最符合面向对象原则的一种处理方法。

以上都是在还使用原c++ dll的情况下的,最差的情况,就是C#端自行实现密钥加载、加密解密方法。

建议

多语言混合编程时,一定要注意语言之间的差异。如像C++字符串与C#字符串间的差异,有符号的char与无符号的char的区别,内存的管理等等……

http://www.xdnf.cn/news/19351.html

相关文章:

  • 语义分割目前还是研究热点吗?
  • 如何快速了解项目管理基础
  • 【具身智能】【机械臂】机械臂轨迹规划项目以及资料汇总【持续更新】
  • 【物联网】MQTT / Broker / Topic 是什么?
  • windows 谷歌浏览器把英文改成中文
  • 【路由器】TP Link 路由器为何无法进入管理后台
  • 关于铭飞平台企业官网模板使用中常到的问题、企业官网的百度认证以及IDEA编辑启动器的快捷方法/Apipost本地和云端没法同步的问题解决
  • 【软考架构】SOA与微服务解疑
  • React Hooks深度解析与最佳实践:提升函数组件能力的终极指南
  • Unity笔记(八)——资源动态加载、场景异步加载
  • 迷你电脑用到什么型号的RJ45网口
  • 揭秘表格推理的“思维革命”:RoT模型介绍
  • seafile-setup-troubleshooting_# Seafile 安装与问题解决记录 # Seafile/Seahub 启动问题记录文档
  • linux基础——UDP、TCP
  • JavaScript之性能优化
  • 深入理解C++中的移动赋值与拷贝赋值函数——兼论移动构造函数及其实际应用场景
  • STM32手动移植FreeRTOS
  • 【学Python自动化】 1. Python 安装与配置完全指南 (Windows)
  • 从“互联网+”到“人工智能+”:云计算生态演进揭示AI应用破局之道
  • springboot 实现不同接口指定上传文件大小
  • 腾讯云centos7.6的运维笔记——从yum的安装与更新源开始
  • 小狼毫输入法中让数字键盘上的数字键不再选择候选词而是与原始输入一起直接上屏
  • 抖音热榜展示页面
  • Android 权限申请现代化指南
  • MySQL 在 CentOS 上的安装与配置文件路径详解
  • 2025-08-18面试题(nginx,mysql,zabbix为主)
  • LeetCode 2540.最小公共值
  • 1.7 Rendering模块
  • 数据结构 03(线性:单链表)
  • web渗透之RCE漏洞