zoukankan      html  css  js  c++  java
  • 【常见加密方法】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位密钥举例。

     

     1 #include <cstdio>
     2 
     3 const int delta = 0x9e3779b9;//Tea算法作者的建议值
     4 int scr[2],key[4];
     5 
     6 void _pre(){
     7     scr[0] = 1234;
     8     scr[1] = 4321;
     9     key[0] = 2147483647;
    10     key[1] = 2147483646;
    11     key[2] = 2147483645;
    12     key[3] = 2147483644;
    13 }
    14 
    15 void DoTea(){
    16     int a = scr[0],b = scr[1],sum = 0;
    17     for(int i=1;i<=32;++i){//进行32次迭代加密,Tea算法作者的建议迭代次数
    18         sum += delta;//不断增加Delta的值
    19         a += ((b << 4) + key[0]) ^ (b + sum) ^ ((b >> 5) + key[1]);//利用多次双位移和异或将明文与密钥扩散混乱,并将两个明文互相加密
    20         b += ((a << 4) + key[2]) ^ (a + sum) ^ ((a >> 5) + key[3]);
    21     }
    22     scr[0] = a;//将原数据覆盖为密文
    23     scr[1] = b;//将原数据覆盖为密文
    24     printf("%d %d
    ",scr[0],scr[1]);
    25 }
    26 
    27 void UndoTea(){//利用可逆性将加密过程逆转
    28     int a = scr[0],b = scr[1],sum = 0xc6ef3720;//32次迭代后delta的值
    29     for(int i=1;i<=32;++i){
    30         b -= ((a << 4) + key[2]) ^ (a + sum) ^ ((a >> 5) + key[3]);
    31         a -= ((b << 4) + key[0]) ^ (b + sum) ^ ((b >> 5) + key[1]);
    32         sum -= delta;
    33     }
    34     scr[0] = a;
    35     scr[1] = b;
    36     printf("%d %d
    ",scr[0],scr[1]);
    37 }
    38 
    39 int main(){
    40     _pre();
    41     DoTea();
    42     UndoTea();
    43     return 0;
    44 }

     

      Tea算法的作者建议加密迭代次数为32次*,以保证数据被充分加密;Delta的值本是可以任何数字,但作者为了避免可能的错误而将delta的值建议为delta = (√5 - 1) * 2147483648 ≈ 2654435769.497230296477,取整为2654435769,即0X9e3779b9

      Tea算法利用迭代过程中多次的位运算和异或使明文与密钥充分扩散混乱,并以下图方式进行两个数据间的互相加密:

    图源自:https://blog.csdn.net/jinzhichaoshuiping/article/details/54588003

      *注:Tea算法作者强调迭代次数16次即可达到加密效果,但仍然建议32次迭代保证加密牢靠。

     

  • 相关阅读:
    真题演练3
    牛客挑战赛43. C.最优公式 (二分,思维,切比雪夫距离与曼哈顿距离的转换)
    F. Equal Product (数学,思维,暴力)
    BJOJ 4402 Claris的剑 (组合数学,思维)
    牛客.二分图染色 (组合数学,思维,递推)
    树 (DP,dfs序,组合数学,思维)
    牛客练习赛69 E.子串 (树状数组, 思维)
    牛客练习赛14 B.区间的连续段 (倍增)
    城市网络(树上倍增)
    D. Game of Pairs (构造,思维)
  • 原文地址:https://www.cnblogs.com/reddest/p/9554948.html
Copyright © 2011-2022 走看看