<方案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++共享连接库.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