RC4算法原理与应用 —— 密码与密码工程实践No.1
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实现步骤:
- 随机选取一个密钥Key,初始化 S 盒。
- iti_tit遍历 S 盒中的每一个位置,iti_tit的每一次更新都会使得 jtj_tjt 在 St−1S_{t-1}St−1 [iti_tit] 和Key的作用下产生一个新值。
- 交换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 盒中的元
素的位置,同时从中选择一元素输出,即伪随机序列,也
称密钥流序列。
- 根据 KSA 的初始状态表S0S_0S0,初始化针iti_tit和jtj_tjt。
- 更新该算法中的 j, 同时交换StS_tSt中iti_tit和jtj_tjt对
应的字节。 - 伪随机序列生成器不断地变换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相关推荐
- RC4算法原理、Java实现RC4加密算法、DES AES RC4算法比较
DES AES RC4算法比较 根据密钥类型的不同,加密算法分为对称和非对称两种.对称加密系统是指加密和解密均采用同一把密钥. 对称加密算法是最常用的加密算法,优势在于算法公开,计算量小,加密效率高. ...
- Java实现凯撒密码、维吉尼亚密码、双换位密码、RC4算法加密
文章目录 前言 一.凯撒密码 二.维吉尼亚密码 三.双换位密码 四.RC4算法加密 前言 本博文为信息安全与支付课程的课程作业. 一.凯撒密码 文件有:Caesar.java.输入文件input1.t ...
- 安全密码c语言编程,商用密码算法原理与C语言实现
2020年1月1日,<中华人民共和国密码法>正式施行.国家鼓励和支持密码科学技术研究与应用,促进密码科学技术进步与创新,加强密码人才培养和队伍建设,采取多种形式加强密码安全教育.本书是在国 ...
- 国密SM3密码杂凑算法原理及实现(附源码)
相关文章: 国密SM3哈希算法原理及实现(附源码) SHA1哈希算法原理及实现(附源码) MD5哈希算法原理及实现(附源码) MD4哈希算法原理及实现(附源码) MD2哈希算法原理及实现(附源码) M ...
- php使用ecc算法进行签名,密码之ECC算法原理的认识
转:https://blog.csdn.net/sszgg2006/article/details/41945163 公开密钥算法总是要基于一个数学上的难题.比如RSA 依据的是:给定两个素数p.q ...
- 机器人门禁控制盒怎么接线方法_RFID门禁系统原理、初始密码、密码修改方法...
现在,科技进步的速度越来越快,如今就连门锁都使用上了高科技,不知道大家有没有听说过RFID门禁系统,所谓RFID就是Radio Frequency Identification的缩写,即射频识别,可能 ...
- RSA算法与维吉尼亚密码
RSA算法 RSA算法描述 第1步:用两个很大的互异的质数p和q(p和q必须保密),计算它们的乘积n=pq:n是模数. 第2步:选择一个比n小的数e,它与(p-1)(q-1)互为质数,即除了1以外,e ...
- XDOJ例题及答案第八更 密码编译 密码强度 排序2 排序3 排序算法比较器 判断奇偶性 平均数 气温波动 亲和数 求交错序列前N项和 求平均值求奇数的和
目录 密码编译 密码强度 排序2 排序3 排序算法比较器 判断奇偶性 平均数 气温波动 亲和数 求交错序列前N项和 求平均值 求奇数的和 密码编译 #include<stdio.h> in ...
- RC4加密解密算法原理及实现对文件的加解密
本文简单实现了RC4算法对于文件的加解密,并已经验证成功.同时实现了对RC4算法加解密较大文件的测速 RC4加密解密算法的原理: 首先,通过我的理解,RC4算法所依赖的最根本原理是:对明文使用同一个密 ...
最新文章
- 蓝桥杯-搭积木-java
- iOS - OC NSPoint 位置
- 自定义SOAP消息头
- manila 文件共享存储服务
- python一个月能学成嘛-一个月可以学好基础的Python吗?
- 实验四、主存空间的分配和回收模拟
- Deep Learning论文笔记之(二)Sparse Filtering稀疏滤波
- 微软计划2008年初发布Windows Server2008
- MySQL_多表链接查询
- python 3.5 import theano ::hypot error
- erp oracle mrp,OracleERP用戶手册-MRP.doc
- 常用元器件使用方法4:一种Micro-SIM卡连接器的使用方法
- 解决go get时,遇到unrecognized import path的问题
- 用万用表测量NPN、PNP、NMOS、PMOS的好坏或分极
- 计算机c盘无法访问,win10系统无法打开C盘,提示拒绝访问的解决办法
- 爬虫爬取的网页源代码是\uxxxx格式的,如何进行解码?
- “高定美学”品牌矩阵:「莲玉芳华」「琢我」「佐我」佐我气运系列之进击
- 为何64位的.NET程序不能申请超过2G的空间
- Redis入门到实战(实战篇)缓存更新、穿透、雪崩、击穿!
- 移动硬盘安装ubuntu(UEFI)——遇到的问题以及解决方法
热门文章
- 软件测试 | Jmeter 性能测试工具的实战应用《接口性能压测》的操作步骤详解
- android开发录屏功能吗,Android-录屏APP该怎么实现?
- 2022年职称申报应该注意哪些问题?这些细节问题你都做好了吗?
- java awt安装_数据库安装过程报错:at.java.awt.X11GraphicsEnvironment解决之道
- android指定app抓包 无需root
- 扫描docker安装的工具_使用 docker 安装 OpenVAS 漏洞扫描软件
- java冰法_Java基础学习笔记二 Java基础语法
- 「津津乐道播客」#305 厂长来了:食品配料表背后的故事(feat. OATOAT)
- nodeJS如何快速升级降级?
- zookeeper not connected