GVKun编程网logo

cocos rc4加解密(cocoslua解密)

10

本文将分享cocosrc4加解密的详细内容,并且还将对cocoslua解密进行详尽解释,此外,我们还将为大家带来关于.NETCore结合Nacos实现配置加解密的方法、.net安卓IOS跨平台des加

本文将分享cocos rc4加解密的详细内容,并且还将对cocoslua解密进行详尽解释,此外,我们还将为大家带来关于.NET Core结合Nacos实现配置加解密的方法、.net 安卓IOS跨平台des加解密双向的(可以互相加解密)、ASP BASE64加解密(亲测可用)、asp base64加解密函数代码的相关知识,希望对你有所帮助。

本文目录一览:

cocos rc4加解密(cocoslua解密)

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实现配置加解密的方法

.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 里面拿一些额外的信息。

GetOrderGetFilterName 属于辅助信息,指定这个 ConfigFilter 的执行顺序(越小越先执行)和名称。

DoFilter 就是核心了,它可以变更 request 和 response ,这两个对象内部都会维护一个包含配置信息的 Dictionary。

换言之,只要我们定义一个 ConfigFilter,实现了这个接口,那么配置想怎么操作都可以了,加解密就是小问题了。

其中 NacosSdkOptions 里面加了两个配置项,是专门给这个功能用的 ConfigFilterAssembliesConfigFilterExtInfo

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加解密双向的(可以互相加解密)

.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加解密(亲测可用)

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加解密函数代码

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加解密函数代码的相关信息,请在本站寻找。

本文标签:

上一篇关于cocos2d中的世界坐标与局部坐标(cocos坐标系)

下一篇cocos2d-x - 产生随机数(c++)(cocos随机生成怪物)