首页 > 其他分享 >RC4加密

RC4加密

时间:2024-03-22 09:25:23浏览次数:13  
标签:加密 sbox RC4 unsigned puc char key data

RC4加密

一. 介绍

在密码学中,RC4(来自Rivest Cipher 4的缩写)是一种流加密算法(基于bit进行加密) ,密钥长度可变。它加解密使用相同的密钥,因此也属于对称加密算法。所谓对称加密,就是加密和解密的过程是一样的。RC4是有线等效加密(WEP)中采用的加密算法,也曾经是TLS可采用的算法之一。

RC4已经成为一些常用的协议和标准的一部分,如1997年的WEP和2003/2004年无线卡的WPA; 和1995年的SSL,以及后来1999年的TLS。让它如此广泛分布和使用的主要因素是它不可思议的简单和速度,不管是软件还是硬件,实现起来都十分容易。

二. 加密过程

1. 初始化s表

  1. s表大小为256个字节,对s表进行顺序填充,从0到255。
  2. 用种子密钥填充k表(256个字节),种子密钥的长度随意,循环填充。
  3. 用K表对S表进行初始非线性置换。这里其实就说初始化s表的核心步骤。
int i = 0;
for (i = 0; i < 256; i++) {
    S[i] = i;//填充S表
    K[i] = puc_key[i % key_length];//填充K表
}
 
for (i = 0; i < 256; i++) {
    j = (j + S[i] + K[i]) % 256;
    swap_uchar(&S[i], &S[j]); //初始化S表
}

2. 生成密钥流

为每个待加密字符生成伪随机数,用于进行异或。

int i = 0;
int j = 0;
int t = 0;
unsigned long k = 0;
 
for (k = 0; k < ul_data_length; k++) {
    i = (i + 1) % 256;
    j = (j + S[i]) % 256;
    swap_uchar(&S[i], &S[j]);
    t = (S[i] + S[j]) % 256;
    puc_key_stream[k] = S[t];
}

三. 解密过程

由于是对称加密,所以可以直接模拟执行得到一个相同的S表,在得到S表之后再得到相同的密钥流,利用密钥流对结果字符进行异或即可得到原始数据。

整体步骤:

#include<stdio.h>
#include<string.h>
 
#define SBOX_LEN 256
 
#define rc4_encrypt rc4_crypt
#define rc4_decrypt rc4_crypt
 
static inline void swap_uchar(unsigned char *puc_x, unsigned char *puc_y)
{
    *puc_x = *puc_x ^ *puc_y;
    *puc_y = *puc_x ^ *puc_y;
    *puc_x = *puc_x ^ *puc_y;
}
 
/*
 * 利用Key生成S盒
 * the Key-Scheduling Algorithm
 */
static void rc4_ksa(unsigned char *puc_sbox, unsigned char *puc_key, int key_length)
{
    int i = 0;
    int j = 0;
    char tmp[SBOX_LEN] = {0};
 
    for (i = 0; i < SBOX_LEN; i++) {
        puc_sbox[i] = i;
        tmp[i] = puc_key[i % key_length];
    }
 
    for (i = 0; i < SBOX_LEN; i++) {
        j = (j + puc_sbox[i] + tmp[i]) % SBOX_LEN;
        swap_uchar(&puc_sbox[i], &puc_sbox[j]); //交换puc_sbox[i]和puc_sbox[j]
    }
}
 
/**
 * 利用S盒生成密钥流
 * The pseudo-random generation algorithm(PRGA)
 */
static void rc4_prga(unsigned char *puc_sbox, unsigned char *puc_key_stream, unsigned long ul_data_length)
{
    int i = 0;
    int j = 0;
    int t = 0;
    unsigned long k = 0;
 
    for (k = 0; k < ul_data_length; k++) {
        i = (i + 1) % SBOX_LEN;
        j = (j + puc_sbox[i]) % SBOX_LEN;
        swap_uchar(&puc_sbox[i], &puc_sbox[j]);
        t = (puc_sbox[i] + puc_sbox[j]) % SBOX_LEN;
        /* 为了更清晰理解rc4算法流程,此处保存keystream,不直接进行XOR运算 */
        puc_key_stream[k] = puc_sbox[t];
    }
}
 
/* 加解密 */
void rc4_crypt(unsigned char *puc_data, unsigned char *puc_key_stream, unsigned long ul_data_length)
{
    unsigned long i = 0;
 
    /* 把PRGA算法放在加解密函数中可以不需要保存keystream */
    for (i = 0; i < ul_data_length; i++) {
        puc_data[i] ^= puc_key_stream[i];
    }
}
 
int main(int argc, char *argv[])
{
    unsigned char sbox[SBOX_LEN] = {0};
    char key[SBOX_LEN] = {"abcdefghijklmnopqrstuvwxyz"}; //秘钥内容随便定义
    char data[512] = "[email protected] lvfvr#9527";
    unsigned char puc_keystream[512] = {0};
    unsigned long ul_data_length = strlen(data);
 
    printf("key=%s, length=%d\n\n", key, strlen(key));
    printf("Raw data string:%s\n", data);
    printf("Raw data hex:\n");
    //hexdump(data, ul_data_length);
 
    /* 生成S-box */
    rc4_ksa(sbox, (unsigned char *)key, strlen(key));
 
    /* 生成keystream并保存,S-box也会被更改 */
    rc4_prga(sbox, puc_keystream, ul_data_length);
 
    printf("S-box final status:\n");
    //hexdump(sbox, sizeof(sbox));
 
    printf("key stream:\n");
    //hexdump(puc_keystream, ul_data_length);
 
    /* 加密 */
    rc4_encrypt((unsigned char*)data, puc_keystream, ul_data_length);
 
    printf("cipher //hexdump:\n");
    //hexdump(data, ul_data_length);
 
    /* 解密 */
    rc4_decrypt((unsigned char*)data, puc_keystream, ul_data_length);
 
    printf("decypt data:%s\n", data);
 
    return 0;
}

标签:加密,sbox,RC4,unsigned,puc,char,key,data
From: https://www.cnblogs.com/ONEZJ/p/18088683/rc4-encryption-11t3r2

相关文章

  • AES加密
    AES加密一.加密流程​​AES未使用Feistel结构。其前N-1轮由4个不同的变换组成:字节代替、行移位、列混淆和轮密钥加。最后一轮仅包含三个变换。而在第一轮前面有一个起始的单变换(轮密钥加),可以视为0轮。字节代替(SubBytes):用一个S盒完成分组的字节到字节的代替。行移位(ShiftRows):......
  • AES加密
    AES算法加密(ECB模式),加密后进行base64编码异常Specifiedkeyisnotavalidsizeforthisalgorithm解决方法:AES加密中参数key应是32位,如果位数不对会报此错。///<summary>///AES算法加密(ECB模式)将明文加密,加密后进行base64编码,返回密文///</summary>///<p......
  • vite+vue3+vuex 加密
    1.安装JSEncrypt  npminstalljsencrypt2.加密方法//加密算法import{JSEncrypt}from'jsencrypt';//加密functionencryptText(text){ constpublicKey='MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCh5Nk2GLiyQFMIU+h3OEA4UeFbu3dCH5sjd/sLTxxvwjXq7JLqJbt2rC......
  • 提升Java编程安全性-代码加密混淆工具的重要性和应用
     在Java编程领域中,保护代码安全性和知识产权至关重要。本文旨在探讨代码加密混淆工具在提升代码安全性和保护知识产权方面的重要性。我们将介绍几款流行的Java代码加密混淆工具,如ProGuard、DexGuard、Jscrambler、DashO和ipaguard,并分析它们的功能和适用场景,旨在帮助开发者选择......
  • 密码加密|jsencrypt|md5|加密解密的两种方式
    一、md5npminstallmd5二、JSEncrypt2.1介绍JSEncrypt属于RSA加密,RSA加密算法是一种非对称加密算法;2.2使用安装:npminstalljsencrypt--dev封装工具:utils/jsencrypt.jsimportJSEncryptfrom'jsencrypt/bin/jsencrypt.min'//密钥对生成http://web.cha......
  • RSA算法揭秘:加密世界的守护者
    RSA算法起源:RSA算法是由RonRivest、AdiShamir和LeonardAdleman在1977年共同提出的。它是一种非对称加密算法,基于两个大素数的乘积难以分解的数论问题。RSA算法包括公钥和私钥,用于加密和解密数据,实现了安全的通信和数据传输。首页|一个覆盖广泛主题工具的高效在线平台(a......
  • 一次有趣的前端加密分析爆破
    前言一次有趣的密码加密爆破分享,仅供学习参考,如需转载请声明原文链接寻找登录加密点首先按住ctrl+shift+i打开开发者调试界面然后找到网络页面,随便输入账号密码提交一次查看启动器,直接点击蓝色的链接转到密码登录处分析js代码可以看到FinishLogin将curItem转到doStar......
  • 多数据源加密(90%来自文心一言)
    在dynamic-datasource-spring-boot-starter3.2.0中,如果你希望对加密的密码进行自定义解密,你需要实现自己的PropertySourceLocator或者自定义配置解析逻辑,以便在读取配置时能够自动解密密码。以下是实现自定义解密逻辑的一般步骤:创建自定义的解密工具类首先,你需要一个能......
  • 圣天诺LDK加密锁(加密狗)如何保护Linux系统下的软件
    首先下载圣天诺LDK加密锁(加密狗)开发工具包Sentinel-LDK.tar.gz。(下载地址:http://www.chinadlp.com/?list-DriveDownload.html)将其拷贝到有桌面的linux系统中,并解压后使用。1、安装驱动:在/Sentinel-LDK/Redistrubute/Runtime找到驱动: tar.gz包驱动安装方法:#tar-zxvfak......
  • 使用crypto-js加密
    在utils文件夹创建一个aes.js文件安装cnpminstallcrypto-jsimportCryptoJSfrom"crypto-js";constkey=CryptoJS.enc.Utf8.parse("");//十六位十六进制数作为密钥constiv=CryptoJS.enc.Utf8.parse("");//十六位十六进制数作为密钥偏移量//解密方法exportfu......