RC4流密码

admin 2023年12月12日03:20:17评论21 views字数 4937阅读16分27秒阅读模式

RC4流密码

一、RC4加密解密算法的原理

    首先,通过我的理解,RC4算法所依赖的最根本原理是:对明文使用同一个密钥异或两次最后仍是得到原文。即生成密钥之后,由密钥与明文异或后生成密文(加密过程),由同一密钥与密文异或后得到明文(解密过程)。

    下面对RC4算法的具体实现进行简单介绍。

RC4流密码

1、先初始化状态向量S(256个字节,用来作为密钥流生成的种子1)

按照升序,给每个字节赋值0,1,2,3,4,5,6.....,254,255

RC4流密码

2、初始密钥(由用户输入),长度任意。如果输入长度小于256个字节,则进行轮转,直到填满。例如输入密钥的是“1,2,3,4,5”, 那么填入的是1,2,3,4,5, 1,2,3,4,5, 1,2,3,4,5........

RC4流密码

RC4流密码

由上述轮转过程得到256个字节的向量T(用来作为密钥流生成的种子2)。

3、开始对状态向量S进行置换操作(用来打乱初始种子1),按照下列规则进行:

从第零个字节开始,执行256次,保证每个字节都得到处理

RC4流密码

这样处理后的状态向量S几乎是带有一定的随机性了

4、最后是秘钥流的生成与加密

RC4流密码

解密按照前面写的,异或两次就是原文,所以只要把密钥流重新拿过来异或一次就能得到原文了


二、附件 RC4流密码代码

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

#include<random>

#include<time.h>

#include<string.h>

#include<stdlib.h>

#define MAX 65534


unsigned char S[256]; //向量S

char T[256];    //向量T

int Key[256];   //随机生成的密钥

int KeyStream[MAX]; //密钥

char PlainText[MAX];

char CryptoText[MAX];

const char* WordList = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";


void init_S()

// 初始化S;

{

    for (int i = 0; i < 256; i++) {

        S[i] = i;

    }

}


void init_Key() {

   


    for (int i = 0; i < 256; i++) {   //初始化T[]

        T[i] = WordList[i % 62];

    }



}


void  permute_S()

{

    // 置换S;

    int temp;

    int j = 0;

    for (int i = 0; i < 256; i++) {

        j = (j + S[i] + T[i]) % 256;

        temp = S[i];

        S[i] = S[j];

        S[j] = temp;

    }

}



//普通模式下的加密函数

bool Encryption(unsigned char* S, long size, char* file_name,int mode)//加解密文件 因为是对合运算,所以只需要一个函数,用mode控制加密还是解密 

{

    init_S();

    init_Key();

    permute_S();

    FILE* pr;                      //定义读文件指针pr 

    pr = fopen(file_name, "rb");    //只读

    if (pr == NULL)                 //如果打开文件错误,则退出

    {

        printf( "用户输入文件打开失败!n" );

        return false;

    }


    FILE* pw;                      //定义写文件指针pw

    unsigned char* data;            //存储原始文件数据,并在运算过程中充当输出序列与原序列的异或结果    

    unsigned char i, j, temp;

    long num;

    data = (unsigned char*)malloc(size * sizeof(unsigned char));//分配内存 


    //pw = fopen("", "wb");

    if (mode == 1)

       pw = fopen("encrypted.txt", "wb");    //模式为只写且刷新文件 

    else

       pw = fopen("decrypted.txt", "wb");    //模式为只写且刷新文件


    if (pw == NULL)                            //如果打开文件错误,则退出

    {

       printf( "输出文件时出错!n" );

        return false;

    }

    fread(data, sizeof(char), size, pr);//读取二进制流(需要加/解密的文件) 

    for (num = 0, i = 0, j = 0; num < size; num++) //逐位生成序列 

    {

        temp = S[i];

        j = (j + temp) % 256;

        S[i] = S[j];

        S[j] = temp;

        temp = (temp + S[i]) % 256;

        data[num] ^= S[temp];

        i += 1;

    }


   if (mode == 1)

      printf( "功能完成,生成encryption.txt文件n" );

   else

      printf( "功能完成,生成decryption.txt文件n" );


    fwrite(data, sizeof(char), size, pw);//写入二进制流 

    fclose(pw);//关闭文件流 

    fclose(pr);

    free(data);//释放内存 

    return true;

}


//测速模式下的加密函数

bool EncryptionSpeedMode(unsigned char* S, long size, char* file_name, int mode)//加解密文件 因为是对合运算,所以只需要一个函数,用mode控制加密还是解密 

{

    FILE* pr;                      //定义读文件指针pr 

    pr = fopen(file_name, "rb");    //只读

    time_t t1,t2;

    if (pr == NULL)                 //如果打开文件错误,则退出

    {

        printf("用户输入文件打开失败!n");

        return false;

    }


    FILE* pw;                      //定义写文件指针pw

    unsigned char* data;            //存储原始文件数据,并在运算过程中充当输出序列与原序列的异或结果    

    unsigned char i, j, temp;

    long num;

    data = (unsigned char*)malloc(size * sizeof(unsigned char));//分配内存 


    //pw = fopen("", "wb");

    if (mode == 1)

        pw = fopen("encrypted.txt", "wb");    //模式为只写且刷新文件 

    else

        pw = fopen("decrypted.txt", "wb");    //模式为只写且刷新文件


    if (pw == NULL)                            //如果打开文件错误,则退出

    {

        printf("输出文件时出错!n");

        return false;

    }

    fread(data, sizeof(char), size, pr);//读取二进制流(需要加/解密的文件) 

    

    t1 = clock();//开始测速

    

        init_S();

        init_Key();

        permute_S();

        for (num = 0, i = 0, j = 0; num < size; num++) //逐位生成序列 

        {

            temp = S[i];

            j = (j + temp) % 256;

            S[i] = S[j];

            S[j] = temp;

            temp = (temp + S[i]) % 256;

            data[num] ^= S[temp];

            i += 1;

        }

  

    t2 = clock();//结束测速


   if (mode == 1)

        printf("功能完成,生成encryption文件n");

    else

        printf("功能完成,生成decryption文件n");


    fwrite(data, sizeof(unsigned char), size, pw);//写入二进制流 

    printf("RC4算法的运行时间为%f msn", difftime(t2, t1));

    fclose(pw);//关闭文件流 

    fclose(pr);

    free(data);//释放内存 

    return true;

}



long file_size(char *filename) {

    FILE* fp = fopen(filename, "r");

    if (!fp) {

        printf("文件打开失败");

        return -1;

    }

    fseek(fp, 0L, SEEK_END);

    long size = ftell(fp);

    fclose(fp);

    return size;

}


int main()

{

   

    int speedmode = 0;

    printf("请选择RC4加密模式:n 0:带回显的普通加密模式;n 1:带回显的测速模式");

    scanf("%d", &speedmode);

    if (speedmode == 0) {

        char filename1[] = "test.txt";//需要加密的文件

        char filename2[] = "encrypted.txt";//需要解密的文件

        long filesize = file_size(filename1);

        Encryption(S, filesize, filename1, 1);//加密

        Encryption(S, filesize, filename2, 2);//解密

    }

    else {

        char filename1[] = "test.txt";//需要加密的文件

        char filename2[] = "encrypted.txt";//需要解密的文件

        long filesize = file_size(filename1);

        EncryptionSpeedMode(S, filesize, filename1, 1);//加密

        EncryptionSpeedMode(S, filesize, filename2, 2);//解密

    }

    /*char filename1[] = "test.txt";//需要加密的文件

    char filename2[] = "encrypted.txt";//需要解密的文件

    long filesize = file_size(filename1);

    EncryptionSpeedMode(S, filesize, filename1, 1);//加密*/

    return 0;

}


参考文献

https://blog.csdn.net/weixin_43408412/article/details/108956701?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-4-108956701-blog-37599161.235%5Ev39%5Epc_relevant_3m_sort_dl_base2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-4-108956701-blog-37599161.235%5Ev39%5Epc_relevant_3m_sort_dl_base2&utm_relevant_index=9

原文始发于微信公众号(豆豆咨询):RC4流密码

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月12日03:20:17
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   RC4流密码http://cn-sec.com/archives/2288683.html

发表评论

匿名网友 填写信息