前言:

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

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

之所以要研究这个。第一个,是我做猿人也有些年头了。两年多了吧。记得第一次接触加密解密的时候。还是我的一个公司里的大牛 黄老师 带领我们做的项目。当时做的是一个游戏项目,我们客户端有点扯,这里就不多说了。 我们得项目是游戏项目,同时,我们得服务器是另一个大牛 邓老师 他们在我认为是灰常厉害的人物。十年以上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是用 8位的二进制 来代表 大小写英文、数字、标点符号、控制符等。

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

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

明文:
HelloASCII:
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的加密解密。来解决这里留下的问题。

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

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

    继上一篇 加密解密系列文章之 - ASCII 加密解密(最简单的加密解密) 上 的下篇. 我在 上 篇里 已经给大家说了最基本的ASCII 加密 解密的东西.然后再最后 我们说了ASCII加密解密的问 ...

  2. cnn系列文章四 --池化层和简单卷积网络示例

    cnn系列文章三 --padding和strides详解 一句歌词继续中: <霜雪千年> 苔绿青石板街 斑驳了流水般岁月 小酌三盏两杯 理不清缠绕的情结 典型的卷积神经网络 convolu ...

  3. Kettle系列文章二(安装配置Kettle+SqlServer+简单的输入输出作业)

    一.下载 Kettle下载地址:https://community.hitachivantara.com/docs/DOC-1009855 下拉到DownLoad,点击红框中的链接进行下载.. 二.解 ...

  4. wpe解密系列001

    问:WPE封包解密 小弟刚识WPE不久 对WPE有很大的兴趣 想请高手帮忙看下这是个什么情况 20 FA 2E 14 54 5D 48 4F 31 15 43 72 82 58 97 D1 7D 6A ...

  5. Carlosfu技术系列文章总目录

    转载请注明出处哈:http://carlosfu.iteye.com/blog/2240426   刚看了一下这个账号是2009年注册的,当时可能是为了下载javaeye的周刊吧,后来12年开始工作时 ...

  6. 简单的加密/解密算法_/c++

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_36557960/article/details/79299093 关于加密和解密问题,有的加密 ...

  7. python做一个【批量加密解密】软件,让你的文件有程序加密保护,在也不怕别人乱翻你的东西了

    今天这个批量加解密很简单,和上一个[软件加密]python制作一个超强的加密软件_₰₯₮ 的博客-CSDN博客 文章结合了一下,然后优化了一下 循环文件夹的所有文件,然后捉个进行加解密 def ite ...

  8. 用python实现DES加解密,并附带EBC和CBC两种分组加密模式

    之前在网上看了好多关于DES加解密的文章,很多都是直接贴代码,然而大多数都不能运行.花了一天写了个能运行的程序,其中有参考网上的一些好的代码.希望入了密码学坑的同学能得到帮助.python刚上手,代码 ...

  9. 利用js实现前端简单的加密与解密

    JS实现前端网页加密解密技术,可用作选择性隐蔽展示,并不能作为真正的.安全的代码加密. 主要用的是 JS里charCodeAt()和fromCharCode()的两个方法. 利用String对象的ch ...

最新文章

  1. kerberos简单介绍
  2. 给你的杭州旅游攻略-愿你走出半生,归来仍是姑娘
  3. 计算机视觉的发展现状
  4. 《Docker进阶与实战》——3.2节使用Docker image
  5. python入门题目及答案_Python基础自测题答案和基础知识梳理
  6. boost::type_erasure模块construction相关的测试程序
  7. 设置Backup-masters Hbase中只有一个HMaster ,hmaster挂掉了,客户端还能连接hbase集群进行数据读写吗
  8. Debian耳机声音问题
  9. 成功驱动5150用HT68F30
  10. NopCommerce 2.5的部署
  11. 面试题:有限制条件的求和
  12. js图片上传预览功能
  13. 推荐几个更新比我勤快的优质产品号
  14. Paul Graham:未来的互联网创业(上)
  15. odoo15 po文件自动翻译器
  16. Mac安装MongoDB(极简)
  17. python万年历实验报告_Python编程——万年历
  18. 人类跌落梦境显示无法连接服务器,人类跌落梦境手游网络连接失败进不去解决办法一览...
  19. 史上最全开启windows7(win7)虚拟wifi教程(上)
  20. ROS SMACH个人学习记录

热门文章

  1. VC++/MFC入门项目开发实战之任务管理系统
  2. 《送你一朵小红花》怎么投资?成本多少?怎么参与?
  3. 高效并发-先行发生原则
  4. ICCV 2021 | PMF: 基于视觉感知的多传感器融合点云语义分割方法
  5. 房地产投影沙盘模型制作比例如何确定?
  6. 中国人民大学与加拿大女王大学金融硕士不仅收获了知识、眼界,还收获了深厚的同学情
  7. iOS入门(二十)字典
  8. 【数据库连接问题】【靶场访问错误】Table ‘xxx‘ doesn‘t exist,文件‘Not Find‘ 可能是管理软件与终端本身的一个连接问题
  9. 数据库系统原理练习题(一)
  10. sql学习-with as的使用-分析数据得到结果