本文将分享cocosrc4加解密的详细内容,并且还将对cocoslua解密进行详尽解释,此外,我们还将为大家带来关于.NETCore结合Nacos实现配置加解密的方法、.net安卓IOS跨平台des加
本文将分享cocos rc4加解密的详细内容,并且还将对cocoslua解密进行详尽解释,此外,我们还将为大家带来关于.NET Core结合Nacos实现配置加解密的方法、.net 安卓IOS跨平台des加解密双向的(可以互相加解密)、ASP BASE64加解密(亲测可用)、asp base64加解密函数代码的相关知识,希望对你有所帮助。
本文目录一览:- cocos rc4加解密(cocoslua解密)
- .NET Core结合Nacos实现配置加解密的方法
- .net 安卓IOS跨平台des加解密双向的(可以互相加解密)
- ASP BASE64加解密(亲测可用)
- asp base64加解密函数代码
cocos rc4加解密(cocoslua解密)
static Data getData(const std::string& filename,bool forString) { if (filename.empty()) { return Data::Null; } Data ret; unsigned char* buffer = nullptr; size_t size = 0; size_t readsize; const char* mode = nullptr; if (forString) mode = "rt"; else mode = "rb"; auto fileutils = FileUtils::getInstance(); do { // Read the file from hardware std::string fullPath = fileutils->fullPathForFilename(filename); FILE *fp = fopen(fileutils->getSuitableFOpen(fullPath).c_str(),mode); CC_BREAK_IF(!fp); fseek(fp,SEEK_END); size = ftell(fp); fseek(fp,SEEK_SET); if (forString) { buffer = (unsigned char*)malloc(sizeof(unsigned char) * (size + 1)); buffer[size] = '\0'; } else { buffer = (unsigned char*)malloc(sizeof(unsigned char) * size); } readsize = fread(buffer,sizeof(unsigned char),size,fp); fclose(fp); if (forString && readsize < size) { buffer[readsize] = '\0'; } } while (0); if (nullptr == buffer || 0 == readsize) { cclOG("Get data from file %s Failed",filename.c_str()); } else { #ifdef CRYPT_RES pack_crpyt( buffer,(unsigned long )readsize ); #endif ret.fastSet(buffer,readsize); } return ret; } bool AppDelegate::applicationDidFinishLaunching() { char key[256]={"hellodytqwe123!@#&*"}; pack_crpyt_init( (unsigned char*)key,strlen( key ) ); // set default FPS Director::getInstance()->setAnimationInterval(1.0 / 60.0f); Director::getInstance()->setClearColor(Color4F(0,0)); // register lua module auto engine = LuaEngine::getInstance(); ScriptEngineManager::getInstance()->setScriptEngine(engine); lua_State* L = engine->getLuaStack()->getLuaState(); lua_module_register(L); register_all_packages(); #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) register_all_cocos2dx_TalkingDataGA(L); register_all_cocos2dx_TDGAAccount(L); register_all_cocos2dx_TDGAMission(L); register_all_cocos2dx_TDGAVirtualCurrency(L); register_all_cocos2dx_TDGAItem(L); #endif LuaStack* stack = engine->getLuaStack(); stack->setXXTEAKeyAndSign("2dxLua",strlen("2dxLua"),"XXTEA",strlen("XXTEA")); //register custom function //LuaStack* stack = engine->getLuaStack(); //register_custom_function(stack->getLuaState()); auto state = engine->getLuaStack()->getLuaState(); if ( state ) { lua_getglobal( state,"_G"); register_all_cocos2dx_custom( state ); register_all_cocos2dx_custom_manual( state ); lua_settop( state,0); } #if (COCOS2D_DEBUG > 0) && (CC_CODE_IDE_DEBUG_SUPPORT > 0) std::vector<std::string> searchDirs ; searchDirs.push_back( "" ); searchDirs.push_back( "res" ); searchDirs.push_back( "src" ); cocos2d::FileUtils::getInstance()->setSearchPaths( searchDirs ); Cocos2dUtils::getorCreateGLProgram( "res/shader/highlight.vsh","res/shader/highlight.fsh" ); // NOTE:Please don't remove this call if you want to debug with Cocos Code IDE auto runtimeEngine = RuntimeEngine::getInstance(); runtimeEngine->addRuntime(RuntimeLuaimpl::create(),kRuntimeEngineLua); runtimeEngine->start(); #else std::vector<std::string> searchDirs ; searchDirs.push_back( "" ); searchDirs.push_back( "res" ); searchDirs.push_back( "src" ); cocos2d::FileUtils::getInstance()->setSearchPaths( searchDirs ); Cocos2dUtils::getorCreateGLProgram( "res/shader/highlight.vsh","res/shader/highlight.fsh" ); if (engine->executeScriptFile("src/main.lua")) { return false; } #endif return true; } std::string FileUtils::getStringFromFile(const std::string& filename) { Data data = getData(filename,true); if (data.isNull()) return ""; std::string ret((const char*)data.getBytes()); return ret; } void Cocos2dUtils::readBufferFromFile( ByteBuffer* buffer,const std::string fileName ) { Data data = FileUtils::getInstance()->getDataFromFile( fileName ); if( data.getSize() > 0 ) { buffer->writeBytes( ( char* )data.getBytes(),data.getSize() ); } } // // RC4.h // knight // // Created by yingtuodeng on 14-6-29. // // #ifndef __knight__RC4__ #define __knight__RC4__ /* 初始化函数 参数1是一个256长度的char型数组,定义为: unsigned char sBox[256]; 参数2是密钥,其内容可以随便定义:char key[256]; 参数3是密钥的长度,Len = strlen(key); */ void rc4_init(unsigned char*s,unsigned char*key,unsigned long Len); /*加解密 其中,参数1是上边rc4_init函数中,被搅乱的S-Box; 参数2是需要加密的数据data; 参数3是data的长度. */ void rc4_crypt(unsigned char*s,unsigned char*Data,unsigned long Len); void pack_crpyt( unsigned char* data,unsigned long len ); void pack_crpyt_init( unsigned char* key,unsigned long key_len ); #endif /* defined(__knight__RC4__) */ #include "RC4.h" #include <string> /* 初始化函数 参数1是一个256长度的char型数组,定义为: unsigned char sBox[256]; 参数2是密钥,其内容可以随便定义:char key[256]; 参数3是密钥的长度,Len = strlen(key); */ void rc4_init(unsigned char*s,unsigned long Len) { int i=0,j=0; char k[256]={0}; unsigned char tmp=0; for(i=0;i<256;i++) { s[i]=i; k[i]=key[i%Len]; } for(i=0;i<256;i++) { j=(j+s[i]+k[i])%256; tmp=s[i]; s[i]=s[j];//交换s[i]和s[j] s[j]=tmp; } } /*加解密 其中,参数1是上边rc4_init函数中,被搅乱的S-Box; 参数2是需要加密的数据data; 参数3是data的长度. */ void rc4_crypt(unsigned char*s,j=0,t=0; unsigned long k=0; unsigned char tmp; for(k=0;k<Len;k++) { i=(i+1)%256; j=(j+s[i])%256; tmp=s[i]; s[i]=s[j];//交换s[x]和s[y] s[j]=tmp; t=(s[i]+s[j])%256; Data[k]^=s[t]; } } unsigned char __g_rc4_sBox[ 256 ] = { 0 }; void pack_crpyt( unsigned char* data,unsigned long len ) { char sBox[256]; memcpy( sBox,__g_rc4_sBox,256 ); rc4_crypt( (unsigned char*)sBox,data,len ); } void pack_crpyt_init( unsigned char* key,unsigned long key_len ) { rc4_init( __g_rc4_sBox,key,key_len ); }
.NET Core结合Nacos实现配置加解密的方法
背景
当我们把应用的配置都放到配置中心后,很多人会想到这样一个问题,配置里面有敏感的信息要怎么处理呢?
信息既然敏感的话,那么加个密就好了嘛,相信大部分人的第一感觉都是这个,确实这个是最简单也是最合适的方法。
其实很多人都在关注这个问题,好比说,数据库的连接字符串,调用第三方的密钥等等这些信息,都是不太想让很多人知道的。
那么如果我们把配置放在 Nacos 了,我们可以怎么操作呢?
想了想不外乎这么几种:
- 全部服务端搞定,客户端只管取;
- 全部客户端搞定,服务端只管存;
- 客户端为主,服务端为辅,服务端存一些加解密需要的辅助信息即可。
有一个老哥已经在 issue 里面提出了相关的落地方案,也包含了部分实现。
https://github.com/alibaba/nacos/issues/5367
简要概述的话就是,开个口子,用户可以在客户端拓展任意加解密方式,同时服务端可以辅助这一操作。
不过看了 2.0.2 的代码,服务端这一块的“辅助”还未完成,不过对客户端来说,这一块其实问题已经不大了。
6月14号发布的 nacos-sdk-csharp
1.1.0 版本已经支持了这一功能
下面就用 .NET 5 和 Nacos 2.0.2 为例,来简单说明一下。
简单原理说明
sdk 里面在进行配置相关读写操作的时候,会有一个 DoFilter
的操作。这个操作就是我们的切入点。
既然要执行 Filter , 那么执行的 Filter 从那里来呢? 答案是 IConfigFilter
。
sdk 里面提供了 IConfigFilter
这个接口,但是不提供实现,具体实现交由用户自定义,毕竟 100 个人就有 100 种不一样的实现。
下面看看它的定义。
public interface IConfigFilter { void Init(NacosSdkOptions options); int GetOrder(); string GetFilterName(); void DoFilter(IConfigRequest request, IConfigResponse response, IConfigFilterChain filterChain); }
Init
方法就是对这个 ConfigFilter 进行一些初始化操作,好比说从 Options 里面拿一些额外的信息。
GetOrder
和 GetFilterName
属于辅助信息,指定这个 ConfigFilter 的执行顺序(越小越先执行)和名称。
DoFilter
就是核心了,它可以变更 request 和 response ,这两个对象内部都会维护一个包含配置信息的 Dictionary。
换言之,只要我们定义一个 ConfigFilter,实现了这个接口,那么配置想怎么操作都可以了,加解密就是小问题了。
其中 NacosSdkOptions 里面加了两个配置项,是专门给这个功能用的 ConfigFilterAssemblies
和 ConfigFilterExtInfo
ConfigFilterAssemblies
是自定义 ConfigFilter 所在的程序集的名字,这里是一个字符串列表类型的参数,sdk 会根据这个名字去找到对应的实现,然后初始化好。
ConfigFilterExtInfo
是实现 ConfigFilter 是需要用到的扩展信息,这里是一个字符串类型的参数,扩展信息复杂的可以考虑传入一个 JSON 字符串。
下面来看个具体的例子吧。
自定义 ConfigFilter
这个 Filter 实现的效果是把部分敏感配置项进行加密,敏感的配置项需要在配置文件中指定。
先是 Init
方法:
public void Init(NacosSdkOptions options) { // 从 Options 里面的拓展信息获取需要加密的 json path // 这里只是示例,根据具体情况调整成自己合适的!!!! var extInfo = JObject.Parse(options.ConfigFilterExtInfo); if (extInfo.ContainsKey("JsonPaths")) { // JsonPaths 在这里的含义是,那个path下面的内容要加密 _jsonPaths = extInfo.GetValue("JsonPaths").ToObject<List<string>>(); } }
然后是 DoFilter
方法:
这个方法里面要注意几点:
- request 只有请求的时候才会有值,其他时候都是 null 值。
- response 只有响应的时候才会有值,其他时候都是 null 值。
- 操作完之后,一定要调用 PutParameter 方法进行覆盖才会生效。
public void DoFilter(IConfigRequest request, IConfigResponse response, IConfigFilterChain filterChain) { if (request != null) { var encryptedDataKey = DefaultKey; var raw_content = request.GetParameter(Nacos.V2.Config.ConfigConstants.CONTENT); // 部分配置加密后的 content var content = ReplaceJsonNode((string)raw_content, encryptedDataKey, true); // 加密配置后,不要忘记更新 request !!!! request.PutParameter(Nacos.V2.Config.ConfigConstants.ENCRYPTED_DATA_KEY, encryptedDataKey); request.PutParameter(Nacos.V2.Config.ConfigConstants.CONTENT, content); } if (response != null) { var resp_content = response.GetParameter(Nacos.V2.Config.ConfigConstants.CONTENT); var resp_encryptedDataKey = response.GetParameter(Nacos.V2.Config.ConfigConstants.ENCRYPTED_DATA_KEY); // nacos 2.0.2 服务端目前还没有把 encryptedDataKey 记录并返回,所以 resp_encryptedDataKey 目前只会是 null // 如果服务端有记录并且能返回,我们可以做到每一个配置都用不一样的 encryptedDataKey 来加解密。 // 目前的话,只能固定一个 encryptedDataKey var encryptedDataKey = (resp_encryptedDataKey == null || string.IsNullOrWhiteSpace((string)resp_encryptedDataKey)) ? DefaultKey : (string)resp_encryptedDataKey; var content = ReplaceJsonNode((string)resp_content, encryptedDataKey, false); response.PutParameter(Nacos.V2.Config.ConfigConstants.CONTENT, content); } }
这里涉及 encryptedDataKey
的相关操作都只是预留操作,现阶段可以不用理会。
还有一个 ReplaceJsonNode
方法就是替换敏感配置的具体操作了。
private string ReplaceJsonNode(string src, string encryptedDataKey, bool isEnc = true) { // 示例配置用的是JSON,如果用的是 yaml,这里换成用 yaml 解析即可。 var jObj = JObject.Parse(src); foreach (var item in _jsonPaths) { var t = jObj.SelectToken(item); if (t != null) { var r = t.ToString(); // 加解密 var newToken = isEnc ? AESEncrypt(r, encryptedDataKey) : AESDecrypt(r, encryptedDataKey); if (!string.IsNullOrWhiteSpace(newToken)) { // 替换旧值 t.Replace(newToken); } } } return jObj.ToString(); }
到这里,自定义的 ConfigFilter 已经完成了,下面就是真正的应用了。
简单应用
老样子,建一个 WebApi 项目,添加自定义 ConfigFilter 所在的包/项目/程序集。
这里用的是集成 ASP.NET Core 的例子。
修改 appsettings.json
{ "NacosConfig": { "Listeners": [ { "Optional": true, "DataId": "demo", "Group": "DEFAULT_GROUP" } ], "Namespace": "cs", "ServerAddresses": [ "http://localhost:8848/" ], "ConfigFilterAssemblies": [ "XXXX.CusLib" ], "ConfigFilterExtInfo": "{\"JsonPaths\":[\"ConnectionStrings.Default\"],\"Other\":\"xxxxxx\"}" } }
注:老黄这里把 Optional 设置成 true,是为了第一次运行的时候,如果服务端没有进行配置而不至于退出程序。
修改 Program.cs
public class Program { public static void Main(string[] args) { var outputTemplate = "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level}] {Message}{NewLine}{Exception}"; Log.Logger = new LoggerConfiguration() .Enrich.FromLogContext() .MinimumLevel.Override("Microsoft", LogEventLevel.Warning) .MinimumLevel.Override("System", LogEventLevel.Warning) .MinimumLevel.Debug() .WriteTo.Console(outputTemplate: outputTemplate) .CreateLogger(); System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); try { Log.ForContext<Program>().Information("Application starting..."); CreateHostBuilder(args, Log.Logger).Build().Run(); } catch (System.Exception ex) { Log.ForContext<Program>().Fatal(ex, "Application start-up failed!!"); } finally { Log.CloseAndFlush(); } } public static IHostBuilder CreateHostBuilder(string[] args, Serilog.ILogger logger) => Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((context, builder) => { var c = builder.Build(); builder.AddNacosV2Configuration(c.GetSection("NacosConfig"), logAction: x => x.AddSerilog(logger)); }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>().UseUrls("http://*:8787"); }) .UseSerilog(); }
最后是 Startup.cs
public class Startup { // 省略部分.... public void ConfigureServices(IServiceCollection services) { services.AddNacosV2Config(Configuration, null, "NacosConfig"); services.Configure<AppSettings>(Configuration.GetSection("AppSettings")); services.AddControllers(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { var configSvc = app.ApplicationServices.GetRequiredService<Nacos.V2.INacosConfigService>(); var db = $"demo-{DateTimeOffset.Now.ToString("yyyyMMdd_HHmmss")}"; var oldConfig = "{\"ConnectionStrings\":{\"Default\":\"Server=127.0.0.1;Port=3306;Database=" + db + ";User Id=app;Password=098765;\"},\"version\":\"测试version---\",\"AppSettings\":{\"Str\":\"val\",\"num\":100,\"arr\":[1,2,3,4,5],\"subobj\":{\"a\":\"" + db + "\"}}}"; configSvc.PublishConfig("demo", "DEFAULT_GROUP", oldConfig).ConfigureAwait(false).GetAwaiter().GetResult(); var options = app.ApplicationServices.GetRequiredService<IOptionsMonitor<AppSettings>>(); Console.WriteLine("===用 IOptionsMonitor 读取配置==="); Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(options.CurrentValue)); Console.WriteLine(""); Console.WriteLine("===用 IConfiguration 读取配置==="); Console.WriteLine(Configuration["ConnectionStrings:Default"]); Console.WriteLine(""); var pwd = $"demo-{new Random().Next(100000, 999999)}"; var newConfig = "{\"ConnectionStrings\":{\"Default\":\"Server=127.0.0.1;Port=3306;Database="+ db + ";User Id=app;Password="+ pwd +";\"},\"version\":\"测试version---\",\"AppSettings\":{\"Str\":\"val\",\"num\":100,\"arr\":[1,2,3,4,5],\"subobj\":{\"a\":\""+ db +"\"}}}"; // 模拟 配置变更 configSvc.PublishConfig("demo", "DEFAULT_GROUP", newConfig).ConfigureAwait(false).GetAwaiter().GetResult(); System.Threading.Thread.Sleep(500); var options2 = app.ApplicationServices.GetRequiredService<IOptionsMonitor<AppSettings>>(); Console.WriteLine("===用 IOptionsMonitor 读取配置==="); Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(options2.CurrentValue)); Console.WriteLine(""); Console.WriteLine("===用 IConfiguration 读取配置==="); Console.WriteLine(Configuration["ConnectionStrings:Default"]); Console.WriteLine(""); // 省略部分.... } }
最后来看看几张效果图:
首先是程序的运行日志。
其次是和 Nacos 控制台的对比。
到这里的话,基于 Nacos 的加解密就完成了。
写在最后
敏感配置项的加解密还是很有必要的,配置中心负责存储,客户端负责加解密,这样的方式可以让用户更加灵活的选择自己想要的加解密方法。
本文的示例代码已经上传到 Github,仅供参考。
https://github.com/catcherwong-archive/2021/tree/main/NacosConfigWithEncryption
最后的最后,希望感兴趣的大佬可以一起参与到这个项目来。
nacos-sdk-csharp 的地址 :https://github.com/nacos-group/nacos-sdk-csharp
到此这篇关于.NET Core结合Nacos实现配置加解密的方法的文章就介绍到这了,更多相关.NET Core Nacos配置加解密内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
- .NET Core Windows环境安装配置教程
- ASP.NET core Web中使用appsettings.json配置文件的方法
- 详解ASP.NET Core实现强类型Configuration读取配置数据
- .NET Core简单读取json配置文件
- ASP.NET Core 2.0 WebApi全局配置及日志实例
- .net core下配置访问数据库操作
- .NET Core读取配置文件方式详细总结
- ASP.NET Core配置教程之读取配置信息
- 详解ASP.NET Core 在 JSON 文件中配置依赖注入
- 如何在ASP.NET Core类库项目中读取配置文件详解
- asp.net Core3.0区域与路由配置的方法
.net 安卓IOS跨平台des加解密双向的(可以互相加解密)
http://blog.sina.com.cn/s/blog_beda09820102v5fu.html
.net 安卓IOS跨平台des加解密双向的(可以互相加解密)
#region 跨平台加解密(c# 安卓 IOS)
// public static string sKey = "12345678";
// ///
// /// 解密
// ///
// /// 要解密的以Base64
// /// 密钥,且必须为8位
// /// 已解密的字符串
// public static string DesDecrypt(string pToDecrypt)
// {
// //转义特殊字符
// pToDecrypt = pToDecrypt.Replace("-", "+");
// pToDecrypt = pToDecrypt.Replace("_", "/");
// pToDecrypt = pToDecrypt.Replace("~", "=");
// byte[] inputByteArray = Convert.FromBase64String(pToDecrypt);
// using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
// {
// des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
// des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
// System.IO.MemoryStream ms = new System.IO.MemoryStream();
// using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
// {
// cs.Write(inputByteArray, 0, inputByteArray.Length);
// cs.FlushFinalBlock();
// cs.Close();
// }
// string str = Encoding.UTF8.GetString(ms.ToArray());
// ms.Close();
// return str;
// }
// }
// ///
// /// 对字符串进行DES加密
// ///
// /// 待加密的字符串
// /// 加密后的BASE64编码的字符串
// public string Encrypt(string sourceString)
//{
// byte[] btKey = Encoding.UTF8.GetBytes(sKey);
// byte[] btIV = Encoding.UTF8.GetBytes(sKey);
// DESCryptoServiceProvider des = new DESCryptoServiceProvider();
// using (MemoryStream ms = new MemoryStream())
// {
// byte[] inData = Encoding.UTF8.GetBytes(sourceString);
// try
// {
// using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(btKey, btIV), CryptoStreamMode.Write))
// {
// cs.Write(inData, 0, inData.Length);
// cs.FlushFinalBlock();
// }
// return Convert.ToBase64String(ms.ToArray());
// }
// catch
// {
// throw;
// }
// }
//}
#endregion
安卓---------------------------------------------------------------------------
// // 加密
//public static String DecryptDoNet(String message, String key)
// throws Exception {
// byte[] bytesrc = Base64.decode(message.getBytes(), Base64.DEFAULT);
// Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
// DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));
// SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
// SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
// IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));
// cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
// byte[] retByte = cipher.doFinal(bytesrc);
// return new String(retByte);
//}
//// 解密
//public static String EncryptAsDoNet(String message, String key)
// throws Exception {
// Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
// DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));
// SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
// SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
// IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));
// cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
// byte[] encryptbyte = cipher.doFinal(message.getBytes());
// return new String(Base64.encode(encryptbyte, Base64.DEFAULT));
//}
Ios --------------------------------------------------------------------------------------------------------------------\
static const char* encryptWithKeyAndType(const char *text,CCOperation encryptOperation,char *key)
{
NSString *textString=[[NSString alloc]initWithCString:text encoding:NSUTF8StringEncoding];
// NSLog(@"[[item.url description] UTF8String=%@",textString);
const void *dataIn;
size_t dataInLength;
if (encryptOperation == kCCDecrypt)//传递过来的是decrypt 解码
{
//解码 base64
NSData *decryptData = [GTMBase64 decodeData:[textString dataUsingEncoding:NSUTF8StringEncoding]];//转成utf-8并decode
dataInLength = [decryptData length];
dataIn = [decryptData bytes];
}
else //encrypt
{
NSData* encryptData = [textString dataUsingEncoding:NSUTF8StringEncoding];
dataInLength = [encryptData length];
dataIn = (const void *)[encryptData bytes];
}
CCCryptorStatus ccStatus;
uint8_t *dataOut = NULL; //可以理解位type/typedef 的缩写(有效的维护了代码,比如:一个人用int,一个人用long。最好用typedef来定义)
size_t dataOutAvailable = 0; //size_t 是操作符sizeof返回的结果类型
size_t dataOutMoved = 0;
dataOutAvailable = (dataInLength + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);
dataOut = malloc( dataOutAvailable * sizeof(uint8_t));
memset((void *)dataOut, 00, dataOutAvailable);//将已开辟内存空间buffer的首 1 个字节的值设为值 0
//NSString *initIv = @"12345678";
const void *vkey = key;
const void *iv = (const void *) key; //[initIv UTF8String];
//CCCrypt函数 加密/解密
ccStatus = CCCrypt(encryptOperation,// 加密/解密
kCCAlgorithmDES,// 加密根据哪个标准(des,3des,aes。。。。)
kCCOptionPKCS7Padding,// 选项分组密码算法(des:对每块分组加一次密 3DES:对每块分组加三个不同的密)
vkey, //密钥 加密和解密的密钥必须一致
kCCKeySizeDES,// DES 密钥的大小(kCCKeySizeDES=8)
iv, // 可选的初始矢量
dataIn, // 数据的存储单元
dataInLength,// 数据的大小
(void *)dataOut,// 用于返回数据
dataOutAvailable,
&dataOutMoved);
NSString *result = nil;
if (encryptOperation == kCCDecrypt)//encryptOperation==1 解码
{
//得到解密出来的data数据,改变为utf-8的字符串
result = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved] encoding:NSUTF8StringEncoding];
}
else //encryptOperation==0 (加密过程中,把加好密的数据转成base64的)
{
//编码 base64
NSData *data = [NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved];
result = [GTMBase64 stringByEncodingData:data];
}
return [result UTF8String];
}
+(NSString*)encryptWithContent:(NSString*)content type:(CCOperation)type key:(NSString*)aKey
{
const char * contentChar =[content UTF8String];
char * keyChar =(char*)[aKey UTF8String];
const char *miChar;
miChar = encryptWithKeyAndType(contentChar, type, keyChar);
return [NSString stringWithCString:miChar encoding:NSUTF8StringEncoding];
}
ASP BASE64加解密(亲测可用)
核心代码:
<% '' OPTION EXPLICIT const BASE_64_MAP_INIT = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" dim newline dim Base64EncMap(63) dim Base64DecMap(127) ''初始化函数 PUBLIC SUB initCodecs() '' 初始化变量 newline = "<P>" & chr(13) & chr(10) dim max, idx max = len(BASE_64_MAP_INIT) for idx = 0 to max - 1 Base64EncMap(idx) = mid(BASE_64_MAP_INIT, idx + 1, 1) next for idx = 0 to max - 1 Base64DecMap(ASC(Base64EncMap(idx))) = idx next END SUB ''Base64加密函数 PUBLIC FUNCTION base64Encode(plain) if len(plain) = 0 then base64Encode = "" exit function end if dim ret, ndx, by3, first, second, third by3 = (len(plain) \ 3) * 3 ndx = 1 do while ndx <= by3 first = asc(mid(plain, ndx+0, 1)) second = asc(mid(plain, ndx+1, 1)) third = asc(mid(plain, ndx+2, 1)) ret = ret & Base64EncMap( (first \ 4) AND 63 ) ret = ret & Base64EncMap( ((first * 16) AND 48) + ((second \ 16) AND 15 ) ) ret = ret & Base64EncMap( ((second * 4) AND 60) + ((third \ 64) AND 3 ) ) ret = ret & Base64EncMap( third AND 63) ndx = ndx + 3 loop if by3 < len(plain) then first = asc(mid(plain, ndx+0, 1)) ret = ret & Base64EncMap( (first \ 4) AND 63 ) if (len(plain) MOD 3 ) = 2 then second = asc(mid(plain, ndx+1, 1)) ret = ret & Base64EncMap( ((first * 16) AND 48) + ((second \ 16) AND 15 ) ) ret = ret & Base64EncMap( ((second * 4) AND 60) ) else ret = ret & Base64EncMap( (first * 16) AND 48) ret = ret ''& "=" end if ret = ret ''& "=" end if base64Encode = ret END FUNCTION ''Base64解密函数 PUBLIC FUNCTION base64Decode(scrambled) if len(scrambled) = 0 then base64Decode = "" exit function end if dim realLen realLen = len(scrambled) do while mid(scrambled, realLen, 1) = "=" realLen = realLen - 1 loop dim ret, ndx, by4, first, second, third, fourth ret = "" by4 = (realLen \ 4) * 4 ndx = 1 do while ndx <= by4 first = Base64DecMap(asc(mid(scrambled, ndx+0, 1))) second = Base64DecMap(asc(mid(scrambled, ndx+1, 1))) third = Base64DecMap(asc(mid(scrambled, ndx+2, 1))) fourth = Base64DecMap(asc(mid(scrambled, ndx+3, 1))) ret = ret & chr( ((first * 4) AND 255) + ((second \ 16) AND 3)) ret = ret & chr( ((second * 16) AND 255) + ((third \ 4) AND 15)) ret = ret & chr( ((third * 64) AND 255) + (fourth AND 63)) ndx = ndx + 4 loop if ndx < realLen then first = Base64DecMap(asc(mid(scrambled, ndx+0, 1))) second = Base64DecMap(asc(mid(scrambled, ndx+1, 1))) ret = ret & chr( ((first * 4) AND 255) + ((second \ 16) AND 3)) if realLen MOD 4 = 3 then third = Base64DecMap(asc(mid(scrambled,ndx+2,1))) ret = ret & chr( ((second * 16) AND 255) + ((third \ 4) AND 15)) end if end if base64Decode = ret END FUNCTION %>
使用方法:
'' 初始化 call initCodecs Response.Write(base64Encode("之我要加密的字符串")) Response.Write(base64Decode("bWFyczIwMTAwMjIw0"))
- 使用 certutil 实现 Hex2Bin 和 Base64 加解密的方法
- asp base64加解密函数代码
- Base64加解密的实现方式实例详解
asp base64加解密函数代码
<%
sBASE_64_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
sBASE_64_CHARACTERS = strUnicode2Ansi(sBASE_64_CHARACTERS)
Function strUnicodeLen(asContents)
''计算unicode字符串的Ansi编码的长度
asContents1="a"&asContents
len1=len(asContents1)
k=0
for i=1 to len1
asc1=asc(mid(asContents1,i,1))
if asc1<0 then asc1=65536+asc1
if asc1>255 then
k=k+2
else
k=k+1
end if
next
strUnicodeLen=k-1
End Function
Function strUnicode2Ansi(asContents)
''将Unicode编码的字符串,转换成Ansi编码的字符串
strUnicode2Ansi=""
len1=len(asContents)
for i=1 to len1
varchar=mid(asContents,i,1)
varasc=asc(varchar)
if varasc<0 then varasc=varasc+65536
if varasc>255 then
varHex=Hex(varasc)
varlow=left(varHex,2)
varhigh=right(varHex,2)
strUnicode2Ansi=strUnicode2Ansi & chrb("&H" & varlow ) & chrb("&H" & varhigh )
else
strUnicode2Ansi=strUnicode2Ansi & chrb(varasc)
end if
next
End function
Function strAnsi2Unicode(asContents)
''将Ansi编码的字符串,转换成Unicode编码的字符串
strAnsi2Unicode = ""
len1=lenb(asContents)
if len1=0 then exit function
for i=1 to len1
varchar=midb(asContents,i,1)
varasc=ascb(varchar)
if varasc > 127 then
strAnsi2Unicode = strAnsi2Unicode & chr(ascw(midb(asContents,i+1,1) & varchar))
i=i+1
else
strAnsi2Unicode = strAnsi2Unicode & chr(varasc)
end if
next
End function
Function Base64encode(asContents)
''将Ansi编码的字符串进行Base64编码
''asContents应当是ANSI编码的字符串(二进制的字符串也可以)
Dim lnPosition
Dim lsResult
Dim Char1
Dim Char2
Dim Char3
Dim Char4
Dim Byte1
Dim Byte2
Dim Byte3
Dim SaveBits1
Dim SaveBits2
Dim lsGroupBinary
Dim lsGroup64
Dim m4,len1,len2
len1=Lenb(asContents)
if len1<1 then
Base64encode=""
exit Function
end if
m3=Len1 Mod 3
If M3 > 0 Then asContents = asContents & String(3-M3, chrb(0))
''补足位数是为了便于计算
IF m3 > 0 THEN
len1=len1+(3-m3)
len2=len1-3
else
len2=len1
end if
lsResult = ""
For lnPosition = 1 To len2 Step 3
lsGroup64 = ""
lsGroupBinary = Midb(asContents, lnPosition, 3)
Byte1 = Ascb(Midb(lsGroupBinary, 1, 1)): SaveBits1 = Byte1 And 3
Byte2 = Ascb(Midb(lsGroupBinary, 2, 1)): SaveBits2 = Byte2 And 15
Byte3 = Ascb(Midb(lsGroupBinary, 3, 1))
Char1 = Midb(sBASE_64_CHARACTERS, ((Byte1 And 252) \ 4) + 1, 1)
Char2 = Midb(sBASE_64_CHARACTERS, (((Byte2 And 240) \ 16) Or (SaveBits1 * 16) And &HFF) + 1, 1)
Char3 = Midb(sBASE_64_CHARACTERS, (((Byte3 And 192) \ 64) Or (SaveBits2 * 4) And &HFF) + 1, 1)
Char4 = Midb(sBASE_64_CHARACTERS, (Byte3 And 63) + 1, 1)
lsGroup64 = Char1 & Char2 & Char3 & Char4
lsResult = lsResult & lsGroup64
Next
''处理最后剩余的几个字符
if M3 > 0 then
lsGroup64 = ""
lsGroupBinary = Midb(asContents, len2+1, 3)
Byte1 = Ascb(Midb(lsGroupBinary, 1, 1)): SaveBits1 = Byte1 And 3
Byte2 = Ascb(Midb(lsGroupBinary, 2, 1)): SaveBits2 = Byte2 And 15
Byte3 = Ascb(Midb(lsGroupBinary, 3, 1))
Char1 = Midb(sBASE_64_CHARACTERS, ((Byte1 And 252) \ 4) + 1, 1)
Char2 = Midb(sBASE_64_CHARACTERS, (((Byte2 And 240) \ 16) Or (SaveBits1 * 16) And &HFF) + 1, 1)
Char3 = Midb(sBASE_64_CHARACTERS, (((Byte3 And 192) \ 64) Or (SaveBits2 * 4) And &HFF) + 1, 1)
if M3=1 then
lsGroup64 = Char1 & Char2 & ChrB(61) & ChrB(61) ''用=号补足位数
else
lsGroup64 = Char1 & Char2 & Char3 & ChrB(61) ''用=号补足位数
end if
lsResult = lsResult & lsGroup64
end if
Base64encode = lsResult
End Function
Function Base64decode(asContents)
''将Base64编码字符串转换成Ansi编码的字符串
''asContents应当也是ANSI编码的字符串(二进制的字符串也可以)
Dim lsResult
Dim lnPosition
Dim lsGroup64, lsGroupBinary
Dim Char1, Char2, Char3, Char4
Dim Byte1, Byte2, Byte3
Dim M4,len1,len2
len1= Lenb(asContents)
M4 = len1 Mod 4
if len1 < 1 or M4 > 0 then
''字符串长度应当是4的倍数
Base64decode = ""
exit Function
end if
''判断最后一位是不是 = 号
''判断倒数第二位是不是 = 号
''这里m4表示最后剩余的需要单独处理的字符个数
if midb(asContents, len1, 1) = chrb(61) then m4=3
if midb(asContents, len1-1, 1) = chrb(61) then m4=2
if m4 = 0 then
len2=len1
else
len2=len1-4
end if
For lnPosition = 1 To Len2 Step 4
lsGroupBinary = ""
lsGroup64 = Midb(asContents, lnPosition, 4)
Char1 = InStrb(sBASE_64_CHARACTERS, Midb(lsGroup64, 1, 1)) - 1
Char2 = InStrb(sBASE_64_CHARACTERS, Midb(lsGroup64, 2, 1)) - 1
Char3 = InStrb(sBASE_64_CHARACTERS, Midb(lsGroup64, 3, 1)) - 1
Char4 = InStrb(sBASE_64_CHARACTERS, Midb(lsGroup64, 4, 1)) - 1
Byte1 = Chrb(((Char2 And 48) \ 16) Or (Char1 * 4) And &HFF)
Byte2 = lsGroupBinary & Chrb(((Char3 And 60) \ 4) Or (Char2 * 16) And &HFF)
Byte3 = Chrb((((Char3 And 3) * 64) And &HFF) Or (Char4 And 63))
lsGroupBinary = Byte1 & Byte2 & Byte3
lsResult = lsResult & lsGroupBinary
Next
''处理最后剩余的几个字符
if M4 > 0 then
lsGroupBinary = ""
lsGroup64 = Midb(asContents, len2+1, m4) & chrB(65) ''chr(65)=A,转换成值为0
if M4=2 then ''补足4位,是为了便于计算
lsGroup64 = lsGroup64 & chrB(65)
end if
Char1 = InStrb(sBASE_64_CHARACTERS, Midb(lsGroup64, 1, 1)) - 1
Char2 = InStrb(sBASE_64_CHARACTERS, Midb(lsGroup64, 2, 1)) - 1
Char3 = InStrb(sBASE_64_CHARACTERS, Midb(lsGroup64, 3, 1)) - 1
Char4 = InStrb(sBASE_64_CHARACTERS, Midb(lsGroup64, 4, 1)) - 1
Byte1 = Chrb(((Char2 And 48) \ 16) Or (Char1 * 4) And &HFF)
Byte2 = lsGroupBinary & Chrb(((Char3 And 60) \ 4) Or (Char2 * 16) And &HFF)
Byte3 = Chrb((((Char3 And 3) * 64) And &HFF) Or (Char4 And 63))
if M4=2 then
lsGroupBinary = Byte1
elseif M4=3 then
lsGroupBinary = Byte1 & Byte2
end if
lsResult = lsResult & lsGroupBinary
end if
Base64decode = lsResult
End Function
%>
- 使用 certutil 实现 Hex2Bin 和 Base64 加解密的方法
- ASP BASE64加解密(亲测可用)
- Base64加解密的实现方式实例详解
关于cocos rc4加解密和cocoslua解密的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于.NET Core结合Nacos实现配置加解密的方法、.net 安卓IOS跨平台des加解密双向的(可以互相加解密)、ASP BASE64加解密(亲测可用)、asp base64加解密函数代码的相关信息,请在本站寻找。
本文标签: