对称加密算法之RC4介绍及OpenSSL中RC4常用函数使用举例
RC4是一种对称密码算法,它属于对称密码算法中的序列密码(streamcipher,也称为流密码),它是可变密钥长度,面向字节操作的流密码。
RC4是流密码streamcipher中的一种,为序列密码。RC4加密算法是Ron Rivest在1987年设计出的密钥长度可变的加密算法簇。起初该算法是商业机密,直到1994年,它才公诸于众。由于RC4具有算法简单,运算速度快,软硬件实现都十分容易等优点,使其在一些协议和标准里得到了广泛应用。
流密码也属于对称密码,但与分组加密算法不同的是,流密码不对明文数据进行分组,而是用密钥生成与明文一样长短的密码流对明文进行加密,加解密使用相同的密钥。
RC4算法特点:(1)、算法简洁易于软件实现,加密速度快,安全性比较高;(2)、密钥长度可变,一般用256个字节。
对称密码的工作方式有四种:电子密码本(ECB, electronic codebook)方式、密码分组链接(CBC, cipherblock chaining)方式、密文反馈(CFB, cipher-feedback)方式、输出反馈(OFB, output-feedback)方式。
RC4算法采用的是输出反馈工作方式,所以可以用一个短的密钥产生一个相对较长的密钥序列。
OFB方式的最大的优点是消息如果发生错误(这里指的是消息的某一位发生了改变,而不是消息的某一位丢失),错误不会传递到产生的密钥序列上;缺点是对插入攻击很敏感,并且对同步的要求比较高。
RC4的执行速度相当快,它大约是分块密码算法DES的5倍,是3DES的15倍,且比高级加密算法AES也快很多。RC4算法简单,实现容易。RC4的安全保证主要在于输入密钥的产生途径,只要在这方面不出现漏洞,采用128bit的密钥是非常安全的。
RC4算法加密流程:包括密钥调度算法KSA和伪随机子密码生成算法PRGA两大部分(以密钥长度为256个字节为例)。
密钥调度算法:首先初始化状态矢量S,矢量S中元素的值被按升序从0到255排列,即S[0]=00, S[1]=1, …, S[255]=255.同时建立一个临时矢量T,如果密钥K的长度为256字节,则将K赋给T。否则,若密钥长度为keylen字节,则将K的值赋给T的前keylen个元素,并循环重复用K的值赋给T剩下的元素,直到T的所有元素都被赋值。这些预操作可概括如下:
/*初始化*/
for i = 0 to 255 doS[i]= i;T[i]= K[i mod keylen];
然后用T产生S的初始置换,从S[0]到S[255],对每个S[i],根据由T[i]确定的方案,将S[i]置换为S中的另一字节:
/*S的初始序列*/
j= 0
for i = 0 to 255 doj= (j + S[i] + T[i]) mod 256swap(S[i],S[j]);
因为对S的操作仅是交换,所以惟一的改变就是顺序的改变。S仍然包含从0到255的所有元素,在初始化的过程中,密钥的主要功能是将S-box搅乱,代码中的变量i确保S-box的每个元素都得到处理,变量j保证S-box的搅乱是随机的。因此不同的S-box在经过伪随机子密码生成算法的处理后可以得到不同的子密钥序列,并且该序列是随机的。
伪随机序列生成算法:矢量S一旦完成初始化,输入密钥就不再被使用。密钥流的生成是从S[0]到S[255],对每个S[i],根据当前S的值,将S[i]与S中的另一字节置换。当S[255]完成置换后,操作继续重复,从S[0]开始:
/*密钥流的产生*/
i,j = 0;
while(true)i= (i + 1) mod 256;j= (j + S[i]) mod 256;swap(S[i],S[j]);t= (S[i] + s[j]) mod 256;k= S[t]
伪随机序列一旦生成,就得到子密码sub_k,把子密钥和明文进行异或运算,得到密文。解密过程也完全相同。加密中,只需将k的值与下一明文字节异或;相反解密中,将k的值与下一密文字节异或就可以还原出明文信息。算法描述为:
for(i = 0; i < textlength; i ++)ciphertext[i]= keystream[i] ^ plaintext[i]
RC4算法存在的问题:因为RC4算法具有实现简单,加密速度快,对硬件资源耗费低等优点,使其跻身于轻量级加密算法的行列。但是其简单的算法结构也容易遭到破解攻击,RC4算法的加密强度完全取决于密钥,即伪随机序列生成,而真正的随机序列是不可能实现,只能实现伪随机。这就不可避免出现密钥的重复。RC4算法不管是加密还是解密,都只进行了异或运算,这就意味着,一旦子密钥序列出现了重复,密文就极有可能被破解。
具体破解过程如下:若明文、密钥是任意长的字节,可以用重合码计数法(counting coincidence)找出密钥长度。把密文进行各种字节的位移,并与原密文进行异或运算,统计那些相同的字节。如果位移是密钥长度的倍数,那么超过60%的字节将是相同的;如果不是,则至多只有0.4%的字节是相同的,这叫做重合指数(index of coincidence)。找出密钥长度倍数的最小位移,按此长度移到密文,并且和自身异或。由于明文每字节有1.3位的实际信息,因此有足够的冗余度去确定位移的解密。对所有的密钥,输出密钥流的前几个字节不是随机的,因此极有可能会泄露密钥的信息。如果一个长期使用的密钥与一个随机数串联产生RC4算法密钥,那么可以通过分析大量由该密钥加密的密文得到这个长期使用的密钥。解决该问题的办法是:抛弃密钥流最初的那部分数据。
RC4is a stream cipher with variable key length. Typically, 128 bit (16 byte) keys are used for strong encryption, butshorter insecure key sizes have been widely used due to export restrictions.
1. RC4_set_key:sets up theB<RC4_KEY> B<key> using the B<len> bytes long key atB<data>.
2. RC4: encrypts or decrypts the B<len>bytes of data at B<indata> using B<key> and places the result atB<outdata>. Repeated RC4() callswith the same B<key> yield a continuous key stream. Since RC4 is a streamcipher (the input is XORed with a pseudo-random key stream to produce theoutput), decryption uses the same function calls as encryption.
以下是测试代码:
namespace {
void RC4_Encrypt(const unsigned char* cleartext, int length, const std::string& key, unsigned char* ciphertext)
{RC4_KEY rc4key;RC4_set_key(&rc4key, key.length(), (const unsigned char*)key.c_str());RC4(&rc4key, length, cleartext, ciphertext);
}void RC4_Decrypt(const unsigned char* ciphertext, int length, const std::string& key, unsigned char* cleartext)
{RC4_KEY rc4key;RC4_set_key(&rc4key, key.length(), (const unsigned char*)key.c_str());RC4(&rc4key, length, ciphertext, cleartext);
}} // namespaceint test_openssl_rc4()
{const std::string cleartext = "中国北京12345$abcde%ABCDE@!!!!";const std::string key = "beijingchina1234567890ABCDEFGH!!!";char* cleartext_encode = b64_encode((const unsigned char*)cleartext.c_str(), cleartext.length());int length = strlen(cleartext_encode);fprintf(stdout, "cleartext encode length: %d\n", length);std::unique_ptr<unsigned char[]> ciphertext(new unsigned char[length]);RC4_Encrypt((const unsigned char*)cleartext_encode, length, key, ciphertext.get());std::unique_ptr<unsigned char[]> decrypt(new unsigned char[length]);RC4_Decrypt(ciphertext.get(), length, key, decrypt.get());unsigned char* ciphertext_decode = b64_decode((char*)decrypt.get(), length);fprintf(stdout, "src cleartext: %s\n", cleartext.c_str());fprintf(stdout, "genarate ciphertext: %s\n", ciphertext.get());fprintf(stdout, "dst cleartext: %s\n", ciphertext_decode);int ret = 0;if (strcmp(cleartext.c_str(), (const char*)ciphertext_decode) == 0) {fprintf(stdout, "RC4 decrypt success\n");} else {fprintf(stderr, "RC4 decrypt fail\n");ret = -1;}free(cleartext_encode);free(ciphertext_decode);return ret;
}
执行结果如下:
RC4理论摘自:《RFID中轻量级加密算法及实现技术的研究》
GitHub:https://github.com/fengbingchun/OpenSSL_Test
相关文章:

SpringMVC中实现的token,防表单重复提交
一:首先创建一个token处理类 ,这里的类名叫 TokenHandlerprivate static Logger logger Logger.getLogger(TokenHandler.class);static Map<String, String> springmvc_token new HashMap<String, String>();//生成一个唯一值的tokenSupp…

利用CxImage实现编解码Gif图像代码举例
Gif(Graphics Interchange Format,图形交换格式)是由CompuServe公司在1987年开发的图像文件格式,分为87a和89a两种版本。Gif是基于LZW算法的无损压缩算法。Gif图像是基于颜色表的,最多只支持8位(256色)。Gif减少了图像调色板中的色彩数量&…

SpringBoot b2b2c 多用户商城系统 ssm b2b2c
来源: SpringBoot b2b2c 多用户商城系统 ssm b2b2c用java实施的电子商务平台太少了,使用spring cloud技术构建的b2b2c电子商务平台更少,大型企业分布式互联网电子商务平台,推出PC微信APP云服务的云商平台系统,其中包括…

AI“生死”落地:谁有资格入选AI Top 30+案例?
2019 年,人工智能应用落地的重要性正在逐步得到验证,这是关乎企业生死攸关的一环。科技巨头、AI 独角兽还有起于草莽的创业公司在各领域进行着一场多方角斗。进行平台布局的科技巨头们,正在加快承载企业部署 AI 应用的步伐,曾经无…

liunx 下su 和sudo 的区别
一. 使用 su 命令临时切换用户身份1、su 的适用条件和威力su命令就是切换用户的工具,怎么理解呢?比如我们以普通用户beinan登录的,但要添加用户任务,执行useradd ,beinan用户没有这个权限,而这个权限恰恰由…
非对称加密算法之RSA介绍及OpenSSL中RSA常用函数使用举例
RSA算法,在1977年由Ron Rivest、Adi Shamirh和LenAdleman,在美国的麻省理工学院开发完成。这个算法的名字,来源于三位开发者的名字。RSA已经成为公钥数据加密标准。 RSA属于公开密钥密码体制。公开密钥体制就是产生两把密钥,一把…

依图科技CEO朱珑:“智能密度”对AI发展意味着什么?
8月9日,由中央网信办、工业和信息化部、公安部联合指导,厦门市政府主办的“中国人工智能峰会”于厦门召开。中国工程院院士、北京大学教授高文,依图科技创始人兼CEO朱珑博士等出席峰会并发表了主题演讲。当前,人工智能正在扮演越来…

Office 2016使用NTKO OFFICE控件提示“文件存取错误”的解决办法
2019独角兽企业重金招聘Python工程师标准>>> 之前使用NTKO,电脑安装的说OFFICE2007,但是前2天电脑固态硬盘坏了 ,重新安装了系统,安装的说win10和office2016,再访问网站使用ntko时,却提示“文件存取错误”&…
如何制作一个类似Tiny Wings的游戏 Cocos2d-x 2.1.4
在第一篇《如何使用CCRenderTexture创建动态纹理》基础上,增加创建动态山丘,原文《How To Create A Game Like Tiny Wings with Cocos2D 2.X Part 1》,在这里继续以Cocos2d-x进行实现。有关源码、资源等在文章下面给出了地址。 步骤如下&…

腾讯优图开源业界首个3D医疗影像大数据预训练模型
整理 | Jane出品 | AI科技大本营(ID:rgznai100)近日,腾讯优图首个医疗AI深度学习预训练模型 MedicalNet 正式对外开源。这也是全球第一个提供多种 3D 医疗影像专用预训练模型的项目,将为全球医疗AI发展提供基础。许多研…

接口冲突的一种解决方法
问题描述:在一个大的项目中往往会包括很多模块,会有不同的部门或公司来负责实现某个模块,也有可能有第三方或客户的参与。假如他们都用到了某个开源软件,底层模块根据自身的需求对这个开源软件进行了修改或裁减。上层也用到了此开…

程序员:请你不要对业务「置之不理」
成长是条孤独的路,一个人会走得更快;有志同道合者同行,会走得更远。本篇内容整理自 21 天鲲鹏新青年计划线上分享内容。鲲鹏新青年计划是由 TGO 鲲鹏会组织的线上分享活动,希望能帮助更多同学一起学习、成长。12 月 28 日…

史上最简单的人脸识别项目登上GitHub趋势榜
来源 | GitHub Trending整理 | Freesia译者 | TommyZihao出品 | AI科技大本营(ID: rgznai100)导读:近日,一个名为 face_recognition 的人脸识别项目登上了 GitHub Trending 趋势榜,赚足了眼球。自开源至截稿࿰…

Centos 64位 Install certificate on apache 即走https协议
2019独角兽企业重金招聘Python工程师标准>>> 一: 先要apache 请求ssl证书的csr 一下是步骤: 重要注意事项 An Important Note Before You Start 在生成CSR文件时同时生成您的私钥,如果您丢了私钥或忘了私钥密码,则颁发 证书给您…

C/C++中“#”和“##”的作用和用法
在C/C的宏中,”#”的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。而”##”被称为连接符(concatenator),用来将两个子串Token连接为一个Token。注意这里连接…
国贫县山西永和:“一揽子”保险“保”脱贫
永和是吕梁山特困连片地区的深度贫困县,生产生活条件极差。 范丽芳 摄 永和是吕梁山特困连片地区的深度贫困县,生产生活条件极差。 范丽芳 摄 中新网太原1月16日电 题:国贫县山西永和:“一揽子”保险“保”脱贫 作者范丽芳 李海金…
内存泄漏检测工具VLD在VS2010中的使用举例
Visual LeakDetector(VLD)是一款用于Visual C的免费的内存泄露检测工具。它的特点有:(1)、它是免费开源的,采用LGPL协议;(2)、它可以得到内存泄露点的调用堆栈,可以获取到所在文件及行号;(3)、它可以得到泄露内存的完整…

天下武功,唯快不破,论推荐系统的“实时性”
作者 | 王喆转载自知乎王喆的机器学习笔记导读:周星驰著名的电影《功夫》里面有一句著名的台词——“天下武功,无坚不摧,唯快不破”。如果说推荐系统的架构是那把“无坚不摧”的“玄铁重剑”,那么推荐系统的实时性就是“唯快不破”…
新疆兵团开展迎新春“送文化下基层”慰问演出活动
演员表演舞蹈。 戚亚平 摄 演员表演舞蹈。 戚亚平 摄演员表演豫剧《花木兰》选段。 戚亚平 摄为物业公司员工送春联。 戚亚平 摄公安民警收到春联后留影。 戚亚平 摄走进退休职工家中表演节目。 戚亚平 摄为退休职工送春联。 戚亚平 摄 1月16日,2019年迎新春新疆生产…

Python爬取B站5000条视频,揭秘为何千万人为它流泪
作者 | Yura编辑 | 胡巍巍来源 | CSDN(ID:CSDNnews)导语:我们特邀作者Yura爬取B站5000条视频,为你揭秘电影《哪吒》的更多“优秀梗”,看完还能Get新技能,赶快往下滑吧。这个夏天,《哪…

父域与子域之的信任关系
搭了一个测试环境,做一个父、子域间信任关系的测试,过程如下:两台测试服务器,主域为primary.com,子域为child.primary.com客户机Clientpri加入父域,客户机Clientcli加入子域,父域中有一个用户为…

Ubantu安装maven
2019独角兽企业重金招聘Python工程师标准>>> 一、下载maven http://maven.apache.org/download.cgi 二、解压到指定目录 tar -xvf apache-maven-3.6.0-bin.tar.gz 三、添加环境变量 cd /etc vi profile 向其中添加 export M2_HOMEmaven所在目录 export M2$M2_HOME/b…

Leptonica在VS2010中的编译及简单使用举例
在tesseract-ocr中会用到leptonica库,这里对leptonica简单介绍下。Leptonica是一个开源的图像处理和图像分析库,它的license是BSD 2-clause。它主要包括的操作有:位图操作、仿射变换、形态学操作、连通区域填充、图像变换及像素掩模、融合、增…

IJCAI 2019精选论文一览,从底层到应用都有了
作者 | 神经小姐姐来源 | HyperAI超神经(ID: HyperAI)导语:为期一周的 IJCAI 第一天议程已经圆满结束。在前三天的工作坊上,全球各地人工智能行业人士,在此讨论 AI 在各个领域与方向的最新研究成果与未来动向。超神经特…

UITableView 添加长按手势UILongPressGestureRecognizer
2019独角兽企业重金招聘Python工程师标准>>> 给UITableView 添加长按手势,识别长按哪一行。 长按手势类UILongPressGestureRecognizer, 属性minimumPressDuration表示最短长按的时间 添加手势代码: UILongPressGestureRecogniz…

像我这种垃圾学校出来的人...【原话,不是我编的】
今天这标题,是咱们先行者课程的学生的原话,不是我编的,咱有截图为证,我这没别的意思,就是想说一下我自己的想法, 这种情况怎么办呢?也得生活啊,对吧,也不能人人都上清华北…

二维码Data Matrix简介及在VS2010中的编译
Data Matrix 二维条码原名Datacode,由美国国际资料公司(International Data Matrix, 简称ID Matrix)于1989年发明。Data-Matrix二维条码是一种矩阵式二维条码。Data Matrix符号由规则排列的深浅色正方形模块构成,每个正方形模块就是一个基本单元&#x…

一、数据库设计与性能优化--概述
前言我1998年第一次接触SQL Server 6.5 for Windows NT 4.0,当时的感觉就认为SQL Server只是一个功能强大的Excel文件。现在回想起来,当年抱着这样一种态度,我开发的那些应用程序应该是非常幼稚的,其性能可想而知。记得那时候随便…

第四范式戴文渊:AI落地,为什么不能照搬教科书?
“年少成名”、“天才”,在中国 AI 行业里用这两个词同时形容一个人的牛人不多,第四范式创始人戴文渊位列其中。在上海交通大学就读本科期间,戴文渊就带领三人团队夺得了 2005 年 ACM 的世界冠军和三个亚洲冠军,并担任ACM竞赛教练…

Kong Api 网关使用 docker 部署
Kong 镜像: https://hub.docker.com/_/kong 官网给定的用户安装手册上并没有设置 PG 的密码,导致如下问题无法启动 nginx: [error] init_by_lua error: /usr/local/share/lua/5.1/kong/init.lua:277: [PostgreSQL error] failed to >retrieve server_version_num…