關於各種不同開發語言之間數據加密方法(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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM