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算法所依赖的最根本原理是:对明文使用同一个密 ...
最新文章
- Oracle错误ORA-01800——ORA-01899
- php错误以及常用笔记
- android开发入门与实践_Electron从入门到实践,前端开发者开发桌面App的最佳选择...
- 物理内存不够用,临时增大Linux交换分区的方法
- UVA 558 SPFA 判断负环
- ISA2006之二---client
- 人群与网络:关系的平衡
- C++游戏编程-走迷宫详解
- B站笔试真题之[编程题]脸滚键盘
- Data Structure - Pairing Heap (Java)
- 看图说话!这个 AI 商品识别系统开源了!
- ElasticSearch7学习笔记之Mapping
- matlab图像进行变换
- 数据库的学习笔记(一)
- Java毕设项目线上教学平台(java+VUE+Mybatis+Maven+Mysql)
- gnome桌面无法显示的解决
- 2021年秋季PAT乙级题解(C语言)
- pycharm 激活码2018年9月22日亲测有效
- 招聘 | 上海交通大学医学院附属精神卫生中心诚招科研助理
- 【STM32H7】第4章 RTX5操作系统移植(MDK AC5)
热门文章
- [GUI] ESP32(idf)驱动3.5寸SPI-TFT屏移植LittleVGL
- Element-ui中 使用图片查看器(el-image-viewer) 预览图片
- 拓商:在拼多多开店,商家如何做好推广?
- android模拟器被覆盖,教大家如何顺利恢复雷电安卓模拟器的数据
- Win10+Ubuntu18.04双系统安装配置教程(七)——安装搜狗输入法
- python 两个dataFrame取不同部分
- React-Hook API个人见解
- 怎么从开源库github.com 下载
- 人工智能那么厉害,那它懂幽默吗?(楚才国科)
- 实习打杂记录,xboot中使已上传文件能够下载。