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算法简介的更多相关文章

  1. qt md5加密,base64编码解码

    qt md5加密,base64编码解码 md5加密 QByteArray data = "12121221"; data += "asdfas"; QByteA ...

  2. 【Mysql sql inject】POST方法BASE64编码注入write-up

      翻到群里的小伙伴发出一道POST型SQL注入题,简单抓包判断出题目需要base64编码后才执行sql语句,为学习下SQL注入出题与闯关的思路+工作不是很忙,所以花点时间玩了一下,哈哈哈哈哈哈哈哈哈 ...

  3. MD5加密与base64编码

    转自:http://blog.csdn.net/sxzlc/article/details/74127268 import java.io.UnsupportedEncodingException; ...

  4. Base64编码和解码算法

    Base64么新鲜的算法了.只是假设你没从事过页面开发(或者说动态页面开发.尤其是邮箱服务),你都不怎么了解过,仅仅是听起来非常熟悉. 对于黑客来说,Base64与MD5算法有着相同的位置.由于电子邮 ...

  5. Base64编码 概念和用途

    Base64概念 什么是Base64? 依照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把随意序列的8位字节描写叙述为一种不易被人直接识别的形式.(The Base6 ...

  6. java编写之jpg图片与base64编码之间的转换

    /** * @author zyq * 将网络图片进行Base64位编码 * @param imgUrl * */ public static String encodeWebImageToBase6 ...

  7. Base64编码知识详解

    在我们进行前端开发时,针对项目优化,常会提到一条:针对较小图片,合理使用Base64字符串替换内嵌,可以减少页面http请求. 并且还会特别强调下,必须是小图片,大小不要超过多少KB,等等. 那么,B ...

  8. 浅谈Base64编码

    浅谈Base64编码 我打赌当你见到Base64这个词的时候你会觉得在哪里见过,因为在你能够上网看到这篇文章的时候你已经在后台使用它了.如果您对二进制数有所了解,你就可以开始读它了. 打开一封Emai ...

  9. 从原理上理解Base64编码

    开发者对Base64编码肯定很熟悉,是否对它有很清晰的认识就不一定了.实际 上Base64已经简单到不能再简单了,如果对它的理解还是模棱两可实在不应该.大概介绍一下Base64的相关内容,花几分钟时间 ...

随机推荐

  1. perl HTML::HeadParser获取html头部信息

    use LWP::Simple; use HTML::HeadParser; use utf8; binmode(STDOUT, ":encoding(gbk)"); #设置win ...

  2. python3中处理url异常

    import urllib.request import urllib.error url = 'http://c.telunyun.com/Chart/getJsonData?market=1' d ...

  3. Linux_信号与信号量【转】

    转自:http://blog.csdn.net/sty23122555/article/details/51470949 信号: 信号机制是类UNIX系统中的一种重要的进程间通信手段之一.我们经常使用 ...

  4. 工具===代替cmd的conemu设置

    conemu设置 Win+Alt+P进入设置界面,字体设置: 隐藏右上角菜单和窗口标题. (Ctrl + ~ 隐藏/显示terminal) 设置背景图片 避免误操作,关闭/新建确认 设置win+w默认 ...

  5. 天气api接口

    python调用天气api接口: http://www.sojson.com/open/api/weather/json.shtml?city=北京 http://www.sojson.com/blo ...

  6. 【bzoj4373】算术天才⑨与等差数列

    同之前那道由乃题,可以认为由乃题是这题的特殊情况…… 维护方法是同样的,维护区间和,区间平方和即可. 注意特判一个数(其实没有必要) #include<bits/stdc++.h> ; u ...

  7. FineReport——插入行策略

    1.空值是默认的选项,即每次插入新行时,格子都是空白的. 2.原值即单元格中原有内容是什么,就复制到新增的格子中,一般适用于单元格是使用公式定义的, 在插入单元格时,公式会保留下来. 3.默认值即通过 ...

  8. C#面向对象(OOP)入门—第二天—多态和继承(继承)

    介绍: 第一天的内容主要是不同情形下的方法重载.这一部分则主要讲面向对象中继承的概念.首先用一个要点图形来定义继承. 继承 一个简单的例子: ClassA: class ClassA:ClassB { ...

  9. 【JBPM4】任务form表单

    主要是在任务节点处保存一个链接地址(表单),方便在执行到此时取值,访问. 好处是XML可随时修改,部署. JPDL <?xml version="1.0" encoding= ...

  10. HDU 5114 扩展欧几里得

    题目大意:给你两个球的坐标 他们都往(1, 1)这个方向以相同的速度走,问你他们在哪个位置碰撞. 思路:这种题目需要把x方向和y方向分开来算周期,两个不同周期需要用扩展欧几里得来求第一次相遇. #in ...