首页 > 其他分享 >TEA与RC4

TEA与RC4

时间:2023-02-05 22:34:19浏览次数:35  
标签:字节 密钥流 RC4 TEA v0 v1 256 uint32

基本概念

  • 密钥流:RC4 算法的关键是根据明文和密钥生成相应的密钥流,密钥流的长度和明文的长度是对应的,也就是说明文的长度是 500 字节,那么密钥流也是 500 字节。当然,加密生成的密文也是 500 字节,因为密文第 i 字节 = 明文第 i 字节 ^ 密钥流第 i 字节;

  • 状态向量 S:长度为 256Byte,S[0],S[1]…S[255]。每个单元都是一个 Byte,算法运行的任何时候,S 都包括 0-255 的 8Bit 的排列组合,只不过值的位置发生了变换;

  • 临时向量 T:长度也为 256Byte,每个单元也是一个 Byte。如果密钥的长度是 256Byte,就直接把密钥的值赋给 T,否则,轮转地将密钥的每个 Byte 赋给 T;

  • 密钥 K:长度为 1-256Byte,注意密钥的长度(keylen)与明文长度、密钥流的长度没有必然关系,通常密钥的长度为 16Byte(128Bit)。


原理

1、先初始化状态向量S(256个字节,用来作为密钥流生成的种子1)

按照升序,给每个字节赋值0,1,2,3,4,5,6.....,254,255

2、初始密钥(由用户输入),长度任意

如果输入长度小于256个字节,则进行轮转,直到填满

例如输入密钥的是1,2,3,4,5 , 那么填入的是1,2,3,4,5,1,2,3,4,5,1,2,3,4,5........

由上述轮转过程得到256个字节的向量T(用来作为密钥流生成的种子2)

3、开始对状态向量S进行置换操作(用来打乱初始种子1)

按照下列规则进行

从第零个字节开始,执行256次,保证每个字节都得到处理

 j = 0;

  for (i = 0 ; i < 256 ; i++){

    j = (j + S[i] + T[i]) mod 256;

    swap(S[i] , S[j]);

  }

这样处理后的状态向量S几乎是带有一定的随机性了

4、最后是秘钥流的生成与加密,很多人在这里不是特别理解,别的博客也没有写的很简洁明了

假设我的明文字节数是datalength=1024个字节(当然可以是任意个字节)

i=0;

j=0;

while(datalength--){//相当于执行1024次,这样生成的秘钥流也是1024个字节

   i = (i + 1) mod 256;

    j = (j + S[i]) mod 256;

    swap(S[i] , S[j]);

    t = (S[i] + S[j]) mod 256;

    k = S[t];这里的K就是当前生成的一个秘钥流中的一位

    //可以直接在这里进行加密,当然也可以将密钥流保存在数组中,最后进行异或就ok

    data[]=data[]^k; //进行加密,"^"是异或运算符

}

 

TEA算法

核心代码

主题逻辑在于异或

#include <stdio.h>
#include <stdint.h>

void encrypt (uint32_t* v, uint32_t* k) {
   uint32_t sum = 0;  // 注意sum也是32位无符号整型
   uint32_t v0 = v[0], v1 = v[1];
   uint32_t delta = 0x9e3779b9;
   uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3];

   for (int i=0; i<32; i++) {
       sum += delta;
       v0 += ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
       v1 += ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
  }

   v[0]=v0;
   v[1]=v1;
}

void decrypt (uint32_t* v, uint32_t* k) {
   uint32_t v0 = v[0], v1 = v[1];
   uint32_t delta = 0x9e3779b9;
   uint32_t sum = delta * 32;
   uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3];

   for (int i=0; i<32; i++) {
       v1 -= ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
       v0 -= ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
       sum -= delta;
  }

   v[0]=v0;
   v[1]=v1;
}

int main()
{

   uint32_t v[2] = {0x12345678, 0x78563412};

   uint32_t k[4]= {0x1, 0x2, 0x3, 0x4};

   printf("Data is : %x %x\n", v[0], v[1]);
   encrypt(v, k);
   printf("Encrypted data is : %x %x\n", v[0], v[1]);
   decrypt(v, k);
   printf("Decrypted data is : %x %x\n", v[0], v[1]);

   return 0;
}
/*
Data is : 12345678 78563412
Encrypted data is : 9a65a69a 67ed00f6
Decrypted data is : 12345678 78563412
*/
 

标签:字节,密钥流,RC4,TEA,v0,v1,256,uint32
From: https://www.cnblogs.com/fallrain/p/17094097.html

相关文章

  • 免费游戏加速器,支持2000+热门游戏免费加速,某游戏加速器正在内测,登录即享免费加速,支持
    很多游戏加速器都是初期免费,等用户积累到一定程度、名声也打出去了,就开始收费了。现在,一个白嫖的机会就在眼前,给大家搞到一款正在内测的游戏加速器,登录即享2000+游戏和Stea......
  • 一款极易搭建的自助 Git 服务--Gitea安装与使用
    前言gitlab实在是太臃肿,nginx,gem什么的全都集成进去,不管原系统是否已经有可用的版本,虽然简化了安装但是增加了内存占用,吃内存猛如虎,4G内存的路由启用后直接使用swap......
  • 在 FreeBSD 12 上安装 Gitea
    引言Gitea是一个功能齐全的轻量级代码托管解决方案,后端采用Go编写,使用MIT许可证发布。它比GitLab更资源友好,互联网上许多知名开源项目依赖Gitea提供代码托管。......
  • Gitea安装在Windows 10:自用
    Windows10gitversion2.33.1.windows.1gitea-1.18.3-- 用过一些代码管理工具:SVN、Gogs、Gitlab,最近听说了一个叫Gitea的,试试。ben发布于博客园 需提前安装好......
  • 单元测试|Unittest setup前置初始化和teardown后置操作
    Unittestsetup前置初始化和teardown后置操作针对类中每个函数执行时进行前置后置的操作setUp(self):测试前的初始化操作tearDown(self):测试后的操作代码示例:importunittest......
  • [LeetCode] 1626. Best Team With No Conflicts
    Youarethemanagerofabasketballteam.Fortheupcomingtournament,youwanttochoosetheteamwiththehighestoverallscore.Thescoreoftheteamisthe......
  • Teams基础功能与会议介绍
    目录Teams基本功能介绍活动聊天如何查找联系人如何开启语音或视频通话如何共享自己的屏幕如何新建群聊发送文件的多种方式快速安排一个会议重要与紧急的消息文件分享的文件......
  • 远程控制软件 TeamViewer 4.0.5459 简体中文版
    优点:没什么说的。亮点:支持直接拖放文件或目录到被控机器屏幕(目录),这个好!缺点:被控制的目标机器被锁定后无法使用屏幕连接访问,郁闷。。。啊下载地址:​​​http://vbcoder.qupan......
  • 线程安全集合CopyOnWriteArrayList
    解决多线程的集合有以下几种1、Vertor(所有方法上加synchronized锁)能保证多线程安全,数据一致,但性能低下一般不用2、Collections.synchronizedList方法返回的List 在方......
  • teamide
     朱亮 / teamide 代码 Issues 0 PullRequests 0 Wiki 统计 流水线 服务  main  克隆/下载 +PullRequest +......