ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

RC4加密算法学习笔记

2022-01-19 22:35:41  阅读:203  来源: 互联网

标签:box RC4 unsigned 笔记 char 密钥 key 加密算法


目录

RC4加密算法学习笔记

原理

原理很简单,包括初始化算法(KSA)和伪随机子密码生成算法(PRGA)两大部分。

关键在于密钥流生成器的理解,个人认为该加密手段是通过生成密钥对256取模后得到下标的不确定性从而达到混乱和扩散的目的。

密钥生成

先放上一张原理图:

img

在初始化的过程中,密钥的主要功能是将S-box搅乱,i确保S-box的每个元素都得到处理,j保证S-box的搅乱是随机的。而不同的S-box在经过伪随机子密码生成算法的处理后可以得到不同的子密钥序列,将S-box和明文进行xor运算,得到密文,解密过程也完全相同。

/*初始化函数*/
void rc4_init(unsigned char*s,unsigned char*key, unsigned long Len)
{
    int i=0,j=0;
    unsigned char T[256]={0};
    unsigned char tmp=0;
    for(i=0;i<256;i++) {
        s[i]=i;//s_box初始化为[0,255]
        T[i]=key[i%Len];//key如果没到256位,就循环输入进T数组
    }
    for(i=0;i<256;i++) {
        j=(j+s[i]+T[i])%256;//得到一个随机下标
        swap(s[i],s[j]);//打乱s数组
    }
}

加解密过程

加解密过程比较简单

/*加解密*/
void rc4_crypt(unsigned char*s,unsigned char*Data,unsigned long Len)
{//s为s_box,Data为明文,len为明文长度
    int i=0,j=0,t=0;
    unsigned long k=0;
    unsigned char tmp;
    for(k=0;k<Len;k++)//遍历明文的每一位
    {
        i=(i+1)%256;
        j=(j+s[i])%256;
        swap(s[i],s[j]);//进一步打乱s_box
        t=(s[i]+s[j])%256;//得到一个随机下标t,s[t]其实就是生成的密钥流中的一位
        Data[k]^=s[t];//异或加密,那么解密过程就是再异或一次
    }
}

调用过程

int main()
{
    unsigned char s[256] = { 0 }, s2[256] = { 0 };//S-box
    char key[256] = { "justfortest" };//我的理解是key不要有重复字节,否则s_box会不够乱
    char pData[512] = "这是一个用来加密的数据Data";
    unsigned long len = strlen(pData);
    int i;
 
    printf("pData=%s\n", pData);
    printf("key=%s,length=%d\n\n", key, strlen(key));
    rc4_init(s, (unsigned char*)key, strlen(key));//已经完成了初始化
    printf("完成对S[i]的初始化,如下:\n\n");
    for (i = 0; i<256; i++)
    {
        printf("%02X", s[i]);
        if (i && (i + 1) % 16 == 0)putchar('\n');
    }
    printf("\n\n");
    for (i = 0; i<256; i++)
    //用s2[i]暂时保留经过初始化的s[i],因为加密函数会进一步对s_box进行置换
    {
        s2[i] = s[i];
    }
    printf("已经初始化,现在加密:\n\n");
    rc4_crypt(s, (unsigned char*)pData, len);//加密
    printf("pData=%s\n\n", pData);
    printf("已经加密,现在解密:\n\n");
    //rc4_init(s,(unsignedchar*)key,strlen(key));//初始化密钥
    rc4_crypt(s2, (unsigned char*)pData, len);//解密
    printf("pData=%s\n\n", pData);
    return 0;
}

总的来说RC4并不难,也比较好看懂,解密脚本写起来也很方便,但是只要保证密钥不是若密钥,那么该算法具有很高的安全性,据分析128位的密钥已经足够安全,没有任何分析对该算法有效,因此可以放心使用。

参考文章:

RC4_百度百科 (baidu.com)

RC4加密算法原理简单理解 - 沉默的赌徒 - 博客园 (cnblogs.com)

标签:box,RC4,unsigned,笔记,char,密钥,key,加密算法
来源: https://www.cnblogs.com/THRANDUil/p/15824421.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有