常见加解密算法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.rhkb.cn/news/328390.html

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

相关文章

uniapp高性能图片裁剪插件,可添加水印

效果图&#xff1a; 插件地址&#xff1a;高性能图片裁剪&#xff0c;裁剪图片后自动添加水印 - DCloud 插件市场 示例&#xff1a; <template> <view><button click"select">选择图片</button><image mode"widthFix" :src&qu…

Java—如何判断两个浮点数相等

结论 一旦有浮点型数据参与运算的结果&#xff0c;一定不要使用 “ ” 与其比较。 提出问题 我们知道在Java中浮点数float 和 double 的值不能很精准的表示一个小数&#xff0c;因为会有精度损失。 下面来看一个例子&#xff1a; public class FloatTest {public static …

在Linux系统上使用nmcli命令配置各种网络(有线、无线、vlan、vxlan、路由、网桥等)

前言&#xff1a;原文在我的博客网站中&#xff0c;持续更新数通、系统方面的知识&#xff0c;欢迎来访&#xff01; 在Linux系统上使用nmcli命令配置各种网络&#xff08;有线、无线、vlan、vxlan等&#xff09;https://myweb.myskillstree.cn/123.html 更新于2024/5/13&…

基于SpringBoot的竹宣非遗宣传网站

摘要 随着互联网的普及和数字化时代的到来&#xff0c;竹编等非物质文化遗产的保护与传承面临新的机遇和挑战。该研究旨在使用SpringBoot后端框架与Vue前端框架&#xff0c;构建一个竹编非遗宣传网站&#xff0c;通过丰富的展示形式和交互体验&#xff0c;提升公众对竹编这一非…

[牛客网]——C语言刷题day2

答案&#xff1a;B 解析&#xff1a; char *p[10] 是指针数组,数组里存放了10个指针,在64位系统下指针占8个字节,所以sizeof(p) 10 * 8 80. char (*p1)[10]是数组指针,p1是一个指向存放10个char类型的数组的指针,所以sizeof(p1) 8. 答案&#xff1a;B 解析&#xff1a…

asp.net 齿轮加工车间生产管理系统-计算机毕业设计源码56014

摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;在现实运用中&#xff0c;为方便用户能够可以随时进行在线…

Altium Designer封装库和元器件符号库下载与导入教程(SnapEDA 、Ultra Librarian、Alldatasheetcn)

1.AD封装库和元器件符号库下载网址 以下是一些全球热门的Altium Designer封装库和元器件符号库下载网址推荐&#xff1a; Altium Content Vault (现称为Altium Manufacturer Part Search)&#xff1a;这是Altium官方提供的元器件库&#xff0c;可以直接在Altium Designer中使用…

第 397 场 LeetCode 周赛题解

A 两个字符串的排列差 模拟&#xff1a;遍历 s s s 记录各字符出现的位置&#xff0c;然后遍历 t t t 计算排列差 class Solution {public:int findPermutationDifference(string s, string t) {int n s.size();vector<int> loc(26);for (int i 0; i < n; i)loc[s…

【2024华为HCIP831 | 高级网络工程师之路】刷题日记(18)

个人名片&#xff1a;&#x1faaa; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&a…

libsndfile读取wav文件基本属性

本文的目的是提供一种方法读取wav文件的基本属性&#xff1a;音频帧数&#xff0c;格式、通道数和采样率信息。 代码如下所示&#xff1a; #include <iostream> #include <QDebug> #include "sndfile.h"using namespace std;int main() {// 初始化 ALS…

如何安全高效地进行分公司文件下发?

确保分公司文件下发过程中的保密性和安全性&#xff0c;是企业信息安全管理的重要组成部分。以下是一些关键步骤和最佳实践&#xff1a; 权限管理&#xff1a;确保只有授权的人员可以访问文件。使用权限管理系统来控制谁可以查看、编辑或下载文件。 加密传输&#xff1a;在文…

国际化日期(inti)

我们可以使用国际化API自动的格式化数字或者日期&#xff0c;并且格式化日期或数字的时候是按照各个国家的习惯来进行格式化的&#xff0c;非常的简单&#xff1b; const now new Date(); labelDate.textContent new Intl.DateTimeFormat(zh-CN).format(now);比如说这是按照…

Isaac Sim 4 键盘控制小车前进方向(学习笔记5.8.2)

写的乱糟糟&#xff0c;主要是这两周忘了记录了...吭哧吭哧往下搞&#xff0c;突然想起来要留档&#xff0c;先大致写一个&#xff0c;后面再往里添加和修改吧&#xff0c;再不写就全忘了 有一个一直没解决的问题&#xff1a; 在保存文件时出现问题&#xff1a;isaac sim mism…

LabVIEW MEMS电容式压力传感器测试系统

LabVIEW MEMS电容式压力传感器测试系统 随着微电子技术的发展&#xff0c;MEMS&#xff08;微电机系统&#xff09;技术在各个领域得到了广泛应用。MEMS电容式压力传感器以其高灵敏度、小尺寸、低功耗等优点&#xff0c;在微传感器领域占据了重要的地位。然而&#xff0c;这些…

《海峡科技与产业》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问&#xff1a;《海峡科技与产业》期刊是什么级别&#xff1f; 答&#xff1a;国家级 主管单位&#xff1a;中华人民共和国科学技术部 主办单位&#xff1a;科技部海峡两岸科学技术交流中心 问&#xff1a;《海峡科技与产业》影响因子&#xff1f; 答&#xff1a;…

维护表空间中的数据文件

目录 向表空间中添加数据文件 从表空间中删除数据文件 删除users表空间中的users02.dbf数据文件 对数据文件的自动扩展设置 Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 维护表空间中的数据文件主要包括向表空间中添…

非模块化 Vue 开发的 bus 总线通信

个人感觉&#xff0c;JavaScript 非模块开发更适合新人上手&#xff0c;不需要安装配置一大堆软件环境&#xff0c;不需要编译&#xff0c;适合于中小项目开发&#xff0c;只需要一个代码编辑器即可开发&#xff0c;例如 vsCode。网页 html 文件通过 script 标签引入 JavaScrip…

机器学习入门介绍

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 目录 三大方向机器学习产生的原因机器如何学习…

Spring MVC(三) 参数传递

1 Controller到View的参数传递 在Spring MVC中&#xff0c;把值从Controller传递到View共有5中操作方法&#xff0c;分别是。 使用HttpServletRequest或HttpSession。使用ModelAndView。使用Map集合使用Model使用ModelMap 使用HttpServletRequest或HttpSession传值 使用HttpSe…

2024最新洗地机推荐,洗地机怎么选?热门品牌哪个最好用?

在现代生活中&#xff0c;忙碌的日常让家庭清洁变得更加繁重和耗时。然而&#xff0c;洗地机的引入彻底改变了这一状况。凭借其强大的清洁效果和简便的使用方式&#xff0c;洗地机能够迅速清除地面上的各种污垢&#xff0c;使清洁工作变得轻松自如。正因为如此&#xff0c;洗地…