Base4 应用及设计

2023-11-11 23:32
文章标签 设计 应用 base4

本文主要是介绍Base4 应用及设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  在对Base64、Base32、Base16进行了原理分析和应用示例后,突然想起,有没有一种不可见的编码,在一般文本查看器时,无法直观的查看文本中的内容,从而达到隐藏原文的目的。当然这只是一种编码,并不会保证数据的安全性。

  · ASCII 编码

  首先,在进行编码设计之前,我们需要先了解一下ASCII编码表中,每个编码的表现形式,写一个测试类,把ASCII全部输出:

package com.arhorchin.securitit.codec.ascii;public class AsciiTester {public static void main(String[] args) throws Exception {for (int i = 0; i < 128; i++) {System.out.println((char) i);}}}

  输出结果:
在这里插入图片描述
  从输出结果可以看出,ASCII码中0-32和127属不可见字符,在不可见字符串中,不会产生占位的共4个字符:28、29、30、31,这4个字符在一般文本编辑器查看时,不会显示,当然,功能强大的编辑器会显示其本来面目。

  · Base4 编码

  使用ASCII码中28、29、30、31四个字符对字节数组进行分解,每个字节是8位,利用已有的四个字符将每个字节拆分为4个字节,工具类如下:

package com.arhorchin.securitit.codec.base;import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;public class Base4 {/*** 编码码位集合.*/private static final String Base4Tb = new String(new char[] { (char) 28, (char) 29, (char) 30, (char) 31 });private Base4() {}/*** Base4编码.* @param strData 待编码字符串.* @param charset 字符集.* @return 已编码字符串.*/public static String encodeBase4String(String strData, Charset charset) {return new String(encodeBase4(strData.getBytes(charset)), charset);}/*** Base4编码.* @param strData 待编码字节数组.* @param charset 字符集.* @return 已编码字符串.*/public static String encodeBase4String(byte[] binaryData, Charset charset) {return new String(encodeBase4(binaryData), charset);}/*** Base4编码.* @param strData 待编码字节数组.* @param charset 字符集.* @return 已编码字节数组.*/public static byte[] encodeBase4(byte[] binaryData) {ByteArrayOutputStream os = new ByteArrayOutputStream();for (byte item : binaryData) {short value = (short) (item & 0xFF);byte first = (byte) (value >> 6);byte second = (byte) (((value << 2) & 0xFF) >> 6);byte third = (byte) (((value << 4) & 0xFF) >> 6);byte fourth = (byte) (((value << 6) & 0xFF) >> 6);os.write(Base4Tb.charAt(first));os.write(Base4Tb.charAt(second));os.write(Base4Tb.charAt(third));os.write(Base4Tb.charAt(fourth));}return os.toByteArray();}/*** Base4解码.* @param strData 待解码字符串.* @param charset 字符集.* @return 已解码字符串.*/public static String decodeBase4String(String strData, Charset charset) {return new String(decodeBase4(strData.getBytes(charset)), charset);}/*** Base4解码.* @param strData 待解码字节数组.* @param charset 字符集.* @return 已解码字符串.*/public static String decodeBase4String(byte[] binaryData, Charset charset) {return new String(decodeBase4(binaryData), charset);}/*** Base4解码.* @param strData 待解码字节数组.* @param charset 字符集.* @return 已解码字节数组.*/public static byte[] decodeBase4(byte[] binaryData) {ByteArrayOutputStream bs = new ByteArrayOutputStream();byte[] raw = binaryData;for (int i = 0; i < raw.length; i++) {bs.write(raw[i]);}byte[] in = bs.toByteArray();if (in.length % 4 != 0) {return null;}bs.reset();DataOutputStream ds = new DataOutputStream(bs);for (int i = 0; i < in.length; i += 4) {byte first = (byte) Base4Tb.indexOf((char) in[i]);byte second = (byte) Base4Tb.indexOf((char) in[i + 1]);byte third = (byte) Base4Tb.indexOf((char) in[i + 2]);byte fourth = (byte) Base4Tb.indexOf((char) in[i + 3]);try {ds.writeByte((first << 6) + (second << 4) + (third << 2) + fourth);} catch (IOException e) {}}return bs.toByteArray();}}

​ 测试类如下:

package com.arhorchin.securitit.codec.base;import java.nio.charset.Charset;public class Base4Tester {public static void main(String[] args) throws Exception {String plain = "我们将使用Base4编码格式对数据进行编码,查看编码后数据.";String codec = "";// Base4 编码.codec = Base4.encodeBase4String(plain, Charset.forName("UTF-8"));System.out.println("编码后数据:" + codec);System.out.println("编码后数据长度:" + codec.length());// Base4 解码.plain = Base4.decodeBase4String(codec, Charset.forName("UTF-8"));System.out.println("解码后数据:" + plain);System.out.println("解码后数据长度:" + plain.length());}}

  测试类输入结果:
在这里插入图片描述
  从输出结果中可以看出,编码后的数据在IDE的Console中是不占位的,但是长度是依然存在的。

  · Base4 文件中表现

  我们同样可以把内容输出到文件中。在不同的文本编辑器下,显示的效果略有不同,示例如下:

package com.arhorchin.securitit.codec.base;import java.io.File;
import java.nio.charset.Charset;import org.apache.commons.io.FileUtils;public class Base4FileTester {public static void main(String[] args) throws Exception {String plain = "我们将使用Base4编码格式对数据进行编码,查看编码后数据.";String codec = "";// Base4 编码.codec = Base4.encodeBase4String(plain, Charset.forName("UTF-8"));System.out.println("编码后数据:" + codec);System.out.println("编码后数据长度:" + codec.length());// 内容写入文件.FileUtils.writeStringToFile(new File("C:/Users/Administrator/Downloads/个人文件/Base4.txt"), codec);}}

  文件在记事本中显示:
在这里插入图片描述
  文件在EditPlus中显示:
在这里插入图片描述
  文件在UltraEdit中显示:
在这里插入图片描述
  文件在Notepad++中显示:
在这里插入图片描述
  从上面这些图片可以看出,Notepad、EditPlus、UltraEdit不会显示编码后内容,Notepad++会显示编码后内容。

  · 总结

  · Base4是纯属娱乐开发的小玩意。

  · Base4会使当前数据膨胀为原数据的4倍。

  · Base4在某些文本编辑器中不会显示内容,但是文本大小实际是有原文内容大小决定的。

  · Base4只是编码算法,并非秘钥算法,所以并不能在数据安全性等方面给予保证。

这篇关于Base4 应用及设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/393570

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

zoj3820(树的直径的应用)

题意:在一颗树上找两个点,使得所有点到选择与其更近的一个点的距离的最大值最小。 思路:如果是选择一个点的话,那么点就是直径的中点。现在考虑两个点的情况,先求树的直径,再把直径最中间的边去掉,再求剩下的两个子树中直径的中点。 代码如下: #include <stdio.h>#include <string.h>#include <algorithm>#include <map>#

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

AI行业应用(不定期更新)

ChatPDF 可以让你上传一个 PDF 文件,然后针对这个 PDF 进行小结和提问。你可以把各种各样你要研究的分析报告交给它,快速获取到想要知道的信息。https://www.chatpdf.com/

怎么让1台电脑共享给7人同时流畅设计

在当今的创意设计与数字内容生产领域,图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能,成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 设计团队面临资源有限,比如只有一台高性能电脑时,如何高效地让七人同时流畅地进行设计工作,便成为了一个亟待解决的问题。 一、硬件升级与配置 1.高性能处理器(CPU):选择多核、高线程的处理器,例如Intel的至强系列或AMD的Ry

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。