RC4加解密源码

本文介绍RC4加解密源码。

RC4(来自Rivest Cipher 4的缩写)是一种流加密算法,密钥长度可变。它加解密使用相同的密钥,因此也属于对称加密算法。RC4具有加解密速度快,算法简单等优点,在算力不高场合(MCU)也可以使用。

1.源码

1)头文件

头文件(rc4.h)主要包括RC4相关数据结构定义及外部函数声明。头文件定义如下。

#ifndef __RC4_H
#define __RC4_H#ifdef __cplusplusextern "C" {
#endif typedef struct _RC4_INFO
{uint8_t s[256];uint8_t t[256];
}RC4_INFO;     extern void rc4_init(RC4_INFO *RC4Info, const uint8_t *key, uint32_t len);
extern void rc4_crypt(RC4_INFO *RC4Info, const uint8_t *input, uint8_t *output, uint32_t len);    #ifdef __cplusplus
}
#endif#endif

注意

a)加密过程,需要先调用rc4_init()函数,再调用rc4_crypt()函数,同样,解密过程,也需要先调用rc4_init()函数,再调用rc4_crypt()函数。加解密使用的是同一个密钥。

b)密钥长度可变,一般为8-256 bits。

2)源文件

源文件(rc4. c)主要包括RC4相关外部函数定义。源文件定义如下。

#include "rc4.h"static void swap(uint8_t *p1, uint8_t *p2);void rc4_init(RC4_INFO *RC4Info, const uint8_t *key, uint32_t len)
{uint32_t i = 0;uint32_t j = 0;if ((RC4Info == NULL) || (key == NULL) || (len == 0)){return ;}//Initial values of both vectorsfor (i = 0; i < 256; i++){RC4Info->s[i] = (uint8_t)i;RC4Info->t[i] = key[i % len];}//Initial permutationfor (i = 0; i < 256; i++){j = (j + RC4Info->s[i] + RC4Info->t[i]) % 256;swap(&RC4Info->s[i], &RC4Info->s[j]);}
}void rc4_crypt(RC4_INFO *RC4Info, const uint8_t *input, uint8_t *output, uint32_t len)
{uint32_t i = 0;uint8_t t1 = 0;uint8_t t2 = 0;uint8_t val = 0;uint8_t out = 0;if ((RC4Info == NULL) || (input == NULL) || (output == NULL) || (len == 0)){return ;}//process one byte at a timefor (i = 0; i < len; i++){t1 = (t1 + 1) % 256;t2 = (t2 + RC4Info->s[t1]) % 256;swap(&RC4Info->s[t1], &RC4Info->s[t2]);val = (RC4Info->s[t1] + RC4Info->s[t2]) % 256;out = *input++ ^ RC4Info->s[val];*output++ = out;}
}static void swap(uint8_t *p1, uint8_t *p2)
{uint8_t t = 0;if ((p1 == NULL) || (p2 == NULL)){return ;}t = *p1;*p1 = *p2;*p2 = t;
}

2.测试

这里主要测试加解密过程。

int main()
{RC4_INFO RC4Info;uint8_t key[] = {0x03, 0x01, 0x02, 0x03, 0x04, 0x08, 0x09, 0x1a};uint8_t data[] = {0x03, 0x04, 0x08, 0x09, 0xa5, 0x5a, 0x33, 0x22, 0x88};uint8_t encrypt[256] = {0};uint8_t decrypt[256] = {0};uint32_t i = 0;printf("raw data:\r\n");for (i = 0; i < sizeof(data) / sizeof(data[0]); i++){printf("0x%x ", data[i]);}printf("\r\n");//encryptrc4_init(&RC4Info, key, sizeof(key) / sizeof(key[0]));rc4_crypt(&RC4Info, data, encrypt,  sizeof(data) / sizeof(data[0]));printf("encrypt data:\r\n");for (i = 0; i < sizeof(data) / sizeof(data[0]); i++){printf("0x%x ", encrypt[i]);}printf("\r\n");//decryptrc4_init(&RC4Info, key, sizeof(key) / sizeof(key[0]));rc4_crypt(&RC4Info, encrypt, decrypt,  sizeof(data) / sizeof(data[0]));printf("decrypt data:\r\n");for (i = 0; i <  sizeof(data) / sizeof(data[0]); i++){printf("0x%x ", decrypt[i]);}printf("\r\n");return 0;
}

输出结果:

总结,本文介绍了RC4加解密源码。

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

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

相关文章

C++输入与输出

C 中的输入与输出主要通过标准输入输出流实现。以下是一些基本示例代码&#xff0c;演示了如何使用 cin 来输入变量的值&#xff0c;并使用 cout 来输出变量的值。 输入变量的值 #include <iostream> using namespace std;int main() {int number;cout << "…

用重建大师时,在主服务器建了一个快捷方式,给局域网其他电脑开了权限,其他电脑能正常访问主服务器数据吗?

答&#xff1a;可以的&#xff0c;重建大师支持集群方式。数据放在服务器文件夹das&#xff0c;在主服务器读取数据建立了一个快捷方式&#xff0c;这个快捷方式给局域网其他电脑开了权限&#xff0c;其他电脑是可以通过快捷方式正常访问主服务器数据的。 重建大师是一款专为超…

昇腾910b部署Chatglm3-6b进行流式输出【pytorch框架】NPU推理

文章目录 准备阶段避坑阶段添加代码结果展示 准备阶段 配套软件包Ascend-cann-toolkit和Ascend-cann-nnae适配昇腾的Pytorch适配昇腾的Torchvision Adapter下载ChatGLM3代码下载chatglm3-6b模型&#xff0c;或在modelscope里下载 避坑阶段 每个人的服务器都不一样&#xff0…

Pixart PAR2861 蓝牙 keyboard 开发笔记

Pixart PAR2861 是一款采用32 bits ARM Cortex-M0 低功耗、高效能 2.4GHz RF 的 SoC。 该 SoC 整合了高效能的 2.4GHz RF 收发器、硬体Keyscan、硬体按键防弹跳、SPI、I2C、PWM LED、ADC、UART等。内建 DC/DC 转换器和 LDO 为独立 HID 应用提供完整的低功耗 SoC 解决方案。 1.…

2023年网络安全事件处罚盘点,文件销毁 硬盘销毁 物料销毁

《中华人民共和国网络安全法》是我国第一部全面规范网络空间安全管理方面问题的基础性法律&#xff0c;是我国网络空间法治建设的重要里程碑&#xff0c;《中华人民共和国网络安全法》从2013年下半年提上日程&#xff0c;到2016年年底颁布&#xff0c;自2017年6月1日起施行&…

已解决java.lang.ReflectiveOperationException异常的正确解决方法,亲测有效!!!

已解决java.lang.ReflectiveOperationException异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 文章目录 问题分析 报错原因 解决思路 解决方法 总结 问题分析 ReflectiveOperationException是Java反射操作中可能抛出的多种异常的父类。 …

滑动登陆注册同页面

这是一个登陆注册在同一个页面滑动选择的页面 技术&#xff1a;html、css、javascript 简单页面实现&#xff08;为了方便&#xff0c;已将代码放在同一文件引用&#xff09;&#xff1a; 1.1、效果图 1.2、完整代码&#xff1a; <!DOCTYPE html> <html lang"…

代码进阶-代码注意事项总结

前言:敲了很多代码了&#xff0c;简单总结一下&#xff0c;代码中让代码运行更好的技巧 多写日志信息&#xff0c;检测到参数和可能出现的异常 多写校验&#xff0c;防止出现一些不可控的输入 不可控的输入包括 模糊查询 的关键字 例如 % _ 或者其他的sql相关的关键字和符号…

virtualbox Ubuntu 网络连接

一、网络连接需求1—— 上网&#xff1a; 虚拟机默认的NAT连接方式&#xff0c;几乎不需要怎么配置&#xff0c;即可实现上网。 enp0s17以太网必须要开启&#xff0c;才能上网&#xff1b; 但是主机ping不通虚拟机&#xff0c;貌似可以ping 127.0.0.1; 二、主机和虚拟机相互p…

《Vite 基础知识》使用 Glob 动态加载 .vue 文件

前言 开发基于 Vite Vue3 的组件库&#xff0c;多个 .vue 文件需要动态加载&#xff01; 注意 import.meta.globEager 已经弃用&#xff0c;请使用 import.meta.glob 来代替&#xff01; 使用 Glob 异步方式 代码第 1 行&#xff0c;注意使用两个 **&#xff0c;匹配当前目…

语境化语言表示模型-ELMO、BERT、GPT、XLnet

一.语境化语言表示模型介绍 语境化语言表示模型&#xff08;Contextualized Language Representation Models&#xff09;是一类在自然语言处理领域中取得显著成功的模型&#xff0c;其主要特点是能够根据上下文动态地学习词汇和短语的表示。这些模型利用了上下文信息&#xf…

医院患者满意度调查方法有哪些?

医院患者满意度调查可以使用多种方法来收集患者的反馈和意见。以下是一些常见的医院患者满意度调查方法&#xff1a; 在线调查问卷&#xff1a;这是一种常见的调查方法&#xff0c;患者可以在电脑、平板电脑或智能手机上填写问卷。在线问卷通常易于分发和收集&#xff0c;可以…

DrGraph原理示教 - OpenCV 4 功能 - 形态操作

形态类型 从OpenCV图像处理基本知识来看&#xff0c;膨胀腐蚀操作后&#xff0c;还有形态操作&#xff0c;如开运算、闭运算、梯度、礼帽与黑帽&#xff0c;感觉很多&#xff0c;其实&#xff0c;本质上就是批处理操作&#xff0c;如 开运算&#xff1a;先腐蚀&#xff0c;再膨…

大模型LLM Agent在 Text2SQL 应用上的实践

1.前言 在上篇文章中「如何通过Prompt优化Text2SQL的效果」介绍了基于Prompt Engineering来优化Text2SQL效果的实践&#xff0c;除此之外我们还可以使用Agent来优化大模型应用的效果。 本文将从以下4个方面探讨通过AI Agent来优化LLM的Text2SQL转换效果。 1 Agent概述2 Lang…

deepseed 单机多卡程序报错:exits with return code -7

现象&#xff1a;exits with return code -7原因&#xff1a;Setting the shm-size to a large number instead of default 64MB when creating docker container solves the problem in my case. It appears that multi-gpu training relies on the shared memory. ref 排查是…

肯尼斯·里科《C和指针》第6章 指针(3)

肯尼斯里科《C和指针》第6章 指针&#xff08;1&#xff09;-CSDN博客 肯尼斯里科《C和指针》第6章 指针&#xff08;2&#xff09;-CSDN博客 前置知识&#xff1a;左值右值 为了理解有些操作符存在的限制&#xff0c;必须理解左值(L-value)和右值(R-value)之间的区别。这两个…

2024年百场进校公益安全培训开启

自2023年年底&#xff0c;上海风暴救援队积极策划并推动了2024年的“百场进校传安全”培训项目。经过在东方锦绣于2023年12月14日、上钢新村幼儿园于2023年12月28日的先期测试&#xff0c;项目于2024年1月5日在齐河路幼儿园正式启动。随后&#xff0c;于2024年1月11日在浦南幼儿…

顺序表和链表基础

定义动态的顺序表 typedef int SLDataType; typedef struct Seqlist {SLDataType* array;size_t size;size_t capacity; }Seqlist; 在顺序表中插入数据 bool ListInsert(Seqlist* l, int i, SLDataType e) {if (i < 1 || i > l->capacity)return false;int j;for (…

【大数据进阶第三阶段之Hue学习笔记】Hue的安装和使用

1、 Hue的安装 1.1 上传解压安装包 Hue的安装支持多种方式&#xff0c;包括rpm包的方式进行安装、tar.gz包的方式进行安装以及cloudera manager的方式来进行安装等&#xff0c;我们这里使用tar.gz包的方式来进行安装 Hue的压缩包的下载地址&#xff1a; http://archive.cloude…

torch.cat()函数的理解

torch.cat() 是 PyTorch 中的一个函数&#xff0c;用于在指定的维度上连接&#xff08;concatenate&#xff09;张量&#xff08;tensors&#xff09;。它的功能是将多个张量沿着指定的维度拼接在一起。 函数签名如下&#xff1a; torch.cat(tensors, dim0, *, outNone) ->…