加密解密系列文章之 - ASCII 加密解密(最简单的加密解密) 上

加密解密 专栏收录该内容
2 篇文章 0 订阅

前言:

首先。在这里声明。本人没学过加密解密专业以及没有对加密解密做过任何的系统学习。文章用来记录我自己学到的加密解密的一些我理解的东西,有错误之处欢迎大家指出。谢谢。

加密解密。在以前我的眼里。是灰常高大上、灰常屌的技术。正如我在上高中的时候。在网上看到的书 名字大概叫 跨平台游戏移植 这一类的(书名具体神马的忘记了)。这对当时的我来说,感觉非常屌。简直就是 “天书” 。 然而在我三四年后。接触了游戏开发,明白了大概之后。就没有那种 “天书” 的感觉了。好了。说这么多。就是为了说一下。很多在我们看起来灰常灰常屌的东西。其实自己研究、钻研一下,就会明白,他并不是像我们想象中那么的高端大气上档次,并不是像我们想象中的那样对方是女神 我等众屌丝只能跪拜的地步,这样做其实女神会看不起。哈哈哈。。。 说多了。来下面开始回到加密解密的话题。

之所以要研究这个。第一个,是我做猿人也有些年头了。两年多了吧。记得第一次接触加密解密的时候。还是我的一个公司里的大牛 黄老师 带领我们做的项目。当时做的是一个游戏项目,我们客户端有点扯,这里就不多说了。 我们得项目是游戏项目,同时,我们得服务器是另一个大牛 邓老师 他们在我认为是灰常厉害的人物。十年以上C++ 黄老师以前还教过3D游戏。当时我们服务器和客户端通信。是TCP 我这android客户端用的java写的。 然后和服务器通信的时候。是吧TCP当成短连接来使用。就是请求发送成功之后。服务器响应。然后断开。 然后当时黄老师说 数据这样直接传递不安全。就让传输的数据加密。那时 黄老师那简直是手把手教怎么写那个加密解密。当时听的什么 & 0xFF 什么 0x20 什么左移右移。说实话。这种操作。正常做项目里 真的是很少项目程序逻辑里会有这些操作。 当时听得是一头雾水,真是听天书一样。。。黄老师人那么好。要是看到这这样说。一定不会笑话我吧。。。

入戏:

现在,我做项目里有一些数据需要保存在本地。公司要求比较严格。项目打包之后拿去安全扫描。就检测到了我在做项目框架的时候。做的本地缓存模块。没有吧本地的缓存数据加密。被安全检测直接检测到了。发的一篇安全检测结果文档给我们。上面直接截图本地缓存的明文数据。按理说这种东西没人会管。但是我们项目性质原因。公司对项目安全性要求比较高。安全检测出问题。那必须要改。就改。于是乎我就研究上了加密解密。

开始:

一:明白数据在计算机里怎么存的

首先。来说一下数据。在计算机里都是二进制。这不用多说。然后再说我们程序里操作的数据。 二进制操作我们肯定不用直接操作。在我们程序里。能直接操作的最小元素是 byte 一个byte 就是一个字节 占用 8位 也就是占用8个二进制位

0000 0001  //这就是一个 byte 

从这里。我们就可以看出来。一个byte 占用的8个二进制位,最大能表示无符号整数是 255 当然 我们得byte通常都是带符号的 所以 byte可以正常表示的是 -128 到 127 我们今天来说的就是这个byte 也就是 8 个二进制位

我们为什么要用byte来说。前面已经说原因了 byte是代码里可以直接操作的数据最小单位。

二:理解字符编码

我们再来说说加密解密。从根本上来讲,加密就是把原本 有意义 的一串字符串 转换成一串 没有意义 的一串字符串 解密就相反,吧不认识的,无意义的字符串转换成 有意义 可使用的字符串。就是还原。

那我们就来先看一下正常能读懂的有意义的字符串 是怎么显示出来的。 这就是 “字符编码” 。

我们都知道,数据在计算机里都是二进制,但是显示出来的却是 我们可以看懂的 中、英文、数字、标点符号等等 这个由 二进制 0 1 转换成我们可以看懂的 中英文数字标点符号 这个转换手法就是 编码 或者说字符编码(没看这个专业名词叫什么,大概就是 编码)

然后我们知道了:
字符编码 就是 吧二进制 0 1 转换成 我们可以看懂读懂的 中、英、数字、标点 的这个过程 同时也代表 这种转换的方式、转换的算法。
以上这个。是我个人总结。专业人士认为错了。欢迎指正。我好改改。不能误了其他人。谢谢。

三:字符编码的几种方式

说是字符编码的几种方式。其实就是说 字符编码 例如 ASCII、UTF-8、GBK、GB2312、ISO-8859-1、Unicode 等 这些。就是字符编码的方式。

也就是说 这些字符编码方式。告诉了电脑 该怎么去吧 0 1 转换成 我们可以看懂的文字。我们用一个比喻。来让大家更明白。
比如:

对同样的源数据 
0010 1101
然后我们运用编码
 0010 1101 》 A ;//ASCII编码出来之后结果是 A (这里是举例子,真的ASCII算法不是这样)
 0010 1101 》 D ;//UTF-8编码之后是 D ( 这里是举例子,真的UTF-8算法不是这样的)
 0010 1101 》 天;//GBK编码后是 天  (这里是举例子,真正的GBK算法不是这样的)
 。。。 剩下的类似。

我这里要讲的是。字符编码 是一种算法、运算规则 或者也可以叫 映射 。 也就是说 同样的数据。在运用不同的字符编码算法 得出不同的结果。

重点就是字符编码(ASCII、UTF-8、GBK、GB2312、ISO-8859-1、Unicode …) 是 一种 “算法”,同样的数据 经过不同的 “算法” 出来的结果可能相同 也可能不同。

其他编码都先不说。太多。太混乱。我们今天就来说说ASCII 对于程序猿来说。ASCII编码应该不会陌生吧。好了。不管你知不知道。我们今天都来再看一次。 ASCII编码是美国什么机构定制的。就是用来将0 1 这样的二进制数据流 或者叫数据串 解释成人们能看懂 又方便操作计算机或者被自计算机操作的 英文、数字 其他字符。

四:ASCII编码

网上搜一下就能很轻易的搜到很多ASCII东西。这里就借用网上搜的一个图片。来让大家再看看ASCII

ASCII表
ASCII表
ASCII表
ASCII表

我们看到了ASCII是用 8位的二进制 来代表 大小写英文、数字、标点符号、控制符等。

上面我们也说了 8位 二进制 程序里用byte表示 -128 到 127 在ASCII里我们可以看到 最大就是 127

依照上表。我们可以知道 byte可以代表127个ASCII字符。ASCII里包括大小写、数字、符号等。所以我们就知道了。英文、数字、符号等。占用 1 byte 也就是1字节。也就是占用 8个二进制位 我们上面也说了。加密就是让能读懂的、有意义的字符串变成不能读懂、无意义的字符串。好了。我们接下来看。

明文:
Hello

ASCII:
0100100001100101011011000110110001101111
//上面这就是在ASCII编码下 Hello 在电脑里存放的二进制数据 我们来给拆分一下 让我们看清楚点
01001000 01100101 01101100 01101100 01101111
//也就是 (根据ASCII表对照关系)
01001000 对应 H
01100101 对应 e
01101100 对应 l
01101100 对应 l
01101111 对应 o

我们看了ASCII的对应关系。同时知道不同明文对应的二进制是不一样的。Hello 这是有意义的字符串。我们可以看懂。 我们需要把他变得我们看不懂。我们怎么做? 这就是加密。不同的操作。不同的加密。对应的就是不同的加密算法。 就如同网上的各种加密算法 BASE64、MD5、DES、RSA 这些。

五:ASCII加密

了解了上面的东西之后。我们知道了 ASCII就是把 8位的二进制数据 转换 成我们能看懂的字符。 然后我们加密。就是要让别人看不懂我原来的数据。 上面也说了Hello的二进制。这里继续说。

要把 “Hello” 这段明文 加密 成让我们不知道这个字符串的原本含义。最简单的是。让他们每个字母都变化。让他加密后的数据不是 “Hello” 这样。我们加密的目的就达到了。
怎么让这串字符串变成不是他自己呢。 这就是具体的算法。 我们这里来随便说一种。
让这段字符串 “Hello” 的每一个字符 都 - 5 我们运用ASCII的表来操作。

H - 5 = C
e - 5 = `
l - 5 = g
l - 5 = g
o - 5 = j

//加密结果为 C`ggj

//然后我们来看看
//明文:
Hello
//密文:
C`ggj

这样 我们就将Hello 加密成 C`ggj了 达到了我们加密的需求(将 有意义 的字符串 转换成 无意义 的字符串 )

这里我们得加密算法就是 取每一个ASCII字符 将他们都做 - 5 操作 。说了这么多,原因只有一个,那就是让你们理解、明白。。。
好了。你们该说 Talk is cheap. Show me the code 那我就不多废话了。来~ 金刚! show we code!
代码
运行结果

发一下文字代码。让大家可以复制下去自己运行

public static void main( String[] args )
{
    //明文 原始字符串
    String sourceStr = "Hello";
    System.out.println( "加密前的明文数据:");
    System.out.println( "" + sourceStr );
    //开始加密
    //一 将明文拆分成单个字符
    byte[] strBytes = sourceStr.getBytes();
    //二 将每个字符 都做 - 5 操作
    for ( int i = 0; i < strBytes.length; i++ )
    {
        //对每个字符都做 - 5 操作
        strBytes[i] -= 5;
    }
    //加密后的数据
    String targetStr = new String( strBytes );

    System.out.println( "加密后的数据:");
    System.out.println( "" + targetStr );
}

//运行结果
加密前的明文数据:
Hello
加密后的数据:
C`ggj

这就是最简单的ASCII的一种加密方式。来下面看看常规的加密的用处

//加密前的明文数据:
{"name":"brok1n", "age":22, "sex":1, "birthday":"1993-02-28"}

//加密后的数据:
vi\h`5]mjf,i'\b`5--'n`s5,']dmoc_\t5,44.(+-(-3x

//很明显。没加密。我们都能认识看懂、是一串有规则、有意义的字符串。但是加密之后。就成了没有意义的字符串了。

这就是ASCII的简单加密(由于我们刚接触加密我们先只了解这么多。这种加密方式写法还有很多缺点没有完善,但这是加密的最基本的思路。)

下面来看看我们的 解密

六:ASCII解密

说白了。解密就是还原。还原。大家应该都知道了吧。就是把加密的算法。反过来。那么怎么反过来呢。我们接下来看。

    //开始解密
    //一 将密文拆分成单个字符
    byte[] tarBytes = targetStr.getBytes();
    //二 将每个字符 都做 + 5 操作 (加密是 -5 我们这里反过来就是 +5)
    for ( int i = 0; i < tarBytes.length; i++ )
    {
        //对每个字符都做 + 5 (操作 加密是 -5 我们这里反过来就是 +5)
        tarBytes[i] += 5;
    }
    //加密后的数据
    String reTarStr = new String( tarBytes );

    System.out.println( "解密后的数据:");
    System.out.println( "" + reTarStr );

//结果
解密后的数据:
{"name":"brok1n", "age":22, "sex":1, "birthday":"1993-02-28"}

以上就是解密。

然后我们来看看整体的代码。以及结果

public static void main( String[] args )
{
    //明文 原始字符串
    //json数据 {"name":"brok1n", "age":22, "sex":1, "birthday":"1993-02-28"}
    String sourceStr = "{\"name\":\"brok1n\", \"age\":22, \"sex\":1, \"birthday\":\"1993-02-28\"}";
    System.out.println( "加密前的明文数据:");
    System.out.println( "" + sourceStr );
    //开始加密
    //一 将明文拆分成单个字符
    byte[] strBytes = sourceStr.getBytes();
    //二 将每个字符 都做 - 5 操作
    for ( int i = 0; i < strBytes.length; i++ )
    {
        //对每个字符都做 - 5 操作
        strBytes[i] -= 5;
    }
    //加密后的数据
    String targetStr = new String( strBytes );

    System.out.println( "加密后的数据:");
    System.out.println( "" + targetStr );

    System.out.println( "解密");

    //开始解密
    //一 将密文拆分成单个字符
    byte[] tarBytes = targetStr.getBytes();
    //二 将每个字符 都做 - 5 操作
    for ( int i = 0; i < tarBytes.length; i++ )
    {
        //对每个字符都做 - 5 操作
        tarBytes[i] += 5;
    }
    //加密后的数据
    String reTarStr = new String( tarBytes );

    System.out.println( "解密后的数据:");
    System.out.println( "" + reTarStr );

}

结果如下:

加密前的明文数据:
{"name":"brok1n", "age":22, "sex":1, "birthday":"1993-02-28"}
加密后的数据:
vi\h`5]mjf,i'\b`5--'n`s5,']dmoc_\t5,44.(+-(-3x
解密
解密后的数据:
{"name":"brok1n", "age":22, "sex":1, "birthday":"1993-02-28"}

解密结果

好了。这就是ASCII加密最基本的思路。当然这个加密解密已经说了是ASCII加密解密。只能做ASCII表上的那些字符的加密解密。但是这个加密的写法。有很多、很大的问题。比如如果对一个字符做-5操作后他的ASCII小于0 就会出问题。

尾声

好了。我们学习到这里。就应该会明白了我上面说的ASCII中的最简单的加密解密。下一篇。我们继续来学习ASCII的加密解密。来解决这里留下的问题。

  • 16
    点赞
  • 5
    评论
  • 26
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值