Ubuntu環境下,使用clion編譯器,使用開源opensll的對稱AES算法對于文件進行加密,C++代碼

前提準備條件

  • 需要安裝openssl
  • 需要安裝openssl-dev
  • 需要配置CMakeLists.txt文件
  • 集體內容可以參考我提供的相關參考鏈接

AES_file.h

#include <openssl/aes.h>
#include <iostream>
#include <fstream>
#include <cstring>#define RELEASE_ARRAY(P) if (P)  \
{                                \delete[] P;                  \P = NULL;                    \
}class AES{
public:// AES文件加密函數 ///int TestAesEncryptFile(std::string original_backup_file_path, std::string backup_dir_path, std::string &password){int encrypt_chunk_size = 16;std::ifstream original_backup_file(original_backup_file_path.c_str(), std::ios::binary);std::ofstream backup_dir(backup_dir_path, std::ios::binary);if (!original_backup_file){std::cout << "Can not open original_backup_file file." << std::endl;return 1;}if (!backup_dir){std::cout << "Can not open backup_dir_path file." << std::endl;return 1;}//用指定密鑰對一段內存進行加密,結果放在outbuffer中unsigned char aes_keybuf[32];memset(aes_keybuf, 0, sizeof(aes_keybuf));strcpy((char *)aes_keybuf, password.c_str());AES_KEY aeskey;AES_set_encrypt_key(aes_keybuf, 256, &aeskey);char *in_data = new char[encrypt_chunk_size + 1];char *out_data = new char[encrypt_chunk_size + 1];while (!original_backup_file.eof()){original_backup_file.read(in_data, encrypt_chunk_size);if (original_backup_file.gcount() < encrypt_chunk_size){backup_dir.write(in_data, original_backup_file.gcount());}else{AES_encrypt((const unsigned char *)in_data, (unsigned char *)out_data, &aeskey);backup_dir.write(out_data, original_backup_file.gcount());}};backup_dir.close();original_backup_file.close();RELEASE_ARRAY(in_data);RELEASE_ARRAY(out_data);return 0;}// AES文件解密函數 //int TestAesDecryptFile(std::string in_file_path, std::string out_file_path, std::string &password){int encrypt_chunk_size = 16;std::ifstream original_backup_file(in_file_path.c_str(), std::ios::binary);std::ofstream backup_dir(out_file_path, std::ios::binary);if (!original_backup_file){std::cout << "Can not open original_backup_file file." << std::endl;return 1;}if (!backup_dir){std::cout << "Can not open backup_dir file." << std::endl;return 1;}//用指定密鑰對一段內存進行加密,結果放在outbuffer中unsigned char aes_keybuf[32];memset(aes_keybuf, 0, sizeof(aes_keybuf));strcpy((char *)aes_keybuf, password.c_str());AES_KEY aeskey;AES_set_decrypt_key(aes_keybuf, 256, &aeskey);char *in_data = new char[encrypt_chunk_size + 1];char *out_data = new char[encrypt_chunk_size + 1];while (!original_backup_file.eof()){original_backup_file.read(in_data, encrypt_chunk_size);if (original_backup_file.gcount() < encrypt_chunk_size){backup_dir.write(in_data, original_backup_file.gcount());}else{AES_decrypt((unsigned char *)in_data, (unsigned char *)out_data, &aeskey);backup_dir.write(out_data, original_backup_file.gcount());}};backup_dir.close();original_backup_file.close();RELEASE_ARRAY(in_data);RELEASE_ARRAY(out_data);return 0;}
};

main.cpp

#include <iostream>
#include "load_or_save_db.h"
#include "include/AES_file.h"int main() {time_t t1, t2, t3, t4;t1 = time(nullptr);printf("加解密起始時間: %s\n", ctime(&t1));std::string password = "xcdf123456";AES aes;// 數據開始加密aes.TestAesEncryptFile("/home/gsc/Projects/1.txt", "/home/gsc/Projects/2.txt", password);t2 = time(nullptr);printf("AES256加密成功!\n");printf("加密用時: %ld秒\n", (t2 - t1));t3 = time(NULL);// 數據開始解密aes.TestAesDecryptFile("/home/gsc/Projects/2.txt", "/home/gsc/Projects/3.txt", password);t4 = time(NULL);printf("AES256解密成功!\n");printf("解密用時: %lld秒\n", (t4 - t3));return 0;
}

參考鏈接

  • C++: 基于OpenSSL的AES256加解密測試
  • clion中鏈接openssl庫

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/446964.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/446964.shtml
英文地址,請注明出處:http://en.pswp.cn/news/446964.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java提高篇 —— Java關鍵字之static的四種用法

一、前言 在java的關鍵字中&#xff0c;static和final是兩個我們必須掌握的關鍵字。不同于其他關鍵字&#xff0c;他們都有多種用法&#xff0c;而且在一定環境下使用&#xff0c;可以提高程序的運行性能&#xff0c;優化程序的結構。下面我們先來了解一下static關鍵字及其用法…

C++ 使用move來刪除用戶指定的文件

代碼 #include <iostream>bool remove_file(std::string path){if (remove(path.c_str())0){std::cout << "success!" << std::endl;}else{std::cout << "False!" << std::endl;} } int main() {std::string path "/…

Java提高篇 —— Java關鍵字之final的幾種用法

一、前言 在java的關鍵字中&#xff0c;static和final是兩個我們必須掌握的關鍵字。不同于其他關鍵字&#xff0c;他們都有多種用法&#xff0c;而且在一定環境下使用&#xff0c;可以提高程序的運行性能&#xff0c;優化程序的結構。下面我們來了解一下final關鍵字及其用法。 …

使用C++的方式實現AES算法

aes_file.h #include <iostream> #include <fstream> #include <bitset> #include <string> using namespace std; typedef bitset<8> byte; typedef bitset<32> word;const int Nr 10; // AES-128需要 10 輪加密 const int Nk 4; /…

Java提高篇 —— Java三大特性之封裝

一、封裝 封裝從字面上來理解就是包裝的意思&#xff0c;專業點就是信息隱藏&#xff0c;是指利用抽象數據類型將數據和基于數據的操作封裝在一起&#xff0c;使其構成一個不可分割的獨立實體&#xff0c;數據被保護在抽象數據類型的內部&#xff0c;盡可能地隱藏內部的細節&am…

sqlite3的backup和restore函數的使用

參考代碼 第一段這個親測可以使用 #include <sqlite3.h> #include <iostream> /* ** Perform an online backup of database pDb to the database file named ** by zFilename. This function copies 5 database pages from pDb to ** zFilename, then unlocks pD…

Java提高篇 —— Java三大特性之繼承

一、前言 在《Think in java》中有這樣一句話&#xff1a;復用代碼是Java眾多引人注目的功能之一。但要想成為極具革命性的語言&#xff0c;僅僅能夠復制代碼并對加以改變是不夠的&#xff0c;它還必須能夠做更多的事情。在這句話中最引人注目的是“復用代碼”,盡可能的復用代碼…

Java提高篇 —— Java三大特性之多態

一、前言 面向對象編程有三大特性&#xff1a;封裝、繼承、多態。 封裝&#xff1a;隱藏了類的內部實現機制&#xff0c;可以在不影響使用的情況下改變類的內部結構&#xff0c;同時也保護了數據。對外界而已它的內部細節是隱藏的&#xff0c;暴露給外界的只是它的訪問方法。 繼…

光盤刻錄制作Ubuntu等操作系統的啟動盤

前提條件 軟媒刻錄 空白光盤&#xff08;至少4.7G&#xff09;電腦&#xff08;最好使用外置的光驅&#xff09;系統鏡像&#xff08;ISO格式&#xff09; 具體操作 打開軟媒魔方選擇光盤刻錄按照標紅的進行選擇選擇鏡像->選擇或者拖拽都可以選擇刻錄機->如果使用外部刻…

Java提高篇 —— 抽象類與接口

一、前言 接口和內部類為我們提供了一種將接口與實現分離的更加結構化的方法。 抽象類與接口是java語言中對抽象概念進行定義的兩種機制&#xff0c;正是由于他們的存在才賦予java強大的面向對象的能力。他們兩者之間對抽象概念的支持有很大的相似&#xff0c;甚至可以互換&…

C++ const相關內容學習

const 作用 修飾變量&#xff0c;說明變量不可以被修改修飾指針&#xff0c;分為指向常量的指針&#xff08;pointer to const&#xff09;和自身是常量的指針&#xff08;常量指針&#xff0c;const pointer&#xff09;修飾引用&#xff0c;指向常量的引用&#xff08;refe…

Java提高篇 —— Java淺拷貝和深拷貝

一、前言 我們知道在Java中存在這個接口Cloneable&#xff0c;實現該接口的類都會具備被拷貝的能力&#xff0c;同時拷貝是在內存中進行&#xff0c;在性能方面比我們直接通過new生成對象來的快&#xff0c;特別是在大對象的生成上&#xff0c;使得性能的提升非常明顯。然而我們…

openssl里面AES算法主要函數的參數的介紹

注意事項 使用API的時候&#xff0c;需要特別小心數據長度&#xff0c;一般沒有指定長度的參數&#xff0c;默認都是16&#xff08;AES_BLOCK_SIZE&#xff09;個字節。輸出數據的長度一般都是16字節的倍數&#xff0c;否則會出現數組越界訪問。以下API中&#xff0c;encrypt表…

Java提高篇 —— Java內部類詳解

一、簡介 內部類是一個非常有用的特性但又比較難理解使用的特性。 內部類我們從外面看是非常容易理解的&#xff0c;無非就是在一個類的內部在定義一個類。 public class OuterClass {private String name ;private int age;public String getName() {return name;}public voi…

Ubuntu修改界面的大小

命令 xrandr 就會顯示ubuntu支持的屏幕比例使用命令 xrandr --size 1680x1050 切換屏幕大小

Java提高篇 —— String緩沖池

一、String緩沖池 首先我們要明確&#xff0c;String并不是基本數據類型&#xff0c;而是一個對象&#xff0c;并且是不可變的對象。查看源碼就會發現String類為final型的&#xff08;當然也不可被繼承&#xff09;&#xff0c;而且通過查看JDK文檔會發現幾乎每一個修改String對…

C++最新使用開源openssl實現輸入是文件,輸出是文件的AES加解密的代碼

AES.h頭文件 #include <cstring> #include <fstream> #include <iostream> #include <openssl/aes.h>//AES文件加密函數 int aes_encrypt_file(const std::string &original_backup_file_path,const std::string &encrypted_file_path,const …

Java基礎 —— JVM內存模型與垃圾回收

目錄一、概述二、運行時數據區方法區運行時常量池堆棧本地方法棧程序計數器三、對象訪問四、垃圾回收如何定義垃圾1、引用計數法2、可達性分析垃圾回收方法1、Mark-Sweep標記-清除算法2、Copying復制算法3、Mark-Compact標記-整理算法4、Generational Collection 分代收集垃圾收…

Report Design

ERP_ENT_STD-CSDN博客

規范化流程化提交自己代碼到遠程gitlab服務器

流程 進入到build目錄使用make命令進行編譯 make -j 6&#xff0c;前提是cmake命令已經執行../format.py rungit add .. 添加文件git checkout -b xxx 創建xxx分支&#xff0c;其中xxx是分支名字git branch 查看分支git commit -m "[chy/backup] modify parameters for…