【寫在前面:一般能想出的方案】 <方案1:基於加密演算法本身的實現> 適合一部分有很強的演算法能力積累的同學,當然網上也有一些分享,但肯定不全面或者說沒有後續解答或支持。 話說也沒有想象得複雜,因為存在一些操作系統內置的組件,例如:openssl, 各種語言基本都可以實現符合openssl演算法規範的處理 ...
- 【寫在前面:一般能想出的方案】
<方案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:定義一個函數類型.
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