「密码学」-RC4密码

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

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

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

  4. 密钥Key:长度为1-256字节,注意密钥的长度keylen与明文长度、密钥流的长度没有必然关系

初始化S

\

void rc4_init(unsigned char*s, unsigned char*key, unsigned long Len)
{
   int i = 0, j = 0;
   char k[256] = { 0 };
   unsigned char tmp = 0;
   for (i = 0; i<256; i++)
   {
       s[i] = i;
       k[i] = key[i%Len];
   }
   for (i = 0; i<256; i++)
   {
       j = (j + s[i] + k[i]) % 256;
       tmp = s[i];
       s[i] = s[j];//交换s[i]和s[j]
       s[j] = tmp;
   }
}

加解密

\

void RC4(unsigned char*s, unsigned char*Data, unsigned long 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;
       tmp = s[i];
       s[i] = s[j];
       s[j] = tmp;
       t = (s[i] + s[j]) % 256;
       Data[k] ^= s[t];
   }
}

主函数

\

int main()
{
   unsigned char s[256] = { 0 }, s2[256] = { 0 };
   char key[256];
   printf("输入密钥:\n");
   scanf("%s",key);
   char pData[512];
   printf("输入明文:\n");
  scanf("%s",pData); 
   unsigned long len = strlen(pData);
   int i;

   rc4_init(s, (unsigned char*)key, strlen(key));
   
   for (i = 0; i<256; i++)
   {
       s2[i] = s[i];//加密解密的初始化s要相同
   }
   printf("加密密文:\n");
   RC4(s, (unsigned char*)pData, len);
   printf("pData=%s\n", pData);
   printf("解密明文:\n");
   RC4(s2, (unsigned char*)pData, len);
   printf("pData=%s\n", pData);
   return 0;
}

\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \本文参考博客
\ \ \ \ \ \ \ \ \ \ \ \ \ \https://www.cnblogs.com/zibility/p/5404478.html
\ \ \ \ \ \ \ \ \https://blog.csdn.net/lc_910927/article/details/37599161

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容