c++使用openssl静态库 实现AES 分片加密 解密

6 篇文章 0 订阅
2 篇文章 0 订阅

本文是在windows环境下,使用的是vs2019编译器。

下面是使用openssl静态库中的函数 实现的一个AES加密字符串以及加密文件。

下面展示一些 本人实现代码

#include<iostream>
#include <WinSock2.h> 
#include "Iphlpapi.h" 
#include<string>
#include <openssl/aes.h>


using namespace std;
#pragma comment(lib,"Iphlpapi.lib")
#pragma comment(lib,"libcrypto.lib")
#pragma comment(lib,"libssl.lib")


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <openssl/aes.h>
#include <vector>

//分块加密
vector<unsigned char*> AesEncrypt(const unsigned char* userKey, const unsigned char* in, AES_KEY &aes)
{
    int result = AES_set_encrypt_key((const unsigned char*)userKey, 128, &aes);//设置加密密钥
    if (result < 0)//如果设置失败,退出
        //return ;

    printf("in=%s\n", in);

    vector<unsigned char*> outdata;
    printf("out=");
    for (int i = 0; i < strlen((const char*)in) / 16 + 1; i++)
    {
        unsigned char* out = (unsigned char*)malloc(sizeof(unsigned char) * 17);
        AES_ecb_encrypt((const unsigned char*)in + 16 * i, out, &aes, AES_ENCRYPT);
        printf("%s", out);//输出密文
        outdata.push_back(out);
    }
    printf("\n");

    return outdata;
}
//分块解密
void AesDecrypt(const unsigned char* userKey, AES_KEY &aes, vector<unsigned char*> outdata)
{
    if (AES_set_decrypt_key((const unsigned char*)userKey, 128, &aes) < 0)
        return ;
    unsigned char* plain = (unsigned char*)malloc(sizeof(unsigned char) * 17);
    printf("plain=");
    for (int i = 0; i < outdata.size(); i++)
    {
        memset((void*)plain, 0, 17);
        AES_ecb_encrypt(outdata.at(i), plain, &aes, AES_DECRYPT);
        printf("%s", plain);//输出解密后的明文
    }
    printf("\n");
}

CHAR* OpenFile()
{
    CHAR* pBuffer;
    DWORD RSize;
    int fileSize = 0;
    HANDLE hOpenFile = (HANDLE)CreateFile(L"D:\\a.txt", GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);
    if (hOpenFile == INVALID_HANDLE_VALUE)
    {
        hOpenFile = NULL;
        MessageBoxA(NULL, "Can not open the file", "Playwav", MB_OK);
        exit(1);
    }
    fileSize = GetFileSize(hOpenFile, NULL);
    pBuffer = (CHAR*)malloc(fileSize);
    ReadFile(hOpenFile, pBuffer, fileSize, &RSize, NULL);
    //可将pBuffer显示在某区域或写入另一个文件来检查读出是否正确

    FlushFileBuffers(hOpenFile);
    CloseHandle(hOpenFile);
    return pBuffer;
}

int main(int argc, char* argv[])
{
    AES_KEY aes;

    const  char* userKey = "Hello,World!!";
    char* puffer = OpenFile();
    vector<unsigned char*> outdata = AesEncrypt((const unsigned char*)userKey, (const unsigned char*)puffer, aes);  //加密
    AesDecrypt((const unsigned char*)userKey, aes, outdata);  //解密

    system("pause");

}

感谢大家观看 同时如果发现问题 希望指出 大家一起进步

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
课程简介    随着”新基建“的推行,其中涉及到的工业互联网、物联网、人工智能、云计算、区块链,无一不是与安全相关,所有数据的存储、传输、签名认证都涉及到密码学技术,所以在这样的大环境下再结合我多年安全开发经验,设计出这门课程。    因为密码学技术在新基建中的重要性,所以使其成为底层开发人员所必备的技能。特别是现在的区块链技术是全面应用密码学,大数据技术和人工智能技术也要解决隐私安全问题。所以现在学习相关技术是非常必要的技术储备,并且可以改造现有的系统,提升其安全性。课程学习目标了解DES算法原理VS2019创建C++项目,并导入openssl库学会OpenSSL DES算法加解密接口加密文件并做PKCS7 Padding 数据填充解密数据并做数据填充解析课程特点    面向工程应用    市面上的一些密码学课程和密码学的书籍,很多都是从考证出发,讲解算法原理并不面向工程应用,而我们现在缺少的是工程应用相关的知识,本课程从工程应用出发,每种技术都主要讲解其在工程中的使用,并演示工程应用的代码。    从零实现部分算法    课程中实现了base16编解码 ,XOR对称加解密算法,PKCS7 pading数据填充算法,通过对一些简单算法的实现,从而加深对密码学的理解。    理论与实践结合    课程如果只是讲代码,同学并不能理解接口背后的原理,在项目设计中就会留下隐患,出现错误也不容易排查出问题。    如果只讲理论,比如对密码学的一些研究,对于大部分从事工程应用的同学并没有必要,而是理论与实践结合,一切为了工程实践。    代码现场打出    代码不放在ppt而是现场打出,更好的让学员理解代码编写的逻辑,老师现场敲出代码正是展示出了工程项目的思考,每个步骤为什么要这么做,考虑了哪些异常,    易学不枯燥    课程为了确保大部分人开发者都学得会,理解算法原理(才能真正理解算法特性),学会工程应用(接口调用,但不局限接口调用,理解接口背后的机制,并能解决工程中会出现的问题),阅读算法源码但不实现密码算法,,并能将密码学投入到实际工程中,如果是想学习具体的加密算法实现,请关注我后面的课程。课程用到的技术    课程主要演示基于 VS2019 C++,部分演示基于ubuntu 18.04 GCC makefile    如果没有装linux系统,对本课程的学习也没有影响    课程中的OpenSSL基于最新的3.0版本,如果是openss 1.1.1版本也支持,再低的版本不支持国密算法。 课程常见问题课程讲解用的什么平台和工具?    课程演示主要在windows,基于VS2019 ,一些项目会移植到Linux在ubuntu18.04上我不会Linux能否学习本门课程?    可以的,课程主要在Windows上,Linux部分只是移植,可以暂时跳过,熟悉了Linux再过来看我不会C/C++ 语言是否能学习本门课程?    至少要会C语言,C++特性用得不多,但做了一个封装,可以预习一些C++基础。会不会讲算法实现,会不会太难学不会?    课程偏工程应用,具体的AES,椭圆曲线、RSA等算法只通过图示讲原理,一些简单hash算法会读一些源码,并不去实现,课程中会单独实现简洁的XOR对称加密和base16算法(代码量不大易懂)。其他的应用我们都基于OpenSSL3.0的SDK调用算法。课程提供源码和PPT吗?    课程中所有讲解的源码都提供,课程的上课的ppt也提供,PPT提供pdf版,只可以用于学习,不得商用,代码可以用于商用软件项目,涉及到开源系统部分,需要遵守开源的协议,但不得用于网络教学。要观看全部内容请点击c++实战区块链核心密码学-基于opensslhttps://edu.csdn.net/course/play/29593

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值