【常见加密方法】Base64编码&Tea算法简介
Base64编码
【Base64编码是什么】
Base64是一种基于64个可打印字符来表示二进制数据的表示方法。
——维基百科
Base64,顾名思义,是基于64种可视字符的编码方式。这64种符号由A-Z,a-z,0-9以及另外两个视不同系统而定的可视自符(一般为+和/)组成。因为六位二进制数可以表示所有1-26以内的整数,所以在编码过程中取每六位二进制数依照顺序对应相应可视字符。
Base64将3字节的二进制数据,以先来的字节占据高位,不足三字节则在数据尾部用0补足的规则放入24位缓存器中;在计算时,依次取出6bits进行相应对照编码。而当不足三字节进行补0时,编码结束后要在尾部加上相应补充字节数数量的“=”。
【Base64编码图解】
这里拿RED举个例子:

由图中一层层推到而出RED的Base64编码为UkVE
我们再看看维基百科上缺字节进行补0的例子:

等号数量等于补充的字节数
Tea 算法
【Tea算法是什么】
在密码学中,微型加密算法(Tiny Encryption Algorithm,TEA)是一种易于描述和执行的块密码,通常只需要很少的代码就可实现。
——维基百科
Tea算法能够利用4个32位密钥对2个32位明文数据进行多轮加密,利用不断增加的Delta值和两个32位数据相互加密来保持每一轮加密的和其他任何一轮加密不同。在知道4个32位密钥的情况下,利用可逆的加减操作进行数据的加密与解密。
【Tea算法模版与浅析】
这里我用{1234,4321}作为待加密的两个32位明文数据,用{2147483647,2147483646,2147483645,2147483644}作为四个32位密钥举例。
#include <cstdio> const int delta = 0x9e3779b9;//Tea算法作者的建议值
int scr[],key[]; void _pre(){
scr[] = ;
scr[] = ;
key[] = ;
key[] = ;
key[] = ;
key[] = ;
} void DoTea(){
int a = scr[],b = scr[],sum = ;
for(int i=;i<=;++i){//进行32次迭代加密,Tea算法作者的建议迭代次数
sum += delta;//不断增加Delta的值
a += ((b << ) + key[]) ^ (b + sum) ^ ((b >> ) + key[]);//利用多次双位移和异或将明文与密钥扩散混乱,并将两个明文互相加密
b += ((a << ) + key[]) ^ (a + sum) ^ ((a >> ) + key[]);
}
scr[] = a;//将原数据覆盖为密文
scr[] = b;//将原数据覆盖为密文
printf("%d %d\n",scr[],scr[]);
} void UndoTea(){//利用可逆性将加密过程逆转
int a = scr[],b = scr[],sum = 0xc6ef3720;//32次迭代后delta的值
for(int i=;i<=;++i){
b -= ((a << ) + key[]) ^ (a + sum) ^ ((a >> ) + key[]);
a -= ((b << ) + key[]) ^ (b + sum) ^ ((b >> ) + key[]);
sum -= delta;
}
scr[] = a;
scr[] = b;
printf("%d %d\n",scr[],scr[]);
} int main(){
_pre();
DoTea();
UndoTea();
return ;
}
Tea算法的作者建议加密迭代次数为32次*,以保证数据被充分加密;Delta的值本是可以任何数字,但作者为了避免可能的错误而将delta的值建议为delta = (√5 - 1) * 2147483648 ≈ 2654435769.497230296477,取整为2654435769,即0X9e3779b9。
Tea算法利用迭代过程中多次的位运算和异或使明文与密钥充分扩散混乱,并以下图方式进行两个数据间的互相加密:

图源自:https://blog.csdn.net/jinzhichaoshuiping/article/details/54588003
*注:Tea算法作者强调迭代次数16次即可达到加密效果,但仍然建议32次迭代保证加密牢靠。
【常见加密方法】Base64编码&Tea算法简介的更多相关文章
- qt md5加密,base64编码解码
qt md5加密,base64编码解码 md5加密 QByteArray data = "12121221"; data += "asdfas"; QByteA ...
- 【Mysql sql inject】POST方法BASE64编码注入write-up
翻到群里的小伙伴发出一道POST型SQL注入题,简单抓包判断出题目需要base64编码后才执行sql语句,为学习下SQL注入出题与闯关的思路+工作不是很忙,所以花点时间玩了一下,哈哈哈哈哈哈哈哈哈 ...
- MD5加密与base64编码
转自:http://blog.csdn.net/sxzlc/article/details/74127268 import java.io.UnsupportedEncodingException; ...
- Base64编码和解码算法
Base64么新鲜的算法了.只是假设你没从事过页面开发(或者说动态页面开发.尤其是邮箱服务),你都不怎么了解过,仅仅是听起来非常熟悉. 对于黑客来说,Base64与MD5算法有着相同的位置.由于电子邮 ...
- Base64编码 概念和用途
Base64概念 什么是Base64? 依照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把随意序列的8位字节描写叙述为一种不易被人直接识别的形式.(The Base6 ...
- java编写之jpg图片与base64编码之间的转换
/** * @author zyq * 将网络图片进行Base64位编码 * @param imgUrl * */ public static String encodeWebImageToBase6 ...
- Base64编码知识详解
在我们进行前端开发时,针对项目优化,常会提到一条:针对较小图片,合理使用Base64字符串替换内嵌,可以减少页面http请求. 并且还会特别强调下,必须是小图片,大小不要超过多少KB,等等. 那么,B ...
- 浅谈Base64编码
浅谈Base64编码 我打赌当你见到Base64这个词的时候你会觉得在哪里见过,因为在你能够上网看到这篇文章的时候你已经在后台使用它了.如果您对二进制数有所了解,你就可以开始读它了. 打开一封Emai ...
- 从原理上理解Base64编码
开发者对Base64编码肯定很熟悉,是否对它有很清晰的认识就不一定了.实际 上Base64已经简单到不能再简单了,如果对它的理解还是模棱两可实在不应该.大概介绍一下Base64的相关内容,花几分钟时间 ...
随机推荐
- Part2-HttpClient官方教程-Chapter7-高级主题(Advanced topics) (HTTP Caching)
原文链接 7.1 自定义客户端连接 在某些情况下,为了能够处理非标准的.不兼容的行为,可能需要自定义HTTP消息通过网络传输的方式,而不是使用HTTP参数.例如,对于web爬虫,可能有必要迫使Http ...
- mysql之数据库操作进阶(三)
环境信息 数据库:mysql-5.7.20 操作系统:Ubuntu-16.04.3 查询 条件查询 # 使用where关键字 select * from 表名 where 条件 # 比较运算符 > ...
- 给windows设置隐藏文件夹的方法
cls @ECHO OFF title Folder Private if EXIST "HTG Locker" goto UNLOCK if NOT EXIST Private ...
- linux中没有dos2UNIX或者UNIX2dos命令怎么解决办法
linux中没有dos2UNIX或者UNIX2dos命令怎么解决办法 http://blog.csdn.net/w616589292/article/details/38274475 dos2unix ...
- API(选项/数据 选项/dom)
选项/数据 data 类型: Object | Function 限制: 组件的定义只接受function var data = { a: 1 } // 直接创建一个实例 var vm = new V ...
- 堆--LogN的数据结构
我们这里的堆是指用来表示元素集合的一种数据结构 一个二叉树是一个堆是由堆的两个性质决定的(以小根堆为例) 1:任何节点的值都小于或等于其子节点的值 2:该二叉树最多在两层上具有叶节点,其中最底层的叶节 ...
- Java显式锁学习总结之一:概论
我们都知道在java中,当多个线程需要并发访问共享资源时需要使用同步,我们经常使用的同步方式就是synchronized关键字,事实上,在jdk1.5之前,只有synchronized一种同步方式.而 ...
- Flask 知识总结
阅读目录 第一篇:Flask基础知识介绍 第二篇:Flask扩展小结 第三篇:Flask 配置文件 第四篇:ORM.MySQL数据库连接池 第五篇:单例模式.蓝图Blueprint 第六篇:SQLAL ...
- Django Ajax学习二之文件上传
基于Django实现文件上传 1. url路由配置 路径:C:\Users\supery\Desktop\day82\demo_ajax\demo_ajax\urls.py from django.c ...
- redis之(十八)redis的支持水平扩容的集群特性,以及插槽的相关操作
[一]主从集群的缺点,客户端分片的缺点 (1)主从+哨兵的redis集群,只是做主从备份,数据冗余的一种处理.但在存储空间的扩展上还是有限制.因为集群中的节点都是存储同样的数据.单一节点的容量,就可以 ...
