基于RSA和AES的混合加密算法实现----2020年西北工业大学网络空间安全学院夏令营大作业

9 篇文章 4 订阅
订阅专栏


前言:由于今年疫情影响,保研夏令营都改为了线上模式,我有幸参加了西工大网安学院的夏令营,并拿到了优秀营员,考核形式为一周时间内编程实现大作业(无面试),因此分享一下当时写的大作业,希望对大家有所帮助。

一、设计内容

编写一段程序,实现两个主机之间的密钥分发和加密传输。
要求:
(1)用RSA算法实现两个主机之间的密钥分发,分发的密钥是“12345678”;(2)用分发的密钥和AES加密算法,实现两个主机之间的加密数据传输,传输的数据是“NPU”;
(3)两个步骤在程序中自动执行完,无手动参与;程序可以在同一台主机上完成,但数据必须经过网络传输(可以本地发送,本地接收);
(4)RSA和AES算法必须是源码编译得到,不能用编译过的库文件;RSA和AES算法的源码可以来自于网络或其他任意渠道;
(5)用python或C/C++语言实现程序,写出实现技术文档。

二、基本思路实现

(1)通过编写客户端程序和服务器程序,利用windows下的socket套接字来实现同一台主机上客户端与服务器进程之间数据的网络传输,用来实现密钥的分发和数据的加密传输。
(2)密钥的传输基于RSA算法实现,由服务器根据RSA算法生成公钥和私钥,然后将公钥传输给客户端,由客户端根据公钥负责将AES加密算法的密钥进行加密传给服务器,服务器根据自己的私钥和RSA算法进行解密处理,得到AES的密钥。由于RSA是非对称加密算法,因此即使攻击者截取到了加密的数据和公钥,也会因为没有私钥而无法解密,保证了密钥的安全传输。
(3)数据之间的传输基于AES算法实现,由客户端根据先前的密钥和AES算法对数据实现加密传输,再在服务器端根据计算得到的AES密钥对数据进行解密处理,从而得到最终的数据。

三、设计原理与流程

密钥分发和加密传输总体流程图如下:
在这里插入图片描述

3.1. 建立socket套接字连接

3.1.1建立socket连接原理:

在网络中,要全局的标识一个参与通信的进程,需要三元组:协议,IP地址以及端口号。要描述两个应用进程之间的端到端的通信关联需要五元组:协议,信源主机IP,信源应用进程端口,信宿主机IP,信宿应用进程端口。为了实现两个应用进程的通信连接,提出了套接字的概念。套接字可以理解为通信连接的一端,将两个套接字连接在一起,可以实现不同进程之间的通信。
在本程序中,首先通过socket函数分别为客户端和服务器创建套接字,然后定义家族协议、主机地址和主机端口等,得到socket嵌套字,通过bind函数在服务器端将套接字地址与所创建的套接字号连接起来,设定套接字为监听状态,准备接收由客户端进程发出的连接请求。客户端提出与服务器建立连接的请求,如果服务器进程接受请求,则服务器进程与客户机进城之间便建立了一条通信连接,之后便可以通过recv函数和send函数分别实现在已建立的套接字上接收和发送数据,实现同一台主机下数据之间的网络传输。

3.1.2建立socket连接的流程图如下:

在这里插入图片描述

3.2. RSA算法实现密钥加密分发

3.2.1 RSA算法加密原理:

在对称加密体系中,由于对称加密的加密和解密使用的是同一个密钥,所以对称加密的安全性就不仅仅取决于加密算法本身的强度,更取决于密钥是否被安全的保管,因此加密者如何把密钥安全的传递到解密者手里,就成了对称加密面临的关键问题。比如,我们客户端肯定不能直接存储对称加密的密钥,因为被反编译之后,密钥就泄露了,数据安全性就得不到保障,所以实际中我们一般都是客户端向服务端请求对称加密的密钥,而且密钥还得用非对称加密算法加密后再传输。由于RSA算法是非对称加密算法,因此RSA算法便可以解决密钥的分发传输问题。
在RSA算法中,先由服务器生成一对RSA密钥,其中之一是保密密钥,由用户保存,另一个则为公开密钥,可对外公开。当客户端想向服务器发送消息时,便通过公开的密钥对数据进行加密传输,在服务器端根据私钥便可以实现对加密数据的解密。
在本程序中,RSA算法的步骤如下:
1.由服务器端先随机选择两个不相等的质数p和q,选择的质数越大,则越难破解;然后计算p和q的乘积n,n的长度即为密钥长度,在实际应用中,RSA的密钥一般为1024位;
2.计算n的欧拉函数φ(n)=(p-1)*(q-1),随机选择一个整数e,条件是1< e < φ(n),且e与φ(n)互质;
3. 计算e对于φ(n)的模反元素d,所谓“模反元素”就是指有一个整数d,可以使得ed被φ(n)除的余数为1。
ed ≡ 1 (mod φ(n)),即 ed – 1 = k φ(n)
通过扩展欧几里得算法求解得到d的值作为私钥的一部分。
4.将n和e封装成公钥,n和d封装成私钥,将公钥通过网络传输给客户端,实现RSA密钥的分发,客户端得到RSA公钥后,对AES的密钥进行加密传输给服务器端,即用公钥(n,e)算出m^e≡c (mod n)中c的值;服务器利用私钥解密得到AES的密钥,同样也是利用m^e≡c (mod n)算出c的值即为AES的密钥。

3.2.2 RSA算法加密流程图:

在这里插入图片描述

3.3. AES算法实现数据加密传输

3.3.1 AES算法加密原理:

AES算法(高级加密标准,Advanced Encryption Standard),即Rij-ndael 算法,是一个对称分组密码算法。数据分组长度必须是128 bits,使用的密钥长度为128,192或256 bits。对于三种不同密钥长度的 AES 算法,分别称为“AES-128”、“AES-192”、“AES-256”。
在本程序中采用的是AES-128标准,CBC加密模式。在该标准中,密钥长度必须为128位,也就是16字节;AES是分组密码,也就是将需要加密的明文分成组,每个分组的长度为128位,同样是16个字节,如果最后一段或者密钥长度不够16个字节,就需要用Padding来把这段数据填满16个字节,然后分别对每段数据进行加密,最后再把每段加密数据拼起来形成最终的密文。
Padding用来把不满16个字节的分组数据填满16个字节,有三种模式PKCS5、PKCS7和NOPADDING。PKCS5是指分组数据缺少几个字节,就在数据的末尾填充几个字节的几,比如缺少5个字节,就在末尾填充5个字节的5。PKCS7是指分组数据缺少几个字节,就在数据的末尾填充几个字节的0,比如缺少7个字节,就在末尾填充7个字节的0。NoPadding是指不需要填充,也就是说数据的发送方肯定会保证最后一段数据也正好是16个字节。解密端需要使用和加密端同样的Padding模式,才能准确的识别有效数据和填充数据。一般采用在末尾填充0的方式。
在AES加密过程的步骤如下:
1.首先AES加密会把明文按128位16字节切成一段一段的数据,如果数据的最后不够16个字节,则用Padding进行填充;
2.对密钥进行密钥扩展,所谓密钥扩展,就是根据初始密钥生成后面的10轮密钥的操作,在AES-128标准中,一共会对每一组明文进行11轮加密,所以AES会通过一个简单快速的混合操作,根据初始密钥依次生成后面10轮的密钥,每一轮的密钥都是依据上面一轮生成的,在这种模式下,每一轮的密钥都作为下一轮密钥的输入对明文进行异或运算,具体过程如下图所示:

在这里插入图片描述
3.初始轮:将128位的明文数据与128位的初始密钥进行异或操作;
4.重复轮:将字节混淆、行移位、列混轮、加轮密钥这四个操作重复执行九轮;
将初始轮得到的状态矩阵经过一个置换盒,会输出一个新的矩阵,我们这里叫它为字节混淆矩阵
对字节混淆矩阵进行行移位,每一行分别向左挪0、1、2、3个字节,然后重新放一下字节,这样行移位就算完成,得到的新矩阵称之为行移位矩阵
然后用模不可约多项式将每列混乱,得到一个新的矩阵,我们称之为列混乱矩阵
在这里插入图片描述
在每一轮结束的时候,我们需要把列混乱矩阵和下一轮的密钥做一下异或操作,得到一个新的矩阵,我们这里称之为加轮秘钥矩阵;
128位密钥重复轮重复执行9次:上一轮的加轮密钥矩阵就是下一轮的状态矩阵,拿着这个新的状态矩阵返回去,重复执行字节混淆、行移位、列混乱、加轮密钥这四个操作9次,就会进入加密的最终轮了。
5.最终轮:和重复轮的操作差不多,只是在最终轮我们丢弃了列混乱这个操作,因为我们不会再有下一轮了,所以没必要再进行列混乱,再进行的话也加强不了安全性了,只会白白的浪费时间、拖延加密效率。最终轮结束后,我们就算完成了一次AES加密,就会得到一块明文数据的密文。
因此,每执行一次AES加密,其实内部共进行了11轮加密,包括1个初始轮,9个拥有4个操作的重复轮,1个拥有3个操作的最终轮,才算得到密文。而AES的解密方法与加密方法类似,如下流程图所示。

3.3.2 AES算法加密解密流程图:

在这里插入图片描述

四、实验过程与运行结果

4.1. 网络传输连接的建立

通过socket套接字建立客户端与服务器之间的网络传输连接。在服务器端,先启动windows的socket服务,然后定义服务器、家族协议,并得到主机IP、端口和socket嵌套字,通过bind函数在服务器端将套接字地址与所创建的套接字号连接起来,然后利用accept()函数与客户端的connect()函数之间建立TCP连接,在这之后便可以通过recv()函数与send()函数建立与客户端的通信。
客户端与服务器端同理,当开启windows的socket后定义一系列参数,然后通过connect()函数建立与服务器之间的数据连接。
建立连接后的运行结果如下:
在这里插入图片描述
由运行结果可以发现,当客户端与服务器建立socket套接字连接后,便可以相互发送消息,且IP地址都为127.0.0.1,即本地环回地址。

4.2. RSA算法的实现与加密解密

在服务器端,随机产生两个10000以内的质数作为p和q的值,然后计算n=pq,φ(n)=(p-1)(q-1),随机产生一个e,通过通过扩展欧几里得方法计算d,然后通过send()函数将公钥(e,n)发送给客户端;
客户端在收到公钥后将AES的密钥按字节进行分组,对每一个分组进行RSA加密处理,然后发送到服务器端,在服务器端利用私钥对加密数据进行解密,得到AES的密钥。
发送公钥与对AES的加密解密运行结果如下:
在这里插入图片描述
根据运行结果可以发现,服务器产生了密钥对,其中公钥为(533,78109979),私钥为(17435273,78109979),将公钥发给客户端后,客户端对AES的密钥“12345678”进行RSA加密处理,将其分为了三块分别进行加密,加密后的AES密钥变为了6667911 76752624 45460071。服务器接收到AES加密密钥后,使用私钥对加密密钥进行RSA解密,解密后的会话密钥又变为了“12345678”,说明解密成功,AES密钥在网络中实现了加密传输。

4.3. AES的实现与加密解密

在AES加密模块,客户端首先对密钥进行密钥扩展,如果密钥不满16字节
则需要在后面补0凑够16个字节,然后进行密钥扩展,将密钥扩展为44个word,一个word占32位,四个word为一组密钥,然后将要加密的明文分段,转换为16进制数据,并凑够16个字节,如果不满16个字节则末尾补0。
然后不断地重复AES的加密流程,对每一段明文进行11轮加密操作,其中第一轮只是进行明文与密钥的异或运算,2-10轮则重复S盒变换、行变换、列变换、与扩展密钥进行异或运算四个步骤,第11轮为S盒变换、行变换还有与扩展密钥的异或运算,得到最后加密后的密文。运行结果如下所示:
在这里插入图片描述
由运行结果可以看出加密后的密文,然后通过send()函数将密文发送给服务器。服务器用之前解密得到的密钥进行解密,步骤与加密方法类似,先对密钥进行扩展,然后2-10轮不断重复反行变换、反S盒变换、与扩展密钥的异或运算与反列变换,第11轮进行反行变换、反列变换,最后与扩展密钥进行异或运算后便得到的明文,运行结果如下所示:
在这里插入图片描述
由运行结果可以看出,服务器端成功根据加密密文与密钥求出了明文,最终结果为“NPU”。

4.4. 运行总结果如下:

服务器端
在这里插入图片描述

客户端
在这里插入图片描述

五、参考文献

[1] AES加密算法的实现

[2] 对称加密及AES加密算法

[3] AES加密算法的详细介绍与实现

[4] RSA算法原理

AES算法代码实现(完整C++源代码)
国科大网安二班的博客
01-23 1万+
AES加解密算法全过程实现(C++) 利用C++编程实现AES的加解密过程。 关于列混合计算不清楚的可以看上一篇博客。 主要针对128bit的明文和密钥给出实现,其他情况需要改一下Nk,Nb,Nr的值和某些地方的数组维度。 byte GFMultiplyByte(byte L, byte R)这个函数是计算多项式模乘的结果(列混淆中的那一步)。 其他想自己动手编编的可以复制一下这里的S盒和逆S盒或者其他常量。 参考书籍是《密码编码与信息安全:C++实践》。 #include <iostream&gt
AES-Java-iOS-Android.zip
01-14
AES-Java-iOS-Android,兼容Java,iOS,Android三端的AES-128-ECB加密算法,附三端Demo Java是一种高性能、跨平台的面向对象编程语言。它由Sun Microsystems(现在是Oracle Corporation)的James Gosling等人在1995推出,被设计为一种简单、健壮、可移植、多线程、动态的语言。Java的主要特点和优势包括以下几个方面: 跨平台性(Write Once, Run Anywhere): Java的代码可以在不同的平台上运行,只需编写一次代码,就可以在任何支持Java的设备上执行。这得益于Java虚拟机(JVM),它充当了代码和底层硬件之间的中介。 面向对象: Java是一种纯粹的面向对象编程语言,支持封装、继承和多态等面向对象的概念。这使得Java编写的代码更加模块化、可维护和可扩展。 多线程支持: Java内置了对多线程的支持,允许程序同时执行多个任务。这对于开发需要高并发性能的应用程序(如服务器端应用、网络应用等)非常重要。 自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。
RSA+AES 混合加密
最新发布
dzqxwzoe的博客
04-13 763
从时代发展的角度看,网络安全的知识是学不完的,而且以后要学的会更多,同学们要摆正心态,既然选择入门网络安全,就不能仅仅只是入门程度而已,能力越强机会才越多。因为入门学习阶段知识点比较杂,所以我讲得比较笼统,大家如果有不懂的地方可以找我咨询,我保证知无不言言无不尽,需要相关资料也可以找我要,我的网盘里一大堆资料都在吃灰呢。干货主要有:①1000+CTF历届题库(主流和经典的应该都有了)②CTF技术文档(最全中文版)③项目源码(四五十个有趣且经典的练手项目及源码)
论文研究 - 基于AesRSA和Twofish的蓝牙混合加密算法
05-29
在本文中,我们提出了一种基于RSA(Rivest-Shamir-Adleman),AES(高级加密标准)和TwoFish的新颖的三重算法,以进一步提高目前仅使用128位AES进行加密的蓝牙的安全性。的最新版本(蓝牙4.0-5.0)。 此外,较旧的蓝牙1.0A – 3.0 + HS(高速)设备使用E0流密码进行加密,这已被许多研究人员证明是较弱的,因此,当今认为它不足以实现安全性。 在我们的新颖方法中,AESRSA和TWOFISH的三重保护将提高安全级别,从而屏蔽了蓝牙中的数据传输。 作为我们新颖方法的第一步,我们首先使用带有128位密钥的AES对消息进行加密,然后再使用具有相同128位密钥的Twofish对消息进行加密。 最后,将使用带有1024位密钥的RSA对开头生成的128位密钥进行加密,以保护其无线传输。 在接收端,解密过程与加密过程相反。 我们通过实验数据表明,我们的新算法通过消除所有已知的弱点提高了蓝牙加密的安全性,从而使蓝牙设备之间的数据交换安全
AESTest_java编程_AES_
10-01
基于JAVA程序设计语言的AES算法加密解密实现
基于Java的两个通用安全模块的设计与实现的毕业设计,分为两个模块:加密模块和身份验证模块
04-05
基于Java的两个通用安全模块的设计与实现的毕设。这些模块可以被用于保护数据和应用程序免受恶意攻击和未经授权的访问。该毕业设计将分为两个模块:加密模块和身份验证模块。 ## 加密模块 加密模块是用于加密和解密数据的模块。该模块将实现常见的加密算法,如AESRSA。它还将包括生成和管理密钥的功能。该加密模块将被用于保护数据的机密性,例如密码和信用卡号码等。 ## 身份验证模块 身份验证模块是用于验证用户身份的模块。该模块将实现各种身份验证方法,如用户名和密码,双因素身份验证等。它还将包括用户管理和授权的功能。该身份验证模块将被用于保护应用程序免受未经授权的访问。 该毕业设计将使用Java编程语言和相关的安全库来实现这两个模块。此外,将使用JUnit测试框架和SonarQube代码质量工具来测试和评估模块的功能和性能。 这个毕设旨在为Java开发人员提供通用的安全模块,以帮助他们保护数据和应用程序免受恶意攻击和未经授权的访问。身份验证模块是用于验证用户身份的模块。该模块将实现各种身份验证方法,如用户名和密码,双因素身份验证等。它还将包括用户管理和授权的功能。该身份验证模块将被
AES加密
feiyingzaishi的博客
11-05 3409
AES加密算法采用分组密码体制,每个分组数据的长度为128位16个字节,密钥长度可以是128位16个字节、192位或256位,一共有四种加密模式(ECB、CBC、CFB、OFB),我们通常采用需要初始向量IV的CBC模式,初始向量的长度规定是128位16个字节。 先说一下Padding的三种模式PKCS5、PKCS7和NOPADDING。 PKCS5是指分组数据缺少几个字节,就在数据的末尾...
AES加密算法
csdn546229768的博客
01-29 6426
​ 先转换为二进制->(00000011) * (a7 a6 a5 a4 a3 a2 a1 a0) = (00000010 xor 00000001) * (a7 a6 a5 a4 a3 a2 a1 a0) = (00000010 * (a7 a6 a5 a4 a3 a2 a1 a0)) xor (a7 a6 a5 a4 a3 a2 a1 a0) ####可理解为a乘以2再加上一个a。第三行:(03,01,01,02) * (1e,27,98,e5) = 4c。
对称加密及AES加密算法
彭世瑜的博客
12-21 4212
1、对称加密: 加密和解密使用同一个密钥的加密方式 2、对称加密的优点: 加密计算量小、速度块,适合对大量数据进行加密的场景 3、AES加密算法 (1)Advanced Encryption Standard,高级加密标准 (2)替代之前的DES加密算法 4、AES采用分组密码体制 每个分组数据的长度为128位16个字节 密钥长度可以是128位16个字节、192位24字节 或256位32字节 通常...
AES
看写写
12-27 1367
目录 1. Why 3 1.1 EDS的缺点 3 1.2 AES的优点 4 2. What 5 2.1 AES的出现 5 2.2 AES加解密流程图 5 2.3 扩展密钥 6 2.4字节替代 7 2.5 行位移 8 2.6 列混淆 8 2.7 轮密钥加 10 3 How 12 3.1 扩展密钥 12 3..2字节替换 13 3.3 行移动 13 3.4 列混淆 14 3.5 轮密钥加 15 4....
那些我在MySQL+MyBatis+AES数据库加密遇到的一些坑坑坑坑
是程序媛不是程序猿
09-17 717
之前在对数据库加密的需求中遇到一些坑,拿出来分享一下。 加密的方案是:将数据使用AES加密再经过base64编码。 最近整理了一些Java架构学习视频和大厂项目底层知识点,需要的同学欢迎私信我【Java】发给你~ 坑一: AES+base64加密后的长度 AES算法加密后的长度应当是:不小于原始长度的16的最小倍数。例如: 15字节加密后变成16字节 16字节加密后变成32字节这是第一个坑 后面base64编码后的长度即变成4/3倍。 坑二: 数据库的编码对varchar类型的..
Java 和 js 实现 AESRSA 算法的互加解密.zip
01-14
Java是一种高性能、跨平台的面向对象编程语言。它由Sun Microsystems(现在是Oracle Corporation)的James Gosling等人在1995推出,被设计为一种简单、健壮、可移植、多线程、动态的语言。Java的主要特点和优势包括以下几个方面: 跨平台性(Write Once, Run Anywhere): Java的代码可以在不同的平台上运行,只需编写一次代码,就可以在任何支持Java的设备上执行。这得益于Java虚拟机(JVM),它充当了代码和底层硬件之间的中介。 面向对象: Java是一种纯粹的面向对象编程语言,支持封装、继承和多态等面向对象的概念。这使得Java编写的代码更加模块化、可维护和可扩展。 多线程支持: Java内置了对多线程的支持,允许程序同时执行多个任务。这对于开发需要高并发性能的应用程序(如服务器端应用、网络应用等)非常重要。 自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。
hybrid-crypto-js:针对JavaScript的RSA + AES混合加密实现。 与Node.js,React Native和现代浏览器一起使用
02-06
Hybrid Crypto JS结合了RSAAES加密算法,可以有效地加密和解密大型邮件。 该跨平台库基于 。 Hybrid Crypto JS可以在浏览器,Node.js或React Native中使用。 文献资料 入门 产品特点 安装 npm install hybrid-...
Object-C-在iOS上使用Object-C进行RSA算法的加密+解密实现.zip
02-28
Object-C_在iOS上使用Object-C进行RSA算法的加密+解密实现
RSA.rar_1024 RSA_2048位RSA_rsa_rsa-2048_rsa加密算法
07-14
RSA加密算法,可以实现实现128,256,512,1024,2048位的RSA加密解密运算
Qt-Secret:支持RSAAES算法的简单加密库
02-02
Qt-Secret:支持RSAAES算法的简单加密库
AES_ECB算法原理及C语言实现
qq_45561717的博客
07-20 1417
AES 128 ECB算法原理及C语言实现
信息与网络安全(五)——网络安全协议与AES算法
m0_56145255的博客
05-25 1222
文章目录安全协议概述TCP/IP安全分析网络层协议安全隐患传输层安全隐患TCPUDP应用层安全隐患安全协议与网络各层次的关系TCP/IP安全体系结构IPSec协议IPSec协议族的体系结构IPSec协议组VPN概述VPN的意义VPN实现方式?VPN连接图VPN基本要求VPN基本信息处理过程VPN基本原理VPN关键技术——隧道化协议隧道技术原理图隧道的基本要求隧道协议分类PPP协议PPP协议传输过程L2TP协议PPTP和L2TP协议主要区别IPSec的优缺点今日加密算法——AES简介AES分组长度、 密钥长度
嵌入式算法6---AES加密/解密算法
嵌入式系统程序员
10-27 3627
AES对称加密算法介绍及源码实现
使用C语言实现AES加密算法RSA加密算法
09-18
对于使用C语言实现AES加密算法RSA加密算法,你可以按照以下步骤进行操作: 1. AES加密算法实现: - 首先,你需要导入相关的库文件,如openssl/aes.h。 - 接下来,你可以选择使用AES-128、AES-192或AES-256等不同的密钥长度。选择一个适合的密钥长度后,你可以生成一个随机的密钥,并设置初始向量(IV)。 - 然后,你可以使用AES加密函数,如AES_set_encrypt_key()和AES_encrypt(),将明文加密为密文。 - 最后,记得释放相关的资源,并清理内存。 2. RSA加密算法实现: - 首先,你需要导入相关的库文件,如openssl/rsa.h。 - 接下来,你可以使用RSA_generate_key函数生成RSA的公钥和私钥。 - 然后,你可以使用RSA公钥对明文进行加密,使用RSA私钥对密文进行解密。 - 除此之外,你还可以使用RSA私钥对明文进行签名,使用RSA公钥对签名进行验证。 下面是一个示例代码,演示了如何使用C语言实现AESRSA加密算法: ```c #include <stdio.h> #include <openssl/aes.h> #include <openssl/rsa.h> #include <openssl/pem.h> #include <openssl/err.h> // AES加密函数 void aes_encrypt(const unsigned char *plain_text, unsigned char *cipher_text, const unsigned char *key, const unsigned char *iv) { AES_KEY aes_key; AES_set_encrypt_key(key, 128, &aes_key); AES_cbc_encrypt(plain_text, cipher_text, 128, &aes_key, iv, AES_ENCRYPT); } // RSA加密函数 int rsa_encrypt(const unsigned char *plain_text, int plain_text_len, unsigned char *cipher_text, RSA *rsa) { int rsa_len = RSA_size(rsa); int result = RSA_public_encrypt(plain_text_len, plain_text, cipher_text, rsa, RSA_PKCS1_PADDING); return result; } int main() { // AES加密示例 unsigned char aes_key[16]; // 128位密钥 unsigned char iv[16]; // 初始向量 unsigned char plain_text[] = "Hello, AES!"; unsigned char cipher_text[128]; // 生成随机的密钥和初始向量 // ... // 使用AES加密算法加密明文 aes_encrypt(plain_text, cipher_text, aes_key, iv); printf("AES Encrypted Text: %s\n", cipher_text); // RSA加密示例 RSA *rsa = RSA_generate_key(2048, RSA_F4, NULL, NULL); unsigned char rsa_plain_text[] = "Hello, RSA!"; unsigned char rsa_cipher_text[256]; // 使用RSA公钥加密明文 rsa_encrypt(rsa_plain_text, sizeof(rsa_plain_text), rsa_cipher_text, rsa); printf("RSA Encrypted Text: %s\n", rsa_cipher_text); RSA_free(rsa); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 软件工程学习笔记选择题总结 54249
  • 数字图像处理(三)——Matlab实现图像去噪 27429
  • 数字图像处理(一)——Matlab实现图像的采样及量化 19571
  • 数字图像处理(五)——Matlab实现图像的边缘锐化及各种算子的比较 17819
  • 数字图像处理(八)——Matlab实现单阈值与多阈值分割 15852

分类专栏

  • 数字图像处理 11篇
  • LeetCode 60篇
  • 数据结构 9篇
  • 软件工程 2篇
  • 计算机图形学 6篇
  • 编译原理 2篇
  • 深度学习 2篇
  • 操作系统 1篇
  • 微机原理与接口技术 5篇

最新评论

  • 微机原理与接口技术课程设计——点阵LED交通情报板设计

    HBK_ffz: 程序没有错误,为什么按这个连线点阵屏不亮呢

  • 计算机网络课程设计——解析IP和ARP数据包

    m0_64601731: 监听没有结果怎么办,该怎么在适配器上弄出arp请求啊

  • 微机原理与接口技术课程设计——交通信号灯的设计

    jax不摆烂: 求连线图表情包表情包表情包

  • 操作系统(一)——绪论

    月沉溪下: 这是哪本书

  • 微机原理与接口技术课程设计——数字电压表的设计(含完整代码与实验连接图)

    Babubaztc: 要用到旁边的一个转换单元,很多实验箱里面都有,相当于是个可以并联的排插,你找一下

大家在看

  • Java开发大厂面试第29讲:红黑树和平衡二叉树有什么区别?
  • 专项技能训练五《云计算网络技术与应用》实训9 使用openVPN建立小型企业内网VPN环境 1333
  • http基础—BP使用和爆破 468
  • html--相爱的恐龙
  • ROS的noetic版本

最新文章

  • 剑指offer_JZ6 从尾到头打印链表 JZ24 反转链表
  • Leetcode101_广度优先搜索_1162地图分析 934最短的桥
  • Leetcode101_回溯法_51N皇后问题
2022年32篇
2020年43篇
2019年31篇

目录

目录

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

哆哆女性网seo的中文含义河南省夏邑营销型网站建设方法好听的工作室起名大全姓胡起名字大全男孩网站建设销售渠道算命取名犬宝宝起名宜用字姓土怎么起名sis001新片seo网络推广优化方法女孩起名用十一划字吉他调音软件店铺起名玩具店山东舰航母简介网站排版设计台州营销型网站建设外贸网站建设收费的给画起名网络营销的平台推广flash制作的网站关于观后感作文300字爱上哥们电视剧李乾艺术签名千古玦尘47江苏英文网站建设永城装饰公司夫妻大片免费在线播放免费在线周公解梦5月8号淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻不负春光新的一天从800个哈欠开始有个姐真把千机伞做出来了国产伟哥去年销售近13亿充个话费竟沦为间接洗钱工具重庆警方辟谣“男子杀人焚尸”男子给前妻转账 现任妻子起诉要回春分繁花正当时呼北高速交通事故已致14人死亡杨洋拄拐现身医院月嫂回应掌掴婴儿是在赶虫子男孩疑遭霸凌 家长讨说法被踢出群因自嘲式简历走红的教授更新简介网友建议重庆地铁不准乘客携带菜筐清明节放假3天调休1天郑州一火锅店爆改成麻辣烫店19岁小伙救下5人后溺亡 多方发声两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#青海通报栏杆断裂小学生跌落住进ICU代拍被何赛飞拿着魔杖追着打315晚会后胖东来又人满为患了当地回应沈阳致3死车祸车主疑毒驾武汉大学樱花即将进入盛花期张立群任西安交通大学校长为江西彩礼“减负”的“试婚人”网友洛杉矶偶遇贾玲倪萍分享减重40斤方法男孩8年未见母亲被告知被遗忘小米汽车超级工厂正式揭幕周杰伦一审败诉网易特朗普谈“凯特王妃P图照”考生莫言也上北大硕士复试名单了妈妈回应孩子在校撞护栏坠楼恒大被罚41.75亿到底怎么缴男子持台球杆殴打2名女店员被抓校方回应护栏损坏小学生课间坠楼外国人感慨凌晨的中国很安全火箭最近9战8胜1负王树国3次鞠躬告别西交大师生房客欠租失踪 房东直发愁萧美琴窜访捷克 外交部回应山西省委原副书记商黎光被逮捕阿根廷将发行1万与2万面值的纸币英国王室又一合照被质疑P图男子被猫抓伤后确诊“猫抓病”

哆哆女性网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化