当前位置: 首页 > news >正文

常见加解密算法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的好处是它很简单,很快,在没有密钥的情况下只能使用暴力破解。所以,你的密钥很重要,你得特别小心使用它。

相关文章:

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

RC4是一种广泛使用的流密码&#xff0c;它以其简洁和速度而闻名。区别于块密码&#xff0c;流密码特点在于按位或按字节来进行加密。 RC4由Ron Rivest在1987年设计&#xff0c;尽管它的命名看起来是第四版&#xff0c;实际上它是第一个对外发布的版本。 RC4算法的实施过程简洁…...

如何使用 ERNIE 千帆大模型基于 Flask 搭建智能英语能力评测对话网页机器人(详细教程)

ERNIE 千帆大模型 ERNIE-3.5是一款基于深度学习技术构建的高效语言模型&#xff0c;其强大的综合能力使其在中文应用方面表现出色。相较于其他模型&#xff0c;如微软的ChatGPT&#xff0c;ERNIE-3.5不仅综合能力更强&#xff0c;而且在训练与推理效率上也更高。这使得ERNIE-3…...

Java全局异常处理,@ControllerAdvice异常拦截原理解析【简单易懂】

https://www.bilibili.com/video/BV1sS411c7Mo 文章目录 一、全局异常处理器的类型1-1、实现方式一1-2、实现方式二 二、全局异常拦截点2-1、入口2-2、全局异常拦截器是如何注入到 DispatcherServlet 的 三、ControllerAdvice 如何解析、执行3-1、解析3-2、执行 四、其它4-1、设…...

代码随想录35期Day38-Java(Day37休息)

Day38题目 LeetCode509.斐波那契数列 核心思想:很简单dp[i]dp[i-1]dp[i-2].这里用了数组存储的形式,也可以递归 class Solution {public int fib(int n) {int[] dp new int[n2];dp[0] 0;dp[1] 1;for(int i 2 ; i < n ; i ){dp[i] dp[i-1] dp[i-2];}return dp[n];} …...

力扣HOT100 - 739. 每日温度

解题思路&#xff1a; 单调栈 class Solution {public int[] dailyTemperatures(int[] temperatures) {int length temperatures.length;int[] ans new int[length];Deque<Integer> stack new LinkedList<>();for (int i 0; i < length; i) {int temperatu…...

【爬虫之scrapy框架——尚硅谷(学习笔记one)--基本步骤和原理+爬取当当网(基本步骤)】

爬虫之scrapy框架——基本原理和步骤爬取当当网&#xff08;基本步骤&#xff09; 下载scrapy框架创建项目&#xff08;项目文件夹不能使用数字开头&#xff0c;不能包含汉字&#xff09;创建爬虫文件&#xff08;1&#xff09;第一步&#xff1a;先进入到spiders文件中&#x…...

C++ QT设计模式:责任链模式

基本概念 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;将请求沿着处理链传递&#xff0c;直到有一个对象能够处理为止。 实现的模块有&#xff1a; Handler&#xff08;处理者&#xff09;&#xff1a;定义一个处理…...

基于springboot+mybatis+vue的项目实战之(后端+前后端联调)

步骤&#xff1a; 1、项目准备&#xff1a;创建数据库&#xff08;之前已经创建则忽略&#xff09;&#xff0c;以及数据库连接 2、建立项目结构文件夹 3、编写pojo文件 4、编写mapper文件&#xff0c;并测试sql语句是否正确 5、编写service文件 6、编写controller文件 …...

【教程向】从零开始创建浏览器插件(六)实战篇

【教程向】从零开始创建浏览器插件(六)实战篇 在这篇文章中,我们将详细介绍一个名为“摸鱼King”的Chrome扩展程序的开发思路。这个扩展程序的主要功能是在用户浏览网页时提供便捷的方式来摸鱼看小说。 完整的工程我放在了完整工程,可以下载下来自己试一试。 1. 主要功能…...

如何用 OceanBase做业务开发——【DBA从入门到实践】第六期

当应用一款新的数据库时&#xff0c;除了基础的安装部署步骤&#xff0c;掌握其应用开发方法才是实现数据库价值的关键。为此&#xff0c;我们特别安排了5月15日&#xff08;周三&#xff09;的《DBA 从入门到实践》第六期课程——本次课程将带大家了解OceanBase数据库的开发流…...

Element-UI快速入门

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c…...

【JavaWeb】网上蛋糕商城后台-商品管理

概念 本文讲解和实现网上蛋糕商城的后台管理系统中的商品管理功能。 商品列表 点击后台管理系统的head.jsp头部的“商品管理”功能选项&#xff0c;向服务器发送请求/admin/goods_list 因此需要在servlet包中创建AdminGoodsListServlet类&#xff0c;用于获取商品信息列表 …...

Django Admin后台管理:高效开发与实践

title: Django Admin后台管理&#xff1a;高效开发与实践 date: 2024/5/8 14:24:15 updated: 2024/5/8 14:24:15 categories: 后端开发 tags: DjangoAdmin模型管理用户认证数据优化自定义扩展实战案例性能安全 第1章&#xff1a;Django Admin基础 1.1 Django Admin简介 Dj…...

Centos7网卡启动失败(Failed to start LSB: Bring up/down)

好雨知时节 当春乃发生 随风潜入夜 润物细无声 报错内容 启动虚拟机时&#xff0c;Ceotos的虚拟网卡没有一起启动&#xff0c;导致服务无法正常使用 查询网络启动状态 systemctl status network.service报Failed to start LSB: Bring up/down 查看网络启动日志 journalctl…...

【NOIP2008普及组复赛】 题4:立体图

题4&#xff1a;立体图 【题目描述】 小渊是个聪明的孩子&#xff0c;他经常会给周围的小朋友讲些自己认为有趣的内容。最近&#xff0c;他准备给小朋友讲解立体图&#xff0c;请你帮他画出立体图。 小渊有一块面积为mn的矩形区域&#xff0c;上面有mn个边长为1的格子&#…...

【Leetcode每日一题】 动态规划 - 简单多状态 dp 问题 - 删除并获得点数(难度⭐⭐)(76)

1. 题目解析 题目链接&#xff1a;LCR 091. 粉刷房子 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 1. 状态定义 在解决这类问题时&#xff0c;我们首先需要根据题目的具体要求来定义状态。针对房屋粉刷问题&#…...

Windows---CMD常用指令大全

CMD是什么&#xff1f; Windows操作系统中的命令行界面程序&#xff0c;全称为命令提示符 CMD可以干什么&#xff1f; 允许用户在文本界面下输入命令来执行各种操作&#xff0c;如文件管理、系统设置、软件安装等 帮助用户更好地控制和管理Windows系统 windows系统CMD指…...

消息中间件是什么?有什么用?常见的消息中间件有哪些?

1.什么是消息中间件&#xff1f; 消息中间件基于队列模型在网络环境中为应用系统提供同步或异步、可靠的消息传输的支撑性软件系统。 2.现实中的痛点&#xff1a; 1.Http请求基于请求与响应的模型&#xff0c;在高并发的情况下&#xff0c;客户端发送大量的请求达到服务器端…...

富锂锰基材料极具发展潜力 我国产业化进程加速

富锂锰基材料极具发展潜力 我国产业化进程加速 富锂锰基材料以锰元素为主&#xff0c;我国锰资源较丰富&#xff0c;相比于铁锂材料、高镍三元材料&#xff0c;富锂锰基材料具有一定的降本潜力。此外富锂锰基材料在能量密度、充放电倍率等方面也具有明显优势。富锂锰基材料是富…...

聚水潭和金蝶云星空单据接口对接

聚水潭和金蝶云星空单据接口对接 对接系统&#xff1a;金蝶云星空 金蝶K/3Cloud&#xff08;金蝶云星空&#xff09;是移动互联网时代的新型ERP&#xff0c;是基于WEB2.0与云技术的新时代企业管理服务平台。金蝶K/3Cloud围绕着“生态、人人、体验”&#xff0c;旨在帮助企业打造…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...