- 【寫在前面:一般能想出的方案】
<方案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

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/17335.html
標籤:C++
上一篇:leetcode 反轉鏈表
