RC4密码简介:
RC4是由美国密码学家Ron Rivest在1987年设计的流密码算法,该算法被广泛用于 SSL/TLS协议(Socket Secure Layer, SSL)/(Transport Layer Security, TLS),WEP(Wired Equivalent Privacy, WEP)协议和 WPA(Wi-Fi Protected Access, WPA)协议,也作为蜂窝数字数据包规范的一部分。
RC4是一种基于非线性变换的流密码算法。该算法包括两部分:
(1)密钥编制算法KSA(Key Sehedule Algorithm); 用可变长度的密钥产生密钥流生成器的初始状态S0S_0S0​。
(2)伪随机序列生成算法 PRGA(Pseudo Random Generation Algorithm);根据初始状态 S0S_0S0​产生密钥流序列,最终与明文相异或产生密文。

RC4的实现步骤:
部分1 KSA实现步骤:

  1. 随机选取一个密钥Key,初始化 S 盒。
  2. iti_tit​遍历 S 盒中的每一个位置,iti_tit​的每一次更新都会使得 jtj_tjt​ 在 St−1S_{t-1}St−1​ [iti_tit​] 和Key的作用下产生一个新值。
  3. 交换StS_tSt​中jtj_tjt​和iti_tit​对应的两个字节。经过N步遍历后KSA产生了RC4的初始状态s0s_0s0​。RC4的密钥。

伪代码实现:

KSA(Key, S)
for i = 0 to N-1
i0i_0i0​ = 0, j0j_0j0​ = 0;
where t = 1,2,…,N
jtj_tjt​ = jt−1j_{t-1}jt−1​+St−1S_{t-1}St−1​[it−1i_{t-1}it−1​] + Key[it−1i_{t-1}it−1​ mod 1];
StS_tSt​[iti_tit​] = St−1S_{t-1}St−1​[jtj_tjt​], StS_tSt​[jtj_tjt​] = St−1S_{t-1}St−1​[iti_tit​];
iti_tit​ = it−1i_{t-1}it−1​ + 1;

部分2 PRGA实现步骤
伪随机序列的生成原理是不断地变换 S 盒中的元
素的位置,同时从中选择一元素输出,即伪随机序列,也
称密钥流序列。

  1. 根据 KSA 的初始状态表S0S_0S0​,初始化针iti_tit​和jtj_tjt​。
  2. 更新该算法中的 j, 同时交换StS_tSt​中iti_tit​和jtj_tjt​对
    应的字节。
  3. 伪随机序列生成器不断地变换S盒中字节的位置,每次改变后将 S 中 StS_tSt​ [iti_tit​] + StS_tSt​ [jtj_tjt​] 位置的值输出,即为8比特的密钥流输出字节,输出的字节序列是{ZtZ_tZt​} (t : 0 -> ∞\infty∞),{ZtZ_tZt​}与明文异或加密,与密文异或解密。

伪代码实现:

PRGA(S0S_0S0​)
Initialization:
i0i_0i0​ = 0;
j0j_0j0​ = 0;
while(true)
iti_tit​ =
(it−1i_{t-1}it−1​ + 1) mod N;
jtj_tjt​ = (jt−1j_{t-1}jt−1​ + St−1S_{t-1}St−1​[iti_tit​]) mod N;
StS_tSt​[iti_tit​] = St−1S_{t-1}St−1​[jtj_tjt​], StS_tSt​[jtj_tjt​] = St−1S_{t-1}St−1​[iti_tit​];
ZtZ_tZt​ = StS_tSt​[(StS_tSt​[iti_tit​] + StS_tSt​[jtj_tjt​]) mod N];
output ZtZ_tZt​
endwhile

OpenSSL代码应用:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <openssl/rc4.h>
int main(int argc, char* argv[])
{RC4_KEY key;const char* data = "Hello,World!!";const char* indata = "This is plain text !!!!";int length = strlen((char *)data);int len = strlen((char*)indata);RC4_set_key(&key, length, (const unsigned char *)data);            //设置密钥unsigned char* outdata;                                            //分配密文空间outdata = (unsigned char*)malloc(sizeof(unsigned char) * (len + 1));memset(outdata, 0, len + 1);                                       //初始为0printf("\tindata=%s\n", indata);RC4(&key, strlen(indata), (const unsigned char*)indata, outdata);  //加密明文printf("\toutdata=%s\n", outdata);unsigned char* plain;                                              //分配明文空间plain = (unsigned char*)malloc(sizeof(unsigned char) * (len + 1));memset(plain, 0, len + 1);                                         //初始化为0RC4_set_key(&key, length, (const unsigned char*)data);             //重新设置密钥RC4(&key, strlen((char *)outdata), outdata, plain);                //解密密文printf("\tplain=%s\n", plain);return 0;
}

运行结果如下:

RC4算法原理与应用 —— 密码与密码工程实践No.1相关推荐

  1. RC4算法原理、Java实现RC4加密算法、DES AES RC4算法比较

    DES AES RC4算法比较 根据密钥类型的不同,加密算法分为对称和非对称两种.对称加密系统是指加密和解密均采用同一把密钥. 对称加密算法是最常用的加密算法,优势在于算法公开,计算量小,加密效率高. ...

  2. Java实现凯撒密码、维吉尼亚密码、双换位密码、RC4算法加密

    文章目录 前言 一.凯撒密码 二.维吉尼亚密码 三.双换位密码 四.RC4算法加密 前言 本博文为信息安全与支付课程的课程作业. 一.凯撒密码 文件有:Caesar.java.输入文件input1.t ...

  3. 安全密码c语言编程,商用密码算法原理与C语言实现

    2020年1月1日,<中华人民共和国密码法>正式施行.国家鼓励和支持密码科学技术研究与应用,促进密码科学技术进步与创新,加强密码人才培养和队伍建设,采取多种形式加强密码安全教育.本书是在国 ...

  4. 国密SM3密码杂凑算法原理及实现(附源码)

    相关文章: 国密SM3哈希算法原理及实现(附源码) SHA1哈希算法原理及实现(附源码) MD5哈希算法原理及实现(附源码) MD4哈希算法原理及实现(附源码) MD2哈希算法原理及实现(附源码) M ...

  5. php使用ecc算法进行签名,密码之ECC算法原理的认识

    转:https://blog.csdn.net/sszgg2006/article/details/41945163 公开密钥算法总是要基于一个数学上的难题.比如RSA 依据的是:给定两个素数p.q ...

  6. 机器人门禁控制盒怎么接线方法_RFID门禁系统原理、初始密码、密码修改方法...

    现在,科技进步的速度越来越快,如今就连门锁都使用上了高科技,不知道大家有没有听说过RFID门禁系统,所谓RFID就是Radio Frequency Identification的缩写,即射频识别,可能 ...

  7. RSA算法与维吉尼亚密码

    RSA算法 RSA算法描述 第1步:用两个很大的互异的质数p和q(p和q必须保密),计算它们的乘积n=pq:n是模数. 第2步:选择一个比n小的数e,它与(p-1)(q-1)互为质数,即除了1以外,e ...

  8. XDOJ例题及答案第八更 密码编译 密码强度 排序2 排序3 排序算法比较器 判断奇偶性 平均数 气温波动 亲和数 求交错序列前N项和 求平均值求奇数的和

    目录 密码编译 密码强度 排序2 排序3 排序算法比较器 判断奇偶性 平均数 气温波动 亲和数 求交错序列前N项和 求平均值 求奇数的和 密码编译 #include<stdio.h> in ...

  9. RC4加密解密算法原理及实现对文件的加解密

    本文简单实现了RC4算法对于文件的加解密,并已经验证成功.同时实现了对RC4算法加解密较大文件的测速 RC4加密解密算法的原理: 首先,通过我的理解,RC4算法所依赖的最根本原理是:对明文使用同一个密 ...

最新文章

  1. 蓝桥杯-搭积木-java
  2. iOS - OC NSPoint 位置
  3. 自定义SOAP消息头
  4. manila 文件共享存储服务
  5. python一个月能学成嘛-一个月可以学好基础的Python吗?
  6. 实验四、主存空间的分配和回收模拟
  7. Deep Learning论文笔记之(二)Sparse Filtering稀疏滤波
  8. 微软计划2008年初发布Windows Server2008
  9. MySQL_多表链接查询
  10. python 3.5 import theano ::hypot error
  11. erp oracle mrp,OracleERP用戶手册-MRP.doc
  12. 常用元器件使用方法4:一种Micro-SIM卡连接器的使用方法
  13. 解决go get时,遇到unrecognized import path的问题
  14. 用万用表测量NPN、PNP、NMOS、PMOS的好坏或分极
  15. 计算机c盘无法访问,win10系统无法打开C盘,提示拒绝访问的解决办法
  16. 爬虫爬取的网页源代码是\uxxxx格式的,如何进行解码?
  17. “高定美学”品牌矩阵:「莲玉芳华」「琢我」「佐我」佐我气运系列之进击
  18. 为何64位的.NET程序不能申请超过2G的空间
  19. Redis入门到实战(实战篇)缓存更新、穿透、雪崩、击穿!
  20. 移动硬盘安装ubuntu(UEFI)——遇到的问题以及解决方法

热门文章

  1. 软件测试 | Jmeter 性能测试工具的实战应用《接口性能压测》的操作步骤详解
  2. android开发录屏功能吗,Android-录屏APP该怎么实现?
  3. 2022年职称申报应该注意哪些问题?这些细节问题你都做好了吗?
  4. java awt安装_数据库安装过程报错:at.java.awt.X11GraphicsEnvironment解决之道
  5. android指定app抓包 无需root
  6. 扫描docker安装的工具_使用 docker 安装 OpenVAS 漏洞扫描软件
  7. java冰法_Java基础学习笔记二 Java基础语法
  8. 「津津乐道播客」#305 厂长来了:食品配料表背后的故事(feat. OATOAT)
  9. nodeJS如何快速升级降级?
  10. zookeeper not connected