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

这篇具有很好参考价值的文章主要介绍了C++-openssl-aes-加密解密。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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的区别

使用openssl库实现c语言某个内存段aes加解密,c++,开发语言

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_s Windows
localtime_r linux
 //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();
         
}


使用openssl库实现c语言某个内存段aes加解密,c++,开发语言

使用openssl库实现c语言某个内存段aes加解密,c++,开发语言

 

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 区别  

cout printf
不需要格式
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区别  

new malloc
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

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



 

 文章来源地址https://www.toymoban.com/news/detail-767339.html

到了这里,关于C++-openssl-aes-加密解密的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • go语言使用AES加密解密

    Go语言提供了标准库中的crypto/aes包来支持AES加密和解密。下面是使用AES-128-CBC模式加密和解密的示例代码:

    2024年02月06日
    浏览(84)
  • Java 实现 AES 加密和解密完整示例

    AES,全称为 Advanced Encryption Standard,是一种分组密码算法,用于保护敏感数据的传输和存储。AES 分为 128 位和 256 位两种密钥长度,可以对数据进行加密和解密,保证数据的安全性和完整性。AES 主要应用于电子商务、移动支付、网络安全等领域,被广泛运用于现代社会的各个

    2024年02月04日
    浏览(67)
  • Java:SpringBoot使用AES对JSON数据加密和解密

    客户端和服务端都可以加密和解密,使用base64进行网络传输 加密方 解密方 2.1、项目结构 2.2、常规业务代码 pom.xml Application.java WebMvcConfig.java CrossConfig.java JsonRequest.java JsonResult.java JsonResultVO.java IndexController.java UserController.java 2.3、加密的实现 application.yml SecretData.java DecryptRequ

    2024年02月11日
    浏览(58)
  • 文件的加密与解密——Openssl的妙用:安装与使用案例

    Openssl应用——文件加解密 1. 加密简介 1.1 加密类型 1.1.1 对称加密(或者叫密钥加密) 使用一摸一样的密钥进行加解密; 优点 :加解密速度快; 1.1.2 非对称加密(或者叫公钥加密) 使用不相同的密钥进行加解密; 优点 :安全; 公钥加密有2组密钥:公钥和私钥。二者被称

    2024年03月11日
    浏览(36)
  • php对称加密AES加密解密

    AES-128-ECB和AES-256-CBC是两种常见的AES加密模式,它们在加密方式和安全性上有以下区别: 加密方式: AES-128-ECB:ECB(Electronic Codebook)模式是最简单的AES加密模式,它将数据分成固定大小的块,每个块独立加密。这意味着相同的明文块将始终加密为相同的密文块,因此ECB模式不

    2024年02月09日
    浏览(64)
  • 前端AES加密解密

    前端经常会遇到这种接口和参数需要加密的情况,目前用的最多的就是aes加密了。以下就是操作步骤。以下方式适用各个前端框架,请自行根据框架修改对应语法 1.安装 CryptoJS 这个库就是用来加密的核心,直接打开项目终端,输入 npm install crypto-js --save 2. 新建 crypto.js 在 @/

    2024年02月13日
    浏览(62)
  • Android AES加密解密

     AES算法全称Advanced Encryption Standard。它是典型的“对称加密算法”,主要作用是保证私密信息不被泄露。 一、密钥 密钥是AES算法实现加密和解密的根本,因为 它对明文的加密和解密需要使用同一个密钥 。 AES支持三种长度的密钥:128位,192位,256位。 二、填充 AES算法在对明

    2024年02月04日
    浏览(62)
  • uniapp AES加密解密

    uniapp里我知道的有两种aes加密解密方式。 一、引入crypto-js 1.需要在uniapp项目根目录里,打开命令行,执行如下命令: 2.在项目根目录,创建一个utils文件夹,并创建一个aes_endecrypt.js文件  3.在main.js文件中,引入方法,并注册为全局方法 4.在页面中使用aes加密,解密 二、第二

    2024年02月13日
    浏览(49)
  • kotlin aes 加密解密

    aes算法对key的字节数有要求 所以对输入的key要做填充处理

    2024年02月07日
    浏览(52)
  • 使用 OpenSSL 工具撰写 Bash 脚本进行密码明文的加密与解密

    Written By: Xinyao Tian 本文档描述了使用 OpenSSL 工具在 Bash 脚本中对密码进行加密和解密的简单方式。 使用 Base64 算法进行密码的加密 脚本名称为 encryptPasswd.sh , 脚本内容如下: 使用 Base64 算法进行密码的解密 脚本名称为 decryptPasswd.sh , 脚本内容如下: 使用方法 检视目录中的脚本

    2024年02月06日
    浏览(148)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包