欢迎访问个人博客站点: 配置啦
随笔 - 109  文章 - 2  评论 - 20  阅读 - 55755

关于各种不同开发语言之间数据加密方法(DES,RSA等)的互通的解决方案(c++共享类库方案)

  • 【写在前面:一般能想出的方案】

<方案1:基于加密算法本身的实现>

        适合一部分有很强的算法能力积累的同学,当然网上也有一些分享,但肯定不全面或者说没有后续解答或支持。  话说也没有想象得复杂,因为存在一些操作系统内置的组件,例如:openssl,  各种语言基本都可以实现符合openssl算法规范的处理。

<方案2:借助js的实现>

        类似c#,java,android,dephi, ios中的object-c等都提供执行js脚本的内置函数。   因此只要引用网上已实现des,aes,ras等算法的js类即可。 举个例子,windows上c#和vb都可以使用msscript.ocx,msscript.dll这些组件。 

<方案3:基于c/c++导出共享类库,让其它语言进行引用>

        使用c/c++开发封装加密算法,并导出供外部调用的接口。  例如封装为.dll,lib,.so等之后,  其它语言 :  c# ,java,android,dephi,vb都能调用。  

 

  • 【本文分享:c++导出动态链接库,供其它语言调用的处理步骤】

>开发c++共享链接库.

>>vs2017下创建动态链接库(dll)项目.

  

>>项目属性配置.

注:根据项目引用的第三方库的不同,配置方法略有不同,有些需要配置库目录,包含目录,还有些需要设置编码,平台版本,编译与处理配置等。

 

>>.加密算法函数的开发(.h,.cpp).

>> 声明与导出接口(告诉外部调用本dll的数据类型及规则等).

 

>外部调用的示例.

>>c++的调用ConfigLab.Cpp.Comp.dll的示例.

步骤1:定义一个函数类型.

typedef char*(_stdcall *RSAEncryptByPubKey)(const char* sInput, char* sPubKey);
typedef char*(_stdcall *RSADecryptByPriKey)(const char* sInput, char* sPriKey);

 

 

步骤2: 加载共享链接库。

复制代码
    HMODULE dllModule = LoadLibrary(L"ConfigLab.Cpp.Comp.dll");//x86,x64测试通过,

    if (dllModule == NULL)

    {

        printf("ConfigLab.Cpp.Comp.dll NOT found!.\n");

        return;

    }
复制代码

 

步骤3: 获取链接库中的函数地址.

    RSAEncryptByPubKey proc_RSAEncryptByPubKey = (RSAEncryptByPubKey)GetProcAddress(dllModule, "RSAEncryptByPublicKey");

    RSADecryptByPriKey proc_RSADecryptByPriKey= (RSADecryptByPriKey)GetProcAddress(dllModule, "RSADecryptByPrivateKey");

 

步骤4: 调用.

        char* sReaultOfEncryptByPublicKey = proc_RSAEncryptByPubKey("123456", "公钥");

    char* sReaultOfDecryptByPriKey = proc_RSADecryptByPriKey(sReaultOfEncryptByPublicKey, "私钥");

 

>>c#的调用ConfigLab.Cpp.Comp.dll的示例(彩蛋:windows下.net framework和.net core 都可以测试通过).

 步骤1:声明.

       

        [DllImport(@"ConfigLab.Cpp.Comp.dll", EntryPoint = "RSAEncryptByPublicKey", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall, ExactSpelling = false)]//发现.netcore中AnyCpu下用CallingConvention = CallingConvention.Cdecl,而在 .net framework的x86下必须用CallingConvention.StdCall
        public static extern IntPtr RSAEncryptByPublicKey(string content, string sPubKey);

        [DllImport(@"ConfigLab.Cpp.Comp.dll", EntryPoint = "RSADecryptByPrivateKey", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall, ExactSpelling = false)]//发现.netcore中AnyCpu下用CallingConvention = CallingConvention.Cdecl,而在 .net framework的x86下必须用CallingConvention.StdCall
        public static extern IntPtr RSADecryptByPrivateKey(string content, string sPriKey);

        [System.Runtime.InteropServices.DllImportAttribute("ConfigLab.Cpp.Comp.dll", EntryPoint = "FreeBuffer", CallingConvention = CallingConvention.Cdecl)]//发现.netcore中AnyCpu下用CallingConvention = CallingConvention.Cdecl,而在 .net framework的x86下必须用CallingConvention.StdCall
        public static extern void FreeBuffer(System.IntPtr pBuffer);

 

 步骤2:调用加密算法(解密大家都能看着写出来的).

  

                IntPtr pRSAEncrypt = Win32CompEncrypt.RSAEncryptByPublicKey("123456", sPublicKey);
                string sResult= Marshal.PtrToStringAnsi(pRSAEncrypt);//从字符指针的位置开始读取字符串
                Win32CompEncrypt.FreeBuffer(pRSAEncrypt);//释放c++中的资源

 

  • 【附录:本文涉及到的调试工具下载与使用】

 图示中RSA算法需要用到公钥私钥对,除了可以百度下openssl生成秘钥之外,这里推荐下面这个: 通用调试工具.

工具下载地址:https://files.cnblogs.com/files/taohuadaozhu/ConfigLab.Test.ex-200606.rar

[注1] 如果是用openssl生成的,需要注意pkcs1,pkcs8两种格式的rsa秘钥。

[注2]如果已经存在的秘钥,则可以尝试用本调试工具进行rsa秘钥的相关转换:

   

    [注3]这里提供本文用c++生成的可以不同语言引用的dll(本文同时生成了x86,x64的dll),  有兴趣的同学可以用其它语言进行调用测试, 当然也可能因为导出声明的文件中关键词需要调整.

  https://files.cnblogs.com/files/taohuadaozhu/ConfigLab.Cpp.Comp.dll.rar

 

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示