常见加解密算法02 - RC4算法分析

RC4是一种广泛使用的流密码,它以其简洁和速度而闻名。区别于块密码,流密码特点在于按位或按字节来进行加密。

RC4由Ron Rivest在1987年设计,尽管它的命名看起来是第四版,实际上它是第一个对外发布的版本。

RC4算法的实施过程简洁明了,主要包括初始化和生成密钥流这两个阶段。

下面我们就一边解析算法,一边分析其代码实现。

初始化

该阶段的核心任务是利用一个可变长度的密钥来初始化一张S盒,即一个包含0至255所有字节的256长度数组。初始化步骤如下:

  • 初始填充S盒,按顺序排列0至255的数值。

  • 使用密钥对S盒进行置换。每个S盒中的元素都会根据密钥中的字节进行一定的交换。这个过程叫做密钥调度算法(KSA)。

说的形象一点就是:在桌子上有256个小盒子(从0到255编号),初始时每个盒子里面的数字和它的编号一样。现在,你开始根据密钥来交换这些盒子里面的数字,直到所有的盒子都被重新排列。

经过多轮置换,这256个数字的顺序就变得无规律。将此与洗牌对比,虽然结果看似随机,实则完全受密钥控制。

现在,我们来看一下代码实现:

private static void initAndPermute(char[] byteKey) {if (byteKey.length > 256 || byteKey.length < 1) {System.out.println("Key length must be between 1 to 256 chars");} else {// Creation of initial state and key byteskeylength = byteKey.length;for (int i = 0; i < 256; i++) {S[i] = i;K[i] = byteKey[i % keylength];}// Permuting state bytes based on values of key bytesint j = 0;for (int i = 0; i < 256; i++) {j = (j + S[i] + K[i]) % 256;int temp = S[i];S[i] = S[j];S[j] = temp;}}
}

第一个 for 循环里面,就是初始化 S 盒。我们还看到同时也给 K 数组赋值了,这里说明了一个问题,K 的长度大于 256 之后,后面的其实没用,所以我们的密钥不用写太长,除非写一个变种算法。

看第二个循环,j = (j + S[i] + K[i]) % 256; 我们把它看成一个数学表达式 j = f(i),这个表达式最终会生成一个 0-255 之间的一个数字 j,然后将 i 与 j 位置进行交换,这样就扰乱了 S 盒的数字顺序。

操作 (PRGA)

在操作阶段,RC4生成伪随机流,称为密钥流。这个密钥流会与明文按位异或来生成密文。同样,将密钥流与密文按位异或,可以得到原始明文。操作过程如下:

  • 初始化两个指针i和j(都开始于0)。

  • 在每次操作中,i递增1,j加上S盒在i位置的值,并使用新的j值来更新S盒中的元素位置。

  • 选取i和j指向的两个元素,将它们加起来,并根据这个总和得到S盒中的某个元素作为密钥流的一部分。

  • 重复此过程,直到生成了足够长的密钥流,可以与明文进行异或操作。

上面的步骤比较难以理解,但是我们利用数学的思想来看:

首先,定义两个变量 i 与 j,然后给它们赋值,i = f(i), j = f(i, j) ,然后再定义一个变量 key,key = f2(i, j) 。这个key就是根据 S 盒生成的密钥流,只要 S 的顺序固定,那么生成的密钥流就是固定的。有了密钥流,那么我们就可以与明文做异或操作。

看代码:

private static char[] encryptRC4(char[] plainText) {char[] cipherText = new char[plainText.length];int i = 0;int j = 0;int key;int plainTextLen = 0;while (plainTextLen < plainText.length) {// Key generationi = (i + 1) % 256;j = (j + S[i]) % 256;int temp = S[i];S[i] = S[j];S[j] = temp;key = S[(S[i] + S[j]) % 256];// EncryptioncipherText[plainTextLen] = (char) (plainText[plainTextLen] ^ key);plainTextLen++;}return cipherText;
}

有的小伙伴可能想得多一点,既然是使用异或做操作,那么加密算法其实就是解密算法!

是的,异或这个东西很神奇, x ^ y ^ y 还是 x。既然加密算法保证了 S 一定的情况下,生成的 key 是一样的,所以解密算法可以直接使用加密算法。

C 实现

#define N 256   // 2^8void swap(unsigned char *a, unsigned char *b) {int tmp = *a;*a = *b;*b = tmp;
}int KSA(char *key, unsigned char *S) {int len = strlen(key);int j = 0;for(int i = 0; i < N; i++)S[i] = i;for(int i = 0; i < N; i++) {j = (j + S[i] + key[i % len]) % N;swap(&S[i], &S[j]);}return 0;
}int PRGA(unsigned char *S, char *plaintext, unsigned char *ciphertext) {int i = 0;int j = 0;for(size_t n = 0, len = strlen(plaintext); n < len; n++) {i = (i + 1) % N;j = (j + S[i]) % N;swap(&S[i], &S[j]);int rnd = S[(S[i] + S[j]) % N];ciphertext[n] = rnd ^ plaintext[n];}return 0;
}int RC4(char *key, char *plaintext, unsigned char *ciphertext) {unsigned char S[N];KSA(key, S);PRGA(S, plaintext, ciphertext);return 0;
}

总结

RC4的好处是它很简单,很快,在没有密钥的情况下只能使用暴力破解。所以,你的密钥很重要,你得特别小心使用它。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/12012.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos7.8 迁移为 TencentOS Server 2.4(TK4) 报错解决

文章目录 一 问题二 解决三 注意 一 问题 CentOS 官方计划停止维护 CentOS Linux 项目&#xff0c;公司某台腾讯云的centos7.8服务器计划迁移为 TencentOS Server 2.4(TK4) 。在下载rpm包执行迁移命令后报错&#xff0c;场景还原如下。 首先 安装 Python 3 yum install -y p…

什么?免费使用GPT-4o?

⭐简单说两句⭐ ✨ 正在努力的小叮当~ &#x1f496; 超级爱分享&#xff0c;分享各种有趣干货&#xff01; &#x1f469;‍&#x1f4bb; 提供&#xff1a;模拟面试 | 简历诊断 | 独家简历模板 &#x1f308; 感谢关注&#xff0c;关注了你就是我的超级粉丝啦&#xff01; &a…

[Algorithm][多源BFS][矩阵][飞地的数量][地图中的最高点][地图分析] + 多源BFS原理讲解 详细讲解

目录 0.原理讲解1.矩阵1.题目链接2.算法原理详解3.代码实现 2.飞地的数量1.题目链接2.算法原理详解3.代码实现 3.地图中的最高点1.题目链接2.算法原理详解3.代码实现 4.地图分析1.题目链接2.算法原理详解3.代码实现 0.原理讲解 注意&#xff1a;只要是用**BFS解决的最短路径问题…

Apache SeaTunnel在世界级银行巨头JP Morgan 内部的应用实践

作者系 JP Morgan 大数据工程师&#xff0c;文章内容来源于[DET 网络研讨会] 与 Apache SeaTunnel 的数据集成&#xff1a;https://www.youtube.com/watch?vln4mn6vLenc&#xff08;有兴趣的同学可以观看演讲&#xff09; 文章介绍了他任职期间使用 Apache SeaTunnel 优化数据…

基础模型的工具学习:综述

23年6月清华、人大、UIUC、纽约大学、北邮和CMU等的论文“Tool Learning with Foundation Models”。 人类拥有创造和利用工具的非凡能力&#xff0c;使他们能够克服物理限制并探索新领域。随着最近强大的基础模型的出现&#xff0c;人工智能系统有可能像人类一样熟练地使用工…

实践指南:如何将 SpringBoot 项目无缝部署到 Tomcat 服务器

序言 SpringBoot 是一个用来简化 Spring 应用初始搭建以及开发过程的框架&#xff0c;我们可以通过内置的 Tomcat 容器来轻松地运行我们的应用。但在生产环境中&#xff0c;我们可能需要将应用部署到独立的 Tomcat 服务器上。本文给大家介绍 SpringBoot 项目部署到独立 Tomcat…

三:哈希map day6 哈希表理论基础 ● 242.有效的字母异位词 ● 349. 两个数组的交集 ● 202. 快乐数● 1. 两数之和

今日任务 ● 哈希表理论基础 ● 242.有效的字母异位词 ● 349. 两个数组的交集 ● 202. 快乐数 ● 1. 两数之和 今日任务 242.有效的字母异位词 题目 大型概括&#xff1a;map 的使用 1.题目描述-->思路&#xff1a; 给出两个string s,t; …

Android Update Engine 分析(二十九)如何进行连续多个版本的升级?

本文为洛奇看世界(guyongqiangx)原创,转载请注明出处。 原文链接:https://blog.csdn.net/guyongqiangx/article/details/138849767 0. 背景 关于如何连续进行多个版本升级,这是一个很常见的需求,也是 OTA 讨论群里试不试就会讨论的一个话题。 例如,昨天一个小伙伴在群里…

a-auto-complete 请求后端数据做模糊查询,解决下拉框选择选不上,不回显的问题

a-auto-complete 请求后端数据做模糊查询&#xff0c;解决下拉框选择选不上&#xff0c;不回显的问题 记录一个a-auto-complete卡bug卡了两天&#xff0c;找不到哪里的问题下拉框选择选不上&#xff0c;不回显&#xff0c;最后终于解决了。 我还对下拉框显示的内容做了小调整。…

越来越真的Deepfake再次引起网安界的关注

当地时间5月6日&#xff0c;全球网络安全领域最受关注的年度盛会 RSAC 2024在美国旧金山隆重开幕。当天&#xff0c;被誉为“安全圈奥斯卡”的创新沙盒大赛也决出了冠军&#xff0c;Reality Defender凭借其创新性的深度伪造&#xff08;Deepfake&#xff09;检测平台摘得桂冠&a…

【漏洞复现】泛微OA E-Cology users.data信息泄露漏洞

漏洞描述&#xff1a; 泛微OA E-Cology是一款面向中大型组织的数字化办公产品&#xff0c;它基于全新的设计理念和管理思想&#xff0c;旨在为中大型组织创建一个全新的高效协同办公环境。泛微OA E-Cology users.data存在敏感信息泄露漏洞&#xff0c;攻击者利用此漏洞可以获取…

Excel 根据包含的关键词将指定列按关键词指定顺序排列

例题描述和简单分析 有 Excel 文件&#xff0c;数据如下所示&#xff1a; AB1Parent ColumnModifier (Column)2Jack lives in the villageRose3As mentioned by jackVillage4Rose already spoke to jack about last nightJack5Rose left the village6rose was their yesterda…

DigitalOcean 应用托管更新:应用端到端运行时性能大幅改进

DigitalOcean 希望可以为企业提供所需的工具和基础设施&#xff0c;以帮助企业客户加速云端的开发&#xff0c;实现业务的指数级增长。为此 DigitalOcean 在 2020 年就推出了App Platform。 App Platform&#xff08;应用托管&#xff09; 是一个完全托管的 PaaS 解决方案&…

ubuntu下使用docker安装kafka

1.先安装zookeeper docker run -d --restartalways -e ALLOW_ANONYMOUS_LOGINyes --log-driver json-file --log-opt max-size100m --log-opt max-file2 --name zookeeper -p 2181:2181 -v /etc/localtime:/etc/localtime bitnami/zookeeper:latest 2.安装kafka docker run…

Docker 的 Ubuntu 操作系统镜像

Debian 和 Ubuntu 都是目前较为流行的 Debian 系列 的服务器操作系统&#xff0c;十分适合研发场景。 Debian 和 Ubuntu 属于同一系列的发行版。Debian 是由 Ian Murdock 在 1993 年创建的最初的发行版。Ubuntu 是 Mark Shuttleworth 在 2004 年基于 Debian 创建的发行版。 Li…

2024 National Invitational of CCPC (Zhengzhou)(CCPC郑州邀请赛暨CCPC河南省赛)

2024 National Invitational of CCPC (Zhengzhou) 2024CCPC郑州邀请赛暨CCPC河南省赛 2024 National Invitational of CCPC (Zhengzhou) B. 扫雷 1 题意&#xff1a;扫n轮雷&#xff0c;每轮开始获得一枚扫雷币&#xff0c;可保存&#xff0c;从第一轮开始&#xff0c;可以…

STM32 CANFD 基础知识留档

讲得比较细的文章但可能有问题自行判定 附1 附2 前言 CAN2.0 协议中数据段波特率和仲裁段波特率默认是一致&#xff0c;因此只需要关注传输波特率即可 CANFD 协议是向下兼容 CAN2.0 的数据通讯&#xff0c;因此实际使用中需要配置 STM32H7 系列支持的标准是 Compliant with …

大语言模型中上下文长度扩展技术的内容、原因和方式-综述

24年1月阿联酋科技创新研究院、孟加拉国伊斯兰科技大学、斯坦福大学、亚马逊公司和南卡大学AI研究院的论文“The What, Why, and How of Context Length Extension Techniques in Large Language Models – A Detailed Survey“。 LLM通常面临上下文长度外推方面的限制。 理解…

C++11 线程池:轻量级高并发解决方案

C11 线程池&#xff1a;轻量级高并发解决方案 线程池&#xff08;Thread Pool&#xff09;是一种线程管理的机制&#xff0c;它包含了多个预先创建的线程&#xff0c;用于执行多个任务&#xff0c;这些任务被放入任务队列中等待执行。 满足我们的生产者和消费者模型。 线程…

一文带你快速了解GPT-4o!内含免费使用指南!

一、GPT-4o简介 北京时间5月14日&#xff0c;OpenAI举行春季发布会。OpenAI在活动中发布了新旗舰模型“GPT-4o”&#xff01;据OpenAI首席技术官穆里穆拉蒂&#xff08;Muri Murati&#xff09;介绍&#xff0c;GPT-4o在继承GPT-4强大智能的同时&#xff0c;进一步提升了文本、…