C++-openssl-aes-加密解密

news2024/9/24 11:27:57

hmac   Hash-based Message Authentication Code
MAC 定义: Message Authentication Code 一种确认完整性并进行认证的技术。


1.openssl基本版 加密解密
 

#include "openssl/rand.h"
#include "openssl/md5.h"
#include "openssl/hmac.h"
#include "openssl/aes.h" 

//1.向量在运算过程中会被改变,为了之后可以正常解密,拷贝一份副本使用
void  main()
{

   unsigned char key[16] = "123456789ABCDEF";            //1.key
   unsigned int  n_keylength = strlen((char*)key);       //  strlen()长度15
   unsigned char iv[16] = "123456789ABCDEF";             //2.偏移量
   unsigned char iv_copy1[16] = "123456789ABCDEF";       //2.偏移量副本1 
   unsigned char iv_copy2[16] = "123456789ABCDEF";       //2.偏移量副本2 
   unsigned int  n_ivlength = strlen((char*)iv);         // strlen()长度15

   unsigned char buf_in[16] = "123456789ABCDEF";        //3.明文 in
   unsigned char buf_encrypt[16] = "";                  //4.明文加密encrypt 
   unsigned char buf_out[16] = "";                      //5.解密后明文out
   AES_KEY aesKey;

    //加密
   //memcpy(iv_copy, iv, 16);
   AES_set_encrypt_key(key, 128, &aesKey);
   int m_bufinlen = sizeof(buf_in);                       //  sizeof() 16
   AES_cbc_encrypt(buf_in, buf_encrypt, sizeof(buf_in), &aesKey, iv_copy1, 1);

    //解密
   //memcpy(iv_copy, iv, 16);
   AES_set_decrypt_key(key, 128, &aesKey);
   int m_bufencryptlen = sizeof(buf_encrypt);          // sizeof() 16
   AES_cbc_encrypt(buf_encrypt, buf_out, sizeof(buf_encrypt), &aesKey, iv_copy2, 0);
}

2. 字符拼接


  
   2.1C中的字符拼接

//1.snprintf  长度+1

#include <iostream> // C++的头文件不带.h
#include <string.h> // 兼容原C语言头文件
 
using namespace std;

//
 
int main()
{
    //1.  snprintf 复制拼接  size值为待拷贝字符串长度+1,保证'\0'结尾符加入进来。
    char dest1[10] = "abc";                        // 指针类型无法扩展长度,需标识为数组形式
    char *src1 = "def"; 
    snprintf(dest1+3, strlen(src1)+1, "%s", src1 ); // dest1+3 = dest1+3*sizeof(char)  
                                                    //strlen(src1)+1 因为最后一个\0 
                                                    // dest1: abcdef
    //2.把 src 所指向的字符串复制到 dest,最多复制 n 个字符
    // 当 src 的长度小于 n 时,dest 的剩余部分将用空字节填充
    char dest2[10] = "abcd";
    char *src2 = "efg"; 
    strncpy(dest2+3, src2, strlen(src2));           //dest2: abcefg



   //3.
    char dest3[10] = "abc";
    char *src3 = "def";
    strncat(dest3, src3 , strlen(src3 )+1);              // dest3:abcdef
   
    return 0;
}



2.2 C++中的字符拼接

#include <iostream> // C++的头文件不带.h
#include <string.h> // 兼容原C语言头文件
 
using namespace std;
 
int main()
{
    //char s1[] = {'a','b','c', '\0'};  // 定义1:不建议使用此定义方式,经常忘记加入'\0'
    //char s1[] = "abc";                // 定义2:使用C语言数组形式定义字符串
    string s1 = "abc";                  // 定义3:使用string类定义
    string s2 = "def";
    string dest;
 
    dest = s1+s2;             //1.直接+  dest 输出 abcdef
    printf("%s");


    return 0;
}

3 c/c++字符串格式化输出


 

#include <stdio.h>

int main() {
    int num = 42;
    printf("The answer is %d\n", num);

    
    char dest[50];
    sprintf(dest, "The answer is %d", num);
    printf("%s\n", dest);
    
    return 0;
}

sprintf sprintf_s的区别

4 双引号

   string str = "{\"OperatorID\":\"";
    str = str + s_config_operatorid_;
    str=str+ ",\"OperatorSecret\":\"";
    str = str + s_config_operatorsecret_;
    str = str + "\"}";


 
    char csrc[256]="";
    sprintf_s(csrc,256,"{\"OperatorID\":\" %s\"\",\"OperatorSecret:\"%s\"}",s_config_operatorid_.c_str(),s_config_operatorsecret_.c_str());

5 time

localtime_sWindows
localtime_rlinux

 //WINDOWS 
 void main()
{
    string stime;
    struct tm tnow;                   
    time_t now = time(NULL);
    localtime_s(&tnow, &now);
    char buf_time[sizeof("yymmddhhmmss")] = { '\0' };    
    sprintf(buf_time, "%02d%02d%02d%02d%02d%02d", tnow.tm_year+1900, tnow.tm_mon+1,
        tnow.tm_mday, tnow.tm_hour, tnow.tm_min, tnow.tm_sec);
}


linux
 

#include <stdio.h>
#include <time.h>
 
int main()
{
    time_t time_seconds = time(0);
    struct tm* now_time = localtime_r(&time_seconds);
 
    printf("%d-%d-%d %d:%d:%d\n", now_time->tm_year + 1900, now_time->tm_mon + 1,
        now_time->tm_mday, now_time->tm_hour, now_time->tm_min,
        now_time->tm_sec);

}

g++ -std=c++11 lolcatimetest.cpp -o localtimetest
./localtimetest

6 char 转string

// char 转换成string  3种

void main()
{
         unsigned char bufc1[5]="ABCD";
         string s1((char*)bufc1,5);            //1.使用 string 的构造函数

         unsigned char bufc2[5]="1234";
         string s2;                            //2.声明string 后将char push_back
         for (int i = 0; i < 5; i++)
         {
           s2.push_back(bufc2[i]);
         }

        unsigned char bufc3[5]="9876";
        stringstream ss;                      //3.使用stringstream
        ss << bufc3;
        string str3 = ss.str();
         
}






 

7. 对比两个string


 

void main()
{
    string A("aBcdef");
    string B("AbcdEf");
    string C("123456");
    string D("123dfg");
    string E("aBcdef");
  
    int m = A.compare(E);             //完整的A和E的比较 2个相同返回0
    int l = A.compare(B);             //完整的A和B的比较 2个不同返回1

    int n = A.compare(1, 5, B, 0, 5); //"Bcdef"和"AbcdEf"比较 //不同返回1
    int p = A.compare(1, 5, B, 4, 2); //"Bcdef"和"Ef"比较    返回ff
    int q = C.compare(0, 3, D, 0, 3); //"123"和"123"比较     //相同返回0
}

8. 字符串中的字符无效




1.如果已经分配过内存,可能是越界导致的指令错误。
2.可能是字符数组成员的值超出了ASCII码表示范围,导致字符无效
   如:arr[[1]]=0x89;
此时,在调试时,就会显示"字符串中的字符无效".

格式化输出:可以打印

void printf_buff(char* buff, int size) 
{
    int i = 0;
    for (i = 0; i < size; i++)
    {
        printf("%02X ", (unsigned char)buff[i]); //每个字符以16进制输出
        if ((i + 1) % 8 == 0)                    //每8个字节换行
        {
            printf("\n");
        }
    }
    printf("\n\n\n\n");                          //空4行
}


 

9.cout和printf 区别

 

coutprintf
不需要格式
cout<<是一个函数,cout<<后可以跟不同的类型
需要指定格式
#include <iostream>#include <stdio.h>
在linux中,当遇到 \n 回车换行符时,进行IO操作输入输出


void main()
{

 int a=6;
 cout<<a<<endl;
 printf("%d\n",a); //需要告诉他格式
}


int main()
{
    cout << "Hello world!" << endl;//C++
    cout.operator<<("Hello,World!");
    cout.operator<<(endl);
    
    printf("Hello world!");        //C
    return 0;
}


1.printf是函数。cout是ostream对象,和<<配合使用。
2.printf是变参函数,没有类型检查,不安全。cout是通过运算符重载实现的,安全。
3.如果printf碰到不认识的类型就没办法了,而cout可以自己重载进行扩展。
4.有时候printf比cout灵活。
c++中也能使用printf,但是c中不能使用cout

10. new malloc区别

 

newmalloc
new是关键字,需要编译器支持malloc是库函数,需要头文件支持
从自由存储区(free store)上为对象动态分配内存空间从堆上动态分配内存

void main()
{
   int* p=new int;       //分配大小为sizeof(int)的空间  4字节
   int* p=new int(6);  //分配大小为sizeof(int)的空间,并且初始化为6

  int* p=(int)malloc(sizeof(int)100);//分配可以放下100个int的内存空间


  int* ptr=new int[100];//分配100个int的内存空间
  int* p=(int)malloc(sizeof(int)100);//分配可以放下100个int的内存空间
}

11.printf打印格式
 

//   %x 以16进制打印一个整数(4字节)
//   hh: char   1个字节
//   h:  short  2个字节
   char c[] = "12345678";
   int i= 12345678;
   printf("char-----%02hhx,%02hx,%02x\n", c, c, c);  // e4,fce4,12ffce4
   // 从后往前
   printf("int -----%02hhx,%02hx,%02x\n", i, i, i);  // 4e,614e,bc614e
   printf("-----%s\n", c);                           //12345678
   printf("-----%c\n", c);                           //@




12.字符串转16进制输出
 


char* str2hex(char* strin)
{
    char* ret = NULL;                         //0.返回字符串
    int str_len = strlen(strin);              //1.输入字符串strin 
    assert((str_len % 2) == 0);               //2.判断输入长度是否为2的倍数 如果不是返回
    ret = (char*)malloc(str_len / 2);         //3.分配一个空间
    for (int i = 0; i < str_len; i = i + 2)   //4.
    {
        sscanf(strin + i, "%2hhx", &ret[i / 2]);   //5.    格式化放入 ret中
    }
   // printf("%s\n", ret);
    return ret;
}
void printf_buff(char* buff, int size) 
{
    int i = 0;
    for (i = 0; i < size; i++)
    {
       // printf("i=%d  %02X ,", i,(unsigned char)buff[i]); //每个字符以16进制输出
        printf("%02X ", (unsigned char)buff[i]);
        if ((i + 1) % 8 == 0)                    //每8个字节换行
        {
            printf("\n");
        }
    }
    printf("\n\n\n\n");                          //空4行
}



void  main()
{

 char in1[] = "0123456789ABCDEF0123456789\0";
   char* out1 = str2hex((char*)in1);
   int m_outlen1 = strlen(out1);
   printf("---in1\n");
   printf_buff(out1, m_outlen1);

   char in2[] = "0123456789ABCDEF\0";
   char *out2 = str2hex((char*)in2);
   int m_outlen2 = strlen(out2);
   printf("---in2\n");
   printf_buff(out2, m_outlen2);

}

“%02x” 以0补齐2位数,如果超过2位就显示实际的数;
"%hhx" 是只输出2位数,即便超了,也只显示低2位。

“%02hhx”
只能对字符串为16进制的数字做正确转换,字符串个数还不对。

13.byte和char 区别



  头文件<windows> 定义了 byte

bytechar
有符号
-128-127
无符号
0-65535
不可以可以表中文
输出结果都会转化成数字char 输出结果都会转化为字符



 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1134251.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5G技术在职业教育领域的应用:产生巨变的技术

5G技术在职业教育领域的应用&#xff1a;产生巨变的技术 职业教育领域正面临着前所未有的挑战和机遇。随着5G技术的快速发展和普及&#xff0c;其高速度、低延迟、大容量和连接数的特性给职业教育带来了革命性的改变。本文将深入探讨5G技术在职业教育领域的应用场景、技术原理和…

Android Studio错误修复Connect to repo.maven.apache.org:443

环境 名称版本操作系统Windows10(64位)AndroidStudio2022.3.1 Patch 2 前言 最近更新了AndroidStudio编写程序的时候发现gradle时老是报read time out错误提示 分析 当出现这个警告时&#xff0c;你应该猜到这是一个连接不上的问题(Connect to repo.maven.apache.org:443)&…

huoshan device_id和iid生成记录学习分析

huoshan 和 douyin 作为字节系的产品&#xff0c;device_id 和 iid是抓包经常遇到的字段&#xff0c;代表了设备的概念。 还是熟悉的接口&#xff0c;像 device_register &#xff0c;app_alert_check 和 app_notice_status 都需要请求一遍。 这些接口跑完一遍&#xff0c;设…

【强烈推荐】视频转gif、图片拼gif,嘎嘎好用,免费免费真的免费,亲测有效,无效过来打我

问题描述 最近遇到一个需求是需要将视频生成gif&#xff0c;这个看上去不是很难&#xff0c;所以有了以下的解决办法 解决办法 首先想到的当然是自己写一个&#xff0c;用了两套代码&#xff1a; from moviepy.editor import *# 读取视频文件 video_clip VideoFileClip(&quo…

若依微服务上传图片文件代理配置

在使用若依微服务文件上传时候,文件上传成功会上传到D:/ruoyi/uploadPath目录下。默认使用9300端口进行访问图片文件,现在我想把它代理到80端口应该怎么做呢? 配置前:http://localhost:9300/statics/2023/09/24/test.jpg 配置后:http://localhost/statics/2023/09/24/test…

Kafka KRaft模式探索

1.概述 Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;它可以处理消费者在网站中的所有动作流数据。其核心组件包含Producer、Broker、Consumer&#xff0c;以及依赖的Zookeeper集群。其中Zookeeper集群是Kafka用来负责集群元数据的管理、控制器的选举等。 2.内容…

StableDiffusion学习

模型推荐 majicMIX realistic 麦橘写实(写实近景人像): https://civitai.com/models/43331/majicmix-realisticDreamShaper(各种画风, 比较全能): https://civitai.com/models/4384/dreamshaperLOFI (更精致人像面部): https://civitai.com/models/9052?modelVersionId146253…

MSQL系列(九) Mysql实战-Join算法底层原理

Mysql实战-Join算法底层原理 前面我们讲解了BTree的索引结构&#xff0c;及Mysql的存储引擎MyISAM和InnoDB,今天我们来详细讲解下Mysql的查询连接Join的算法原理 文章目录 Mysql实战-Join算法底层原理1.Simple Nested-Loop Join 简单嵌套循环2.Block Nested-Loop Join 块嵌套…

查找算法-二分查找法(Binary Search)

目录 查找算法-二分查找法&#xff08;Binary Search&#xff09; 1、说明 2、算法分析 3、C代码 查找算法-二分查找法&#xff08;Binary Search&#xff09; 1、说明 如果要查找的数据已经事先排好序了&#xff0c;就可以使用二分查找法来进行查找。二分查找法是将数据…

HackTheBox - Starting Point -- Tier 0 ---Preignition

文章目录 一 题目二 实验过程 一 题目 Tags Network、Programming、RDP、Reconnaissance、Weak Credentials译文&#xff1a;网络、编程、RDP、侦察、凭证薄弱Connect To attack the target machine, you must be on the same network.Connect to the Starting Point VPN us…

【面试经典150 | 链表】合并两个有序链表

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;递归方法二&#xff1a;迭代 写在最后 Tag 【递归】【迭代】【链表】 题目来源 21. 合并两个有序链表 题目解读 合并两个有序链表。 解题思路 一种朴素的想法是将两个链表中的值存入到数组中&#xff0c;然后对数组…

16、window11+visual studio 2022+cuda+ffmpeg进行拉流和解码(RTX3050)

基本思想:需要一个window11 下的gpu的编码和解码代码,逐开发使用,先上个图 几乎0延迟的,使用笔记本的显卡 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.0\extras\demo_suite>deviceQuery.exe deviceQuery.exe Starting...CUDA Device Query (Runtime API…

Xcode自定义快捷键

一、新建脚本 1. 编写脚本 把脚本sh文件保存在安全的目录&#xff0c;不会被删除 我这里主要是两个常用的&#xff1a; 1.打开终端: xcode-terminal.sh #!/bin/shif [ -n "$XcodeProjectPath" ]; then open -a Terminal "$XcodeProjectPath"/.. elseo…

macOS鼠标管理操作增强BetterMouse简体中文

BetterMouse是一款专为Mac用户设计的鼠标增强工具&#xff0c;旨在帮助用户更好地掌握和管理鼠标操作。它提供了全局鼠标手势、高度可定制的鼠标设置选项以及一些有用的鼠标增强功能&#xff0c;如鼠标放大镜、鼠标轨迹和应用程序切换功能。这些功能可以大大提高用户的工作效率…

Redis桌面管理工具:Redis Desktop Manager for Mac

Redis Desktop Manager是一款非常实用的Redis管理工具&#xff0c;它不仅提供了方便易用的图形用户界面&#xff0c;还支持多种Redis数据结构&#xff0c;可以帮助用户轻松地完成Redis数据库的管理工作。 以下是一些推荐Redis Desktop Manager的理由&#xff1a; 多平台支持&a…

2021-arXiv-The Power of Scale for Parameter-Efficient Prompt Tuning

2021-arXiv-The Power of Scale for Parameter-Efficient Prompt Tuning Paper: https://arxiv.org/abs/2104.08691 Code: https://github.com/google-research/ text-to-text-transfer-transformer/ blob/main/released_checkpoints.md# lm-adapted-t511lm100k 在这项工作中&…

如何编辑pdf?推荐福昕高级pdf编辑器

这里写目录标题 安装教程1.双击FoxitPhantomPDF941_L10N_Setup.exe安装2.打开FiX UZ1文件夹 复制plugins文件夹和FoxitPhantomPDF.exe到安装目录中替换3. 双击Express2BusinessFix New.reg导入注册表 如何复制页面如何修改pdf的内容福昕高级pdf编辑器安装包 【Note】学校要求加…

http代理IP它有哪些应用场景?如何提升访问速度?

随着互联网的快速发展&#xff0c;越来越多的人开始关注网络速度和安全性。其中&#xff0c;代理IP技术作为一种有效的网络加速和安全解决方案&#xff0c;越来越受到人们的关注。那么&#xff0c;http代理IP有哪些应用场景&#xff1f;又如何提升访问速度呢&#xff1f; 一、h…

TeeChart for .NET 2023.10.19 Crack

TeeChart.NET 的 TeeChart 图表控件提供了一个出色的通用组件套件&#xff0c;可满足无数的图表需求&#xff0c;也针对重要的垂直领域&#xff0c;例如金融、科学和统计领域。 数据可视化 数十种完全可定制的交互式图表类型、地图和仪表指示器&#xff0c;以及完整的功能集&am…

DevOps持续集成-Jenkins(1)

文章目录 DevOpsDevOps概述Code阶段工具&#xff08;centos7-gitlab主机&#xff09;Windows下安装Git&#xff08;作用是&#xff1a;使我们可以上传代码到GitLab&#xff09;Linux下安装GitLab⭐&#xff08;作用是&#xff1a;运行一个GitLab接收代码&#xff09;环境准备先…