C++Rc4密钥加解密

需要一个Rc4可以字符串密钥加解密的列子,不要第三方头文件,用C++自带的头文件编写,可以加解密的例子(字符串,或者,char*)

参考一下

RC4加密解密算法_huangyimo的博客-CSDN博客 RC4是一种对称密码算法,它属于对称密码算法中的序列密码(streamcipher,也称为流密码),它是可变密钥长度,面向字节操作的流密码。RC4是流密码streamcipher中的一种,为序列密码。RC4加密算法是Ron Rivest在1987年设计出的密钥长度可变的加密算法簇。起初该算法是商业机密,直到1994年,它才公诸于众。由于RC4具有算法简单,运算速度快,软硬件实现都十分容易等优点... https://blog.csdn.net/huangyimo/article/details/82980364?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166899261316800186532048%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=166899261316800186532048&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-4-82980364-null-null.nonecase&utm_term=C%2B%2BRc4%E5%AF%86%E9%92%A5%E5%8A%A0%E8%A7%A3%E5%AF%86&spm=1018.2226.3001.4450

用C++加密解密(RC4对称密码算法)
https://blog.csdn.net/wangz76/article/details/120536190

#include<bits/stdc++.h>
using namespace std;
const int N=256;
char m[N]= {"this is a test"}; //明文与密文
int len,s[N],t[N],c[N],key[N];
//本次试验n=3,故随机选取密钥5 6 7对t数组依次填充
void init()//初始化
{
    int j=0;
    for(int i=0; i<N; i++) s[i]=i; //对s-box线性填充
    for(int i=0; i<N; i++) //依次填充辅助数组
    {
        if(i%3==0)  t[i]=5;
        else if(i%3==1) t[i]=6;
        else t[i]=7;
        j=(j+s[i]+t[i])%N;
        swap(s[j],s[i]);
    }
}
void RC4_add()
{
    int i=0,j=0;
    for(int k=0; k<len; k++)
    {
        i=(i+1)%N;
        j=(j+s[i])%N;
//        swap(s[i],s[j]);
        int tmp=(s[i]+s[j])%N;
        m[k]^=s[tmp];
        printf("%c",m[k]);
    }
}
int main()
{
    len=strlen(m);
    init();
    printf("明文:%s\n",m);
    printf("加密:");
    RC4_add();
    printf("\n解密: ");
    RC4_add();
}
#include <iostream>
#include<stdio.h>
#define MAX_CHAR_LEN 255

void producekeystream(int textlength,char key[],int keylength,char keystream[])
{
    int S[256];
    int i,j=0,k;
    char tmp;
    for(i=0;i<256;i++)
        S[i]=i;
    for(i=0;i<256;i++)
    {
        j=(j+S[i]+key[i%keylength])%256;
        tmp=S[i];
        S[i]=S[j];
        S[j]=tmp;
    }
    i=j=k=0;
    while(k<textlength)
    {
        i=(i+1)%256;
        j=(j+S[i])%256;
        tmp=S[i];
        S[i]=S[j];
        S[j]=tmp;
        keystream[k++]=S[(S[i]+S[j])%256];
    }
}

void rc4encdec(int textlength,char plaintext[],char keystream[],char ciphertext[])
{
    int i;
    for(i=0;i<textlength;i++)
    {
        ciphertext[i]=keystream[i]^plaintext[i];
    }

}

int main()
{
    char plaintext[MAX_CHAR_LEN]; //存放源明文
    char chktext[MAX_CHAR_LEN];   //存放解密后的明文
    char key[32];                 //存放用户输入密钥
    char keystream[MAX_CHAR_LEN]; //存放生成的密钥流
    char ciphertext[MAX_CHAR_LEN];//存放加密后的密文
    char c;
    int i=0,textlength,keylength;
    
    gets(plaintext);
    while(plaintext[i]!='\0') i++;
    textlength=i;

    printf("password:");
    for(i=0;(c=getchar())!='\n';i++)
        key[i]=c;
    key[i]='\0';
    keylength=i;

    producekeystream(textlength,key,keylength,keystream);//使用key生成一个keystream

    rc4encdec(textlength,plaintext,keystream,ciphertext);//使用密钥流和明文生成密文

    puts(ciphertext);

    rc4encdec(textlength,ciphertext,keystream,chktext);

    puts(chktext);
    return 0;
}