RC4算法实现

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

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

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

 4、密钥K:长度为1-256字节,注意密钥的长度 keylen 与明文长度、密钥流的长度没有必然关系,通常密钥的长度取为16字节(128比特)。

5、算法实现

//rc4.h  
template<class T> inline void  
swap(T& i, T& j)  
{  T tmp = i;  i = j;  j = tmp;  
}  
class RC4  
{  
public:  void SetKey(const char* key, int keylen);  void Transform(char* output, const char* input, int len);  
private:  unsigned char key_[256];  
};  
/  
//rc4.cc  
#include "rc4.h"  
void RC4::SetKey(const char* key, int keylen)  
{  for (int i = 0; i < 256; i++)  {  key_[i] = i;  }  int j = 0;  for (int i = 0; i < 256; i++)  {  j = (j + key_[i] + key[i%keylen]) % 256;  swap(key_[i], key_[j]);  }  
}  
void RC4::Transform(char* output, const char* input, int len)  
{  int i = 0, j = 0;  for (int k = 0; k < len; k++)  {  i = (i + 1) % 256;  j = (j + key_[i]) % 256;  swap(key_[i], key_[j]);  unsigned char subkey = key_[(key_[i] + key_[j]) % 256];  output[k] = subkey ^ input[k];  }  
}  
/  
//main.cc  
#include <stdio.h>  
#include <string.h>  
#include <stdlib.h>  
#include "rc4.h"  
int main()  
{  char input[256] = "Times teaches all things to him who lives forever but I have not the luxury of eternity.";  char output[256] = "";  printf("before encrypt:%s/n", input);  const int keylen = 16;  char key[keylen] = "";  for (int i = 0; i < keylen; i++)  {  key[i] = rand() % 256;  }  RC4 rc4encrypt, rc4decrypt;  rc4encrypt.SetKey(key, keylen);  rc4decrypt.SetKey(key, keylen);  rc4encrypt.Transform(output, input, strlen(input));  printf("after encrypt: %s/n", output);  rc4decrypt.Transform(output, output, strlen(input));  printf("after decrypt: %s/n", output);  return 0;  
}  

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

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

相关文章

模拟网页行为之实践四

这篇谈下c如何hook网页中的JS函数&#xff0c;即网页可以执行我们修改的JS函数。 相应的步骤可分为&#xff1a; 1.找到需要修改函数的时机。 2.得到需要修改函数的com对象。 3.将我们新的com对象替换修改函数。 第一步&#xff0c;找到需要修改函数的时机&#xff0c;在谈…

SHA-256算法实现

SHA-256 算法输入报文的最大长度不超过2^64 bit&#xff0c;输入按512-bit 分组进行处理&#xff0c;产生 的输出是一个256-bit 的报文摘要。该算法处理包括以下几步&#xff1a; STEP1&#xff1a;附加填充比特。对报文进行填充使报文长度与448 模512 同余&#xff08;长度…

RSA算法演绎

RSA是第一个也是使用的最广发的公钥加密算法&#xff0c;在1978年由R.Rivest、AdiShamir和Adleman三人发明&#xff0c;并以他们的名字命名。RSA算法的安全性基于大数因子分解的困难性&#xff0c;下面介绍一下它的基本原理&#xff1a; 1、生成公钥和私钥 (1) 选取两个大素数…

分数的乘法逆元和负数的取模运算

1.乘法逆元 A.定义 如果ax≡1 (mod p),且gcd(a,p)1&#xff08;a与p互质&#xff09;&#xff0c;则称a关于模p的乘法逆元为x。 既然有ax≡1 (mod p)&#xff0c;那么有ax - py 1,x是a关于模p的乘法逆元。 B.分数的乘法逆元 对于实数域&#xff0c;一个数的乘法逆元就是其倒数…

ecc算法入门介绍

一、从平行线谈起。 平行线&#xff0c;永不相交。没有人怀疑把&#xff1a;&#xff09;不过到了近代这个结论遭到了质疑。平行线会不会在很远很远的地方相交了&#xff1f;事实上没有人见到过。所以“平行线&#xff0c;永不相交”只是假设&#xff08;大家想想初中学习的平行…

Intel Hex概述

什么是Intel Hex文件 Intel HEX文件时遵循Intel HEX文件格式的ASCII文本文件。在Intel HEX文件的每一行都包含了 一个HEX记录。这些记录是由一些代表机器语言代码和常量的16进制数据组成的。Intel HEX文件常用来传输要存储在ROM 或者 EPROM中的程序和数据。大部分的EPROM编程器…

AndroidStudio+ideasmali动态调试smali汇编

0x00 前言 之前对于app反编译的smali汇编语言都是静态分析为主&#xff0c;加上一点ida6.6的动态调试&#xff0c;但是ida的调试smali真的像鸡肋一样&#xff0c;各种不爽&#xff0c;遇到混淆过的java代码就欲哭无泪了。后来知道IDEA用一款插件也可以实现smali的动态调试&a…

使用IDA Pro动态调试SO文件

&#xff08;1&#xff09;在IDA的安装路径中找到android_server文件。 &#xff08;2&#xff09;将android_server拷贝到手机的/data/local/tmp目录下面。 &#xff08;3&#xff09; 将手机插上电脑&#xff0c;打开命令提示符&#xff0c; 先输入”adb shell”,然后输入”…

c#调用c++dll接口及回调函数

在合作开发时&#xff0c;C#时常需要调用CDLL&#xff0c;当传递参数时时常遇到问题&#xff0c;尤其是传递和返回字符串是&#xff0c;现总结一下&#xff0c;分享给大家&#xff1a;VC中主要字符串类型为&#xff1a;LPSTR,LPCSTR, LPCTSTR, string, CString, LPCWSTR, LPWST…

机器学习或深度学习的数据读取工作(大数据处理)

机器学习或深度学习的数据读取工作&#xff08;大数据处理&#xff09;主要是.split和re.findall和glob.glob运用。 读取文件的路径&#xff08;为了获得文件内容&#xff09;和提取文件路径中感兴趣的东西(标签) 1&#xff0c;“glob.glob”用于读取文件路径 2&#xff0c;“.…

windows平台下的反调试技术

在调试一些病毒程序的时候&#xff0c;可能会碰到一些反调试技术&#xff0c;也就是说&#xff0c;被调试的程序可以检测到自己是否被调试器附加了&#xff0c;如果探知自己正在被调试&#xff0c;肯定是有人试图反汇编啦之类的方法破解自己。为了了解如何破解反调试技术&#…

SQLite加解密

0x00 SQLite概述 SQLite是一个轻量级、跨平台的&#xff0c;开源的数据库引擎&#xff0c;它在读写效率&#xff0c;消耗总量、延迟时间和整体简单性上具有的优越性&#xff0c;使其成为移动平台数据库的最佳解决方案。 然而免费版的SQLite有一个致命缺点&#xff1a;不支持加…

android和linux操作系统的区别

Android是由Google为移动设备开发的开源操作系统。Android软件的原始开发商Android公司是由Google&#xff0c;Inc.于2005年购买的。它是基于Linux 2.6内核开发的。Linux操作系统于1991年由Linus Torvalds作为台式计算机的开源操作系统开发。Linux操作系统是作为MINIX操作系统开…

Android系统架构图

一、Aplications&#xff08;应用层&#xff09; 应用是用Java语言编写的云新在虚拟机上的程序。 二、Application Framework&#xff08;应用框架层&#xff09; 这一层是编写Google发布的核心应用时所使用的API框架&#xff0c;开发人员可以使用这些框架来开发自己的应用。 V…

SHA1算法实现及详解

1 SHA1算法简介 安全哈希算法&#xff08;Secure Hash Algorithm&#xff09;主要适用于数字签名标准&#xff08;Digital Signature Standard DSS&#xff09;里面定义的数字签名算法&#xff08;Digital Signature Algorithm DSA&#xff09;。对于长度小于2^64位的消息&…

CRC32算法实现

CRC32 检错能力极强&#xff0c;开销小&#xff0c;易于用编码器及检测电路实现。从其检错能力来看&#xff0c;它所不能发现的错误的几率仅为0.0047%以下。从性能上和开销上考虑&#xff0c;均远远优于奇偶校验及算术和校验等方式。因而&#xff0c;在数据存储和数据通讯领域&…

AES算法重点详解和实现

可以看到&#xff0c;在原始数据长度为16的整数倍时&#xff0c;假如原始数据长度等于16*n&#xff0c;则使用NoPadding时加密后数据长度等于16*n&#xff0c;其它情况下加密数据长度等于16*(n1)。在不足16的整数倍的情况下&#xff0c;假如原始数据长度等于16*nm[其中m小于16]…

protobuf流的反解析Message

0x01 protobuf的基本概念 protobuf通过定义".proto"文件来描述数据的结构。.proto文件中用"Message"所表示所需要序列化的数据的格式。Message由field组成&#xff0c;Field类似JAVA或者C中成员变量&#xff0c;通常一个field的定义包含修饰符、类型、名称…

勒索病毒傀儡进程脱壳

样本是&#xff1a;wallet勒索病毒 环境&#xff1a;虚拟机VMWARE win7 32位 工具&#xff1a;OD&#xff0c;winhex 初次拿到样本&#xff0c;先用火绒剑工具监控下病毒样本的流程&#xff0c;可以看到有一个自创建进程的行为。 我们等找到OEP后&#xff0c;在CreateProcessA下…

arm64动态链接库通过函数名获取函数偏移

基本思路是分析elf文件, 首先遍历节区头部Elf32_Shdr查看sh_type属性值&#xff0c;得到属性值为SHT_DYNSYM的节区。 其次通过名字遍历节区结点&#xff0c;找到类型为STT_FUNC并且名字与其相同的结点。 代码如下&#xff1a; static void * xmalloc(size_t size) {void *p…