一、自定义Base16编码原理

                 Base16编码跟Base64编码原理上有点不同,当然前面转换是一样的,都是是将输入的字符串根据默认编码转换成一个字节序列,而这个字节序列里面其实就是存的ASCII码,其次,将每个ASCII码转换成8位二进制,每个八位二进制拆分成4位一组的二进制,然后将每4位一组的二进制转换成十进制, 最后,根据十进制的数字索引密文下标的字符,将这些字符串联起来就是编码的字符串。

例子:abc

ASCII码:          97                  98                    99

二进制:     01100001     01100010        01100011

拆分成四位一组:     0110   0001   0110   0010   0110  0011

十进制:       6         1         6          2         6         3

根据十进制索引密文下标中的字符,下面是编码的代码

  1. /// <summary>
  2. /// 自定义Base16编码
  3. /// </summary>
  4. /// <param name="str">需要编码的字符串</param>
  5. /// <param name="autoCode">自定义Base16编码数组,16个元素,可以为数字、字符、特殊符号,若不填,使用默认的Base16编码数组,解码与编码的Base16编码数组一样</param>
  6. /// <returns></returns>
  7. public static string AutoBase16Encrypt(string str, string[] autoCode)
  8. {
  9. string innerStr = string.Empty;
  10. StringBuilder strEn = new StringBuilder();
  11. if (autoCode == null || autoCode.Length < )
  12. autoCode = new string[] { "a", "", "B", "g", "E", "", "f", "", "C", "", "o", "", "Z", "p", "k", "M" };
  13. System.Collections.ArrayList arr = new System.Collections.ArrayList(System.Text.Encoding.Default.GetBytes(str));
  14. for (int i = ; i < arr.Count; i++)
  15. {
  16. byte data = (byte)arr[i];
  17. int v1 = data >> ;
  18. strEn.Append(autoCode[v1]);
  19. int v2 = ((data & 0x0f) << ) >> ;
  20. strEn.Append(autoCode[v2]);
  21. }
  22. return strEn.ToString();
  23. }

二、自定义Base16解码原理

其实解码原理也很简单了,首先,将编码的字符串拆分成字符,其次,根据字符寻找到第一个和第二个字符的下标值。将第一个下标值转换成8位二进制,然后左移4位,与第二个字符的下标值合成一个字节,保存在字节数组里,最后,将保存好的字节数组根据默认编码转换成字符串。(解码我就不详加解释了)下面是解码的代码

  1. /// <summary>
  2. /// 自定义Base16解码
  3. /// </summary>
  4. /// <param name="str">需要解码的字符串</param>
  5. /// <param name="autoCode">自定义Base16编码数组,16个元素,可以为数字、字符、特殊符号,若不填,使用默认的Base16编码数组,解码与编码的Base16编码数组一样</param>
  6. /// <returns></returns>
  7. public static string AutoBase16Decrypt(string str, string[] autoCode)
  8. {
  9. int k = ;
  10. string dnStr = string.Empty;
  11. int strLength = str.Length;
  12. if (autoCode == null || autoCode.Length < )
  13. autoCode = new string[] { "a", "", "B", "g", "E", "", "f", "", "C", "", "o", "", "Z", "p", "k", "M" };
  14. byte[] data = new byte[strLength / ];
  15. for (int i = , j = ; i < data.Length; i++, j++)
  16. {
  17. byte s = ;
  18. int index1 = autoCode.ToList().IndexOf(str[j].ToString());
  19. j += ;
  20. int index2 = autoCode.ToList().IndexOf(str[j].ToString());
  21. s = (byte)(s ^ index1);
  22. s = (byte)(s << );
  23. s = (byte)(s ^ index2);
  24. data[k] = s;
  25. k++;
  26. }
  27. dnStr = Encoding.Default.GetString(data);
  28. return dnStr;
  29. }

     三、Base16编码数组解析

最后说一下这个编码数组,这个编码数组呢,是一个字符串数组,元素总数不能小于16个,当然超过16个元素,也用不上,这16个字符完全自定义,这个比较灵活,最后给大家看一个随机编码数组的函数。

  1. /// <summary>
  2. /// 随机编码数组
  3. /// </summary>
  4. /// <returns></returns>
  5. public string[] RandomEncrypt()
  6. {
  7. string[] code = new string[];
  8. Random random = new Random();
  9. int j = ;
  10. for (int i = ; < ; i++)
  11. {
  12. char ch = (char)random.Next(, );
  13. if (code.ToList().IndexOf(ch.ToString()) < && (( ch >= '' && ch <= '')
  14. || (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')))
  15. {
  16. code[j] = ch.ToString();
  17. j++;
  18. }
  19. if (!Array.Exists(code, string.IsNullOrEmpty) && code.Length == )
  20. break;
  21. }
  22. return code;
  23. }

总结:我写的这个Base16编码解码,其实很简单了,原理也很简单,适合初学者学习体验,当然这个编码解码可以扩展,如果哪位高手或者前辈有新的思路或者想法,请告知,谢谢。

自定义Base16加密的更多相关文章

  1. c# 自定义Base16编码解码

               一.自定义Base16编码原理                  Base16编码跟Base64编码原理上有点不同,当然前面转换是一样的,都是是将输入的字符串根据默认编码转换成一 ...

  2. PHP 之base16加密解密封装

    /** * @Description: base16加密 * @Author: Yang * @param $data * @return string */ function base16_enco ...

  3. Oracle自定义函数&加密

    在sql中频繁使用的功能(逻辑.加密等)可以写成自定义函数进行封装,之后再调用即可. CREATE OR REPLACE FUNCTION "函数名" (参数名 参数类型 参数数据 ...

  4. Tomcat自定义classLoader加密解密

    class很好反编译,所以需要对class文件先进行加密,然后使用自己的classloader进行解密并加载. [步骤] 大概分两步: 1.对class文件进行加密 2.写解密class文件并加载的c ...

  5. Net Core 自定义 Middleware 加密解密

    前言:第一次写文章,有问题请轻喷 当前使用 Net Core 版本 2.1.3 我们经常在开发中需要把实体的主键 Id 传输到前端,但是在Get的时候又不想让前端能看到明文,我们通常会加密这些数据,所 ...

  6. django 自定义 密码加密方式 及自定义验证方式

    在django1.6中,默认的加密方式是pbkdf_sha256,具体算法不表,一直以来用django的自带用户验证都十分顺手,但如果需要修改默认加密方式为md5,具体方法为: 在settings.p ...

  7. SpringBoot自定义classloader加密保护class文件

    背景 最近针对公司框架进行关键业务代码进行加密处理,防止通过jd-gui等反编译工具能够轻松还原工程代码,相关混淆方案配置使用比较复杂且针对springboot项目问题较多,所以针对class文件加密 ...

  8. 推荐分享一个牛X的自定义PHP加密解密类

    通俗点说,用它来进行加密,同一个字符串,每次进行加密,得出的结果都是不一样的,大大加强了数据安全性.同时还可设定加密后数据的有效期,简直牛掰了 #食用方法 将下面的第二份模块代码保存为 Mcrypt. ...

  9. php自定义函数: 加密下载地址

    function getdownurl($downurl, $extime = "3600", $serverid = 1) { if (empty($downurl)) { re ...

随机推荐

  1. HDU2057 A + B Again

    Problem Description There must be many A + B problems in our HDOJ , now a new one is coming. Give yo ...

  2. HDU1166 数状数组

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  3. 扩展jquery.validate自定义验证,自定义提示,本地化

    <!DOCTYPE html> <html> <head> <meta name="viewport" content="wid ...

  4. asp.net中使用Global.asax文件中添加应用出错代码,写入系统日志文件或数据库

    void Application_Error(object sender, EventArgs e) { // 在出现未处理的错误时运行的代码 Exception objErr = Server.Ge ...

  5. cocos2dx - v2.3.3编辑器简单使用及不同分辨率适配

    准备工具 Cocos 引擎当前最新版本:v2.3.3       官网下载地址: http://www.cocos.com/download/ 前述:cocos自带UI编辑器在最新的版本有了很大的改动 ...

  6. 从零开始搭建框架SSM+Redis+Mysql(一)之摘要

    从零开始搭建框架SSM+Redis+Mysql(一)之摘要 本文章为本人实际的操作后的回忆笔记,如果有步骤错漏,希望来信307793969@qq.com或者评论指出. 本文章只体现过程,仅体现操作流程 ...

  7. Java方法使用的有点总结

    方法使用的优点: 1-将解决问题的方法与主函数代码分开,逻辑更清晰,代码可读性更强. 2-若方法出错,则程序可以缩小为只在该方法中查找错误,使代码更容易调试. 3-方法是解决一类问题的抽象,一旦写成功 ...

  8. javaWeb 基础知识

    cookie  深度解析:  http://blog.csdn.net/ghsau/article/details/20395681 cookie 的作用: 利用存在客户端本地的缓存让无状态的服务器也 ...

  9. 面向接口编程实现不改代码实现Redis单机/集群之间的切换

    开发中一般使用Redis单机,线上使用Redis集群,因此需要实现单机和集群之间的灵活切换 pom配置: <!-- Redis客户端 --> <dependency> < ...

  10. Servlet 笔记-servlet实例

    Servlet 是服务 HTTP 请求并实现 javax.servlet.Servlet 接口的 Java 类.Web 应用程序开发人员通常编写 Servlet 来扩展 javax.servlet.h ...