当前位置: 首页 > 编程日记 > 正文

Conan客户端简单使用示例

在https://blog.csdn.net/fengbingchun/article/details/118443862 中对Conan进行了简单介绍,这里调用openssl的接口,写一个简单的test来说明Conan的使用步骤:

(1).首先添加一个conanfile.txt文件,内容如下:依赖项为openssl最新版1.1.1k

[requires]
openssl/1.1.1k[generators]
cmake

(2).依次执行如下命令:

mkdir build
cd build
~/Disk/anaconda3/envs/test_conan/bin/conan install .. -s arch=x86_64 -s compiler=gcc -s compiler.libcxx=libstdc++ -s compiler.version=4.9 -s os=Linux --build=missing

执行结果如下图所示:openssl生成的库和头文件会存放在~/.conan/data/openssl/1.1.1k/_/_/package/93fdb97b4b95d2b3f87d615ef63cbbfa72870a99目录下。

在当前build目录下还会生成conanbuildinfo.cmake、conanbuildinfo.txt、conaninfo.txt、 conan.lock、graph_info.json 5个文件:

conanbuildinfo.cmake:定义了一些宏和变量,指定openssl库和头文件的所在路径等信息,此文件需要在主CMakeLists.txt中被include。

conanbuildinfo.txt:指定openssl库、头文件、可执行文件所在路径等信息。

conaninfo.txt:指定编译openssl时的配置信息,及哪些openssl选项是开启的。

conan.lock:与connaninfo.txt内容类似。

graph_info.json:与connaninfo.txt内容类似,指示哪些openssl选项是开启的。

(3).main.cpp文件内容如下:参考https://blog.csdn.net/fengbingchun/article/details/106113185 ,使用对称加密算法AES对字符串进行加解密

#include <string.h>
#include <string>
#include <vector>
#include <memory>
#include <algorithm>
#include <openssl/des.h>
#include <openssl/rc4.h>
#include <openssl/md5.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/aes.h>
#include <openssl/hmac.h>
#include <openssl/bio.h>
#include <openssl/evp.h>
#include <openssl/asn1.h>
#include <openssl/asn1t.h>namespace {static const unsigned char gcm_key[] = { // 32 bytes, Key0xee, 0xbc, 0x1f, 0x57, 0x48, 0x7f, 0x51, 0x92, 0x1c, 0x04, 0x65, 0x66,0x5f, 0x8a, 0xe6, 0xd1, 0x65, 0x8b, 0xb2, 0x6d, 0xe6, 0xf8, 0xa0, 0x69,0xa3, 0x52, 0x02, 0x93, 0xa5, 0x72, 0x07, 0x8f
};static const unsigned char gcm_iv[] = { // 12 bytes, IV(Initialisation Vector)0x99, 0xaa, 0x3e, 0x68, 0xed, 0x81, 0x73, 0xa0, 0xee, 0xd0, 0x66, 0x84
};// Additional Authenticated Data(AAD): it is not encrypted, and is typically passed to the recipient in plaintext along with the ciphertext
static const unsigned char gcm_aad[] = { // 16 bytes0x4d, 0x23, 0xc3, 0xce, 0xc3, 0x34, 0xb4, 0x9b, 0xdb, 0x37, 0x0c, 0x43,0x7f, 0xec, 0x78, 0xde
};std::unique_ptr<unsigned char[]> aes_gcm_encrypt(const char* plaintext, int& length, unsigned char* tag)
{EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new();// Set cipher type and modeEVP_EncryptInit_ex(ctx, EVP_aes_256_gcm(), nullptr, nullptr, nullptr);// Set IV length if default 96 bits is not appropriateEVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_IVLEN, sizeof(gcm_iv), nullptr);// Initialise key and IVEVP_EncryptInit_ex(ctx, nullptr, nullptr, gcm_key, gcm_iv);// Zero or more calls to specify any AADint outlen;EVP_EncryptUpdate(ctx, nullptr, &outlen, gcm_aad, sizeof(gcm_aad));unsigned char outbuf[1024];// Encrypt plaintextEVP_EncryptUpdate(ctx, outbuf, &outlen, (const unsigned char*)plaintext, strlen(plaintext));length = outlen;std::unique_ptr<unsigned char[]> ciphertext(new unsigned char[length]);memcpy(ciphertext.get(), outbuf, length);// Finalise: note get no output for GCMEVP_EncryptFinal_ex(ctx, outbuf, &outlen);// Get tagEVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, 16, outbuf);memcpy(tag, outbuf, 16);// Clean upEVP_CIPHER_CTX_free(ctx);return ciphertext;
}std::unique_ptr<unsigned char[]> aes_gcm_decrypt(const unsigned char* ciphertext, int& length, const unsigned char* tag)
{EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new();// Select cipherEVP_DecryptInit_ex(ctx, EVP_aes_256_gcm(), nullptr, nullptr, nullptr);// Set IV length, omit for 96 bitsEVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_IVLEN, sizeof(gcm_iv), nullptr);// Specify key and IVEVP_DecryptInit_ex(ctx, nullptr, nullptr, gcm_key, gcm_iv);int outlen;// Zero or more calls to specify any AADEVP_DecryptUpdate(ctx, nullptr, &outlen, gcm_aad, sizeof(gcm_aad));unsigned char outbuf[1024];// Decrypt plaintextEVP_DecryptUpdate(ctx, outbuf, &outlen, ciphertext, length);// Output decrypted blocklength = outlen;std::unique_ptr<unsigned char[]> plaintext(new unsigned char[length]);memcpy(plaintext.get(), outbuf, length);// Set expected tag valueEVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, 16, (void*)tag);// Finalise: note get no output for GCMint rv = EVP_DecryptFinal_ex(ctx, outbuf, &outlen);// Print out return value. If this is not successful authentication failed and plaintext is not trustworthy.fprintf(stdout, "Tag Verify %s\n", rv > 0 ? "Successful!" : "Failed!");EVP_CIPHER_CTX_free(ctx);return plaintext;
}} // namespaceint main()
{fprintf(stdout, "Start AES GCM 256 Encrypt:\n");const char* plaintext = "1234567890ABCDEFG!@#$%^&*()_+[]{};':,.<>/?|";fprintf(stdout, "src plaintext: %s, length: %d\n", plaintext, strlen(plaintext));int length = 0;std::unique_ptr<unsigned char[]> tag(new unsigned char[16]);std::unique_ptr<unsigned char[]> ciphertext = aes_gcm_encrypt(plaintext, length, tag.get());fprintf(stdout, "length: %d, ciphertext: ", length);for (int i = 0; i < length; ++i)fprintf(stdout, "%02x ", ciphertext.get()[i]);fprintf(stdout, "\nTag: ");for (int i = 0; i < 16; ++i)fprintf(stdout, "%02x ", tag.get()[i]);fprintf(stdout, "\n");fprintf(stdout, "\nStart AES GCM 256 Decrypt:\n");std::unique_ptr<unsigned char[]> result = aes_gcm_decrypt(ciphertext.get(), length, tag.get());fprintf(stdout, "length: %d, decrypted plaintext: ", length);for (int i = 0; i < length; ++i)fprintf(stdout, "%c", result.get()[i]);fprintf(stdout, "\n");if (strncmp(plaintext, (const char*)result.get(), length) == 0) {fprintf(stdout, "decrypt success\n");return 0;}fprintf(stderr, "decrypt fail\n");return -1;
}

(4).CMakeLists.txt文件内容如下:

cmake_minimum_required(VERSION 3.12)
project(test_openssl)add_definitions("-std=c++11")include(${CMAKE_CURRENT_SOURCE_DIR}/build/conanbuildinfo.cmake)
include_directories(${CONAN_INCLUDE_DIRS_OPENSSL})
link_directories(${CONAN_LIB_DIRS_OPENSSL})add_executable(main main.cpp)
target_link_libraries(main ${CONAN_LIBS_OPENSSL})

(5).依次执行如下命令:

cmake ..
make
./main

执行结果如下图所示:

GitHub:https://github.com/fengbingchun/Linux_Code_Test

相关文章:

Java解释器模式

解释器模式&#xff08;Interpreter Pattern&#xff09;提供了评估语言的语法或表达式的方式&#xff0c;它属于行为型模式。这种模式实现了一个表达式接口&#xff0c;该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。 意图&#xff1a;给定一个语言&…

为什么鲜有炫富的程序员?看看中国各阶级收入统计表

网上那些口口声声随随便便就能年入百万的&#xff0c;听听就行。作为开发者&#xff0c;可以不参加双11&#xff0c;但是花钱最多的地方就是买电子产品和“买课”。他们的炫富就是&#xff1a;你根本不知道有多贵的机械键盘&#xff0c;为了赚钱和幸福&#xff0c;又买了多少大…

HQL中的Like查询需要注意的地方

public List getOrgan(String organCode, String organName) { String hsql; List list; if (organCode ! null && organCode.length() > 0) { hsql "from Ab31 where bae002 ? and aab061 like ?"; list getHibernateTemplate().find…

深度神经网络中的Batch Normalization介绍及实现

之前在经典网络DenseNet介绍_fengbingchun的博客-CSDN博客_densenet中介绍DenseNet时&#xff0c;网络中会有BN层&#xff0c;即Batch Normalization&#xff0c;在每个Dense Block中都会有BN参与运算&#xff0c;下面对BN进行介绍并给出C和PyTorch实现。 Batch Normalization即…

韬光养晦的Sony AI,凭什么与Google和Facebook平起平坐?

作者 | 藏狐来源 | 脑极体&#xff08;ID&#xff1a;unity007&#xff09;伴随着感恩节气氛的日渐浓重&#xff0c;面对只剩下最后一个月份额的2019&#xff0c;奋进的、错失的&#xff0c;都已尘埃落定&#xff0c;是时候迎来盘点得失、清理思绪的冬藏时节了。整体来看&#…

Java迭代器模式

迭代器模式&#xff08;Iterator Pattern&#xff09;是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素&#xff0c;不需要知道集合对象的底层表示。 迭代器模式属于行为型模式。 意图&#xff1a;提供一种方法顺序访问一个聚合对象中各个元…

Linux下搭建高效的SVN

第一种安装方式&#xff1a;svn下载&#xff1a;http://archive.apache.org/dist/subversion/需要的包yum install gcc gcc-cyum install expat-develyum install openssl-develhttp://labs.renren.com/apache-mirror//httpd/httpd-2.2.22.tar.gz //最好用2.2版本http://subver…

通过Windows10上的VS Code打开远端Ubuntu上的项目操作步骤

Ubuntu版本要求是16.04及以上版本。这里以16.04为例。 在Ubuntu上安装OpenSSH server&#xff0c;执行&#xff1a;$ sudo apt-get install openssh-server 在Windows 10 1803上安装Windows OpenSSH Client(注&#xff1a;Windows早期版本则需要安装Git for Windows)&#xff1…

Java中介者模式

中介者模式&#xff08;Mediator Pattern&#xff09;是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类&#xff0c;该类通常处理不同类之间的通信&#xff0c;并支持松耦合&#xff0c;使代码易于维护。中介者模式属于行为型模式。 意图&#xff1a;用一个中…

那些打着AI万金油旗号的产品欺骗大众,如何识别?

作者 | Arvind Narayanan译者 | 刘畅出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;如今&#xff0c;很多打着AI名号售出的产品都属于万金油系列&#xff0c;没什么实质性的功能。为什么会这样&#xff1f;我们应该如何识别这类AI&#xff1f;幻灯片上是评估性格和工…

分享一款jQuery全屏滚动页面特性案例

分享一款jQuery全屏滚动页面特性案例。我们在来往官网&#xff0c;或者小米官网都会看到全屏滚动页面的一些例子。可以说全屏滚动页面越来越受欢迎。它们就像是竖着的图片轮转一样。这样的页面有很多&#xff0c;如&#xff1a;iPhone 5C页面&#xff1a;http://www.dowebok.co…

后深度学习时代的一大研究热点?论因果关系及其构建思路

作者 | Bernhard Schlkopf译者 | Kolen编辑 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;尽管机器学习在现阶段取得了很大成功&#xff0c;但是相比于动物所能完成的工作&#xff0c;机器学习在动物擅长的关键技术上表现不尽人意&#xff0c;比如…

Java观察者模式

当对象间存在一对多关系时&#xff0c;则使用观察者模式&#xff08;Observer Pattern&#xff09;。比如&#xff0c;当一个对象被修改时&#xff0c;则会自动通知它的依赖对象。观察者模式属于行为型模式。 意图&#xff1a;定义对象间的一种一对多的依赖关系&#xff0c;当一…

Python3中None用法

1.None是一个空值&#xff0c;空值是Python里的一个特殊值&#xff0c;用None表示。可以将None赋值给任何变量。 var None; print(var) # None if var is None:print("var has a value of None") # print else:print("var:", var) 2.None有自己的数据类型…

try finally 中的return

2019独角兽企业重金招聘Python工程师标准>>> public class Test { public static int test1() { int x 1; try { return x; } finally { x; } } public static int test2() { int x 1; try { return x; } finally { return x; } } public st…

我用Python破解了同事的加密压缩包

作者 | 朱小五来源 | 凹凸玩数据&#xff08;ID: alltodata&#xff09;又是一杯奶茶。事情的经过是这样的&#xff1a;又是奶茶&#xff0c;行吧行吧。快点开工&#xff0c;争取李大伟回来之前搞定。李大伟说是6位数字密码那么我们可以利用python生成全部的六位数字密码#生成从…

Ubuntu上通过android toolchain交叉编译Valgrind操作步骤

关于Valgrind的介绍可以参考&#xff1a;https://blog.csdn.net/fengbingchun/article/details/50196189. 这里介绍下在Ubuntu 16.04上通过android toolchain如android-ndk-r14b交叉编译Valgrind源码的操作步骤&#xff1a; 1. 从 https://valgrind.org/ 下载最新的版本3.17.0&…

Java状态模式

在状态模式&#xff08;State Pattern&#xff09;中&#xff0c;类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中&#xff0c;我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。 意图&#xff1a;允许对象在内部…

Red Hat 5.8 CentOS 6.5 共用 输入法

pick up from http://jingyan.baidu.com/article/20b68a885a3607796cec622c.html

Python3中with用法

Python中的with语句用于用上下文管理器(context manager)定义的方法包装块的执行&#xff0c;它允许将常见的try…except…finally使用模式封装起来以方便重用。 在Python中&#xff0c;在处理非托管资源(unmanaged resources)(如文件流)时使用with关键字。它允许确保你在使用资…

作为计算机专业的你,这些点你命中了哪些?

是不是学计算机的在别人眼里就得会修电脑&#xff1f;是不是编代码的程序员在别人眼里就得喜欢穿格子衫&#xff1f;是不是从事互联网行业的人在别人眼里就喜欢背双肩包出行&#xff1f;1我学计算机就得会修电脑&#xff1f;前两天我在加班的时候&#xff0c;电话突然响起&…

Java空对象模式

在空对象模式&#xff08;Null Object Pattern&#xff09;中&#xff0c;一个空对象取代 NULL 对象实例的检查。Null 对象不是检查空值&#xff0c;而是反应一个不做任何动作的关系。这样的 Null 对象也可以在数据不可用的时候提供默认的行为。 在空对象模式中&#xff0c;我们…

JSON入门基础知识

2019独角兽企业重金招聘Python工程师标准>>> JSON入门基础 1、JSON定义 JSON&#xff1a;JavaScript 对象表示法&#xff08;JavaScript Object Notation&#xff09;。 JSON 是存储和交换文本信息的语法。类似 XML。 JSON 比 XML 更小、更快&#xff0c;更易…

Python3中raise用法

Python中raise语句支持强制触发指定的异常。 raise语法&#xff1a; raise [EXPRESSION [from EXPRESSION]] 如果raise后未跟表达式(expression)&#xff0c;则raise重新引发当前作用域中活动的最后一个异常。如果当前范围内没有异常处于活动状态&#xff0c;则会引发RuntimeE…

精选实践 | 爱奇艺实用数据库选型树:不同场景如何快速选择数据库?

作者 | 郭磊涛 爱奇艺数据库和中间件负责人 TiDB User Group Ambassador来源 | 授权转载自AskTUG本文系 TUG 线下活动 “不同业务场景下的数据库技术选型思路” 分享实录。我是爱奇艺的数据库和中间件负责人郭磊涛&#xff0c;今天主要向大家分享数据库选型方面的思路&#xff…

iOS处理高并发量的数据请求和数据集合的对应关系

一、处理高并发请求的核心代码如下&#xff1a; // 创建信号量dispatch_semaphore_t semaphore dispatch_semaphore_create(0);// 创建全局并行dispatch_queue_t queue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);dispatch_group_t group dispatch_gro…

Top 10 Mistakes Java Developers Make(转)

文章列出了Java开发者最常犯的是个错误。 1.将数组转换为ArrayList 为了将数组转换为ArrayList&#xff0c;开发者经常会这样做&#xff1a; ?1List<String> list Arrays.asList(arr);Arrays.asList()会返回一个ArrayList&#xff0c;但这个ArrayList是Arrays的私有静态…

Python3中迭代器介绍

Python中一个可迭代对象(iterable object)是一个实现了__iter__方法的对象&#xff0c;它应该返回一个迭代器对象(iterator object)。迭代器是一个实现__next__方法的对象&#xff0c;它应该返回它的可迭代对象的下一个元素&#xff0c;并在没有可用元素时触发StopIteration异常…

30+博士、100+硕士整理的超全深度强化学习资源清单

作者 | Deep-RL来源 | 深度强化学习实验室&#xff08;ID&#xff1a;Deep-RL&#xff09;今天为大家推荐一个开源、开发的 Github 好项目《A Guide for Deep Reinforcement Learning》。这个项目联合了Deep Reinforcement Learning领域的30位博士&#xff0c;100位硕士共同完成…

Java访问者模式

在访问者模式&#xff08;Visitor Pattern&#xff09;中&#xff0c;我们使用了一个访问者类&#xff0c;它改变了元素类的执行算法。通过这种方式&#xff0c;元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式&#xff0c;元素对象已接受…