關於各類不一樣開發語言之間數據加密方法(DES,RSA等)的互通的解決方案(c++共享類庫方案)

  • 【寫在前面:通常能想出的方案】

<方案1:基於加密算法自己的實現>java

        適合一部分有很強的算法能力積累的同窗,固然網上也有一些分享,但確定不全面或者說沒有後續解答或支持。  話說也沒有想象得複雜,由於存在一些操做系統內置的組件,例如:openssl,  各類語言基本均可以實現符合openssl算法規範的處理。android

<方案2:藉助js的實現>ios

        相似c#,java,android,dephi, ios中的object-c等都提供執行js腳本的內置函數。   所以只要引用網上已實現des,aes,ras等算法的js類便可。 舉個例子,windows上c#和vb均可以使用msscript.ocx,msscript.dll這些組件。 c++

<方案3:基於c/c++導出共享類庫,讓其它語言進行引用>算法

        使用c/c++開發封裝加密算法,並導出供外部調用的接口。  例如封裝爲.dll,lib,.so等以後,  其它語言 :  c# ,java,android,dephi,vb都能調用。  c#

 

  • 【本文分享:c++導出動態連接庫,供其它語言調用的處理步驟】

>開發c++共享連接庫.windows

>>vs2017下建立動態連接庫(dll)項目.函數

  

>>項目屬性配置.工具

注:根據項目引用的第三方庫的不一樣,配置方法略有不一樣,有些須要配置庫目錄,包含目錄,還有些須要設置編碼,平臺版本,編譯與處理配置等。測試

 

>>.加密算法函數的開發(.h,.cpp).

>> 聲明與導出接口(告訴外部調用本dll的數據類型及規則等).

 

>外部調用的示例.

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

步驟1:定義一個函數類型.

    char* sReaultOfEncryptByPublicKey = proc_RSAEncryptByPubKey("123456", "公鑰");
    char* sReaultOfDecryptByPriKey = proc_RSADecryptByPriKey(sReaultOfEncryptByPublicKey, "私鑰");

 

 

步驟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

相關文章
相關標籤/搜索