openssl的运用

一、概述

     Opssl是一个用于TLS/SSL协议的工具包,也是一个通用密码库。

    包含了国密sm2 sm3 sm4,包含了对称加密,非对称加密,单项散列,伪随机、签名,密码交换,证书等一些算法库。

为了深层次的学习Openssl,我们经常常从它的源代码入手

 主要的源代码有:

apps目录下的各个程序,对应于openssl的各项命令;

demos下的各种源代码;

engines下的各种engine实现;

test目录下的各种源代码。

     

SSL/TLS 握手过程

1.客户端向服务器发出问候语,其中包含支持的协议版本、加密套件和随机数。

2.服务器进行回应问候语,包含着选择的协议版本、加密套件和随机数。

3.服务器向客户端发送其证书,包含着服务器的公钥和身份信息。客户端验证证书并向服务器发送其证书。

4.客户端和服务器使用 Diffie-Hellman 密钥交换协议协商一个会话密钥

5.客户端和服务器交换更改密码规范消息,其中包含用于加密和解密后续通信的密钥

6.客户端和服务器交换完消息,握手成功。

握手类型:

1.全握手:客户端和服务器交换所有必需的信息

2.半握手:如果客户端和服务器之前建立了会话,则可以使用恢复握手来重新建立会话。恢复握手比全握手更快,因为它只需要交换较少的信息

    在Linux和Windows上都可以下载,而在Linux一般自带,但是一般里面含有漏洞,

可以升级一下

比如这个

在kali中进行下载时,先更新源和升级源,换成国内的源

apt-get update

apt-get upgrade

安装基础编译环境

 apt-get install build-essential

编译安装zlib库

   wget http://zlib.net/zlib-1.2.5.tar.gz    //可以去http://www.zlib.net/ 查看并下载最新的zlib库

    tar -zxf zlib-1.2.5.tar.gz

    cd zlib-1.2.5/

    ./configure --prefix=/usr/local

    make && make install

然后卸载旧版本的Openssl

apt-get purge openssl

rm -rf /etc/ssl 

#删除配置文件

编译安装Openssl

wget ftp://ftp.openssl.org/source/openss-1.0.0c.tar.gz

tar -zxv openssl-3.2.2c.tar.gz

cd openssl-1.0.0c/

./config --prefix=/usr/local --openssldir=/usr/local/ssl

make && make install

./config shared --prefix=/usr/local --openssldir=/usr/local/ssl

 make clean

make  && make install

最终:安装好了!!!

openssl 命令行在/usr/local/bin

配置安装在 /usr/local/ssl

头文件在 /usr/local/include/openssl

so库文件  在/usr/local/lib

但是在kali2024版本里面自带Openssl,以上的过程是针对2023版本的。

DES算法(分组密码)

输入输出长度相同

密钥,输入64比特,每隔7个比特设置一个错误检查,也是就校验,所以为56比特。

    如果不是8字节(64比特),需要补0

有16轮循环,每一轮使用不同的子密钥,每两轮讲左右侧对调

   二、Openssl命令行使用

一般的语法规则:

      

openssl [命令】 【选项】【参数】

加密和解密操作:

可以使用enc和dec命令来实现

openssl enc -aes-256-cbc -in input.txt -out output.enc


-aes-256-cbc :指定加密算法和模式
-in input.txt :指定要加密的输入文件
-out output.enc :指定加密后的输出文件

openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-noverify] [-quiet] [-table] {password}
常用选项有:

-1:使用md5加密算法
-salt string:加入随机数,最多8位随机数
-in file:对输入的文件内容进行加密
-stdion:对标准输入的内容进行加密

明文:

加密及密文:

解密:

openssl dec -aes-256-cbc -in output.txt -out output.enc 

生成随机数:

主要运用rand命令

openssl rand [-out file] [-rand file(s)] [-base64] [-hex] num
-out file:存入其他文件
-base64:使用base64 编码格式
-hex:使用16进制编码格式

生成密钥对

openssl genrsa [-out filename] [-passout arg] [-des] [-des3] [-idea] [-f4] [-3] [-rand file(s)] [-engine id] [numbits]
常用选项:
-out filename:将生成的私钥保存至指定的文件中

-des|-des3|-idea:不同的加密算法

numbits:指定生成私钥的大小,默认是2048

证书管理工作

  其中包括生成证书签名(CSR)、创建自签名证书、验证证书以及吊销证书。

生成(CSR):

openssl req -new -key private.key -out csr.pem

req代表要使用CSR生成证书

创建自签名证书:

openssl x509 -req -in csr.pem -signkey private.key -out certificate.pem

验证证书:

打开x509

openssl x509 -noout -text  -in ca.pem

查看里面的内容

然后验证公钥私钥是否匹配

diff -eq <(openssl x509 -pubkey -noout -in cert.crt) <(openssl rsa -pubout -in cert.key)

如果匹配的话,

writing RSA key

验证证书CA

openssl verify -CAfile ca.pem client.pem


 

三、openssl BIO接口

Openssl的抽象IO(即BIO),是Openssl对于IO类型的抽象封装,包括了:内存、文件、日志、标准输入输出、socket(TCP/UDP)、加密、解密、摘要和SSL通道。

Openssl BIO 通过回调函数为用户隐藏了底层实现细节,所有类型的 bio 的调用大体上是类似的。
Bio 中的数据能从一个 BIO 传送到另外一个 BIO 或者是应用程序

   BIO包含了多种接口,用于控制在BIO_METHOD中的不同实现函数,包括了六种filter型和8

种source/sink型。

数据源:source/sink 类型,比如:sokect BIO和文件BIO

BIO的数据结构主要有两个,在crypto/bio.h的定义如下:

1、BIO_METHOD

   ~  type  :具体BIO类型;

   ~ name :名字;

   ~ bwrite : 具体BIO操作回调函数;

  ~ bread : 具体BIO操作回调函数;

  ~ bputs : 写入字符串回调函数;

  ~ bgets : 读字符串函数

   ~ ctrl : 控制回调函数

   ~ create :生成具体BIO回调函数;

   ~ destroy :销毁

  ~ callback_ctrl :具体BIO控制回调函数,该函数可由调用者(而不是实现者)来实现,然后通过BIO_set_callback等函数来设置。

BIO allocation and freeing functions

# include <openssl/bio.h>

BIO *  BIO_new(BIO_METHOD *type);   //BIO_new()函数使用方法type返回一个新的BIO,调用失败,返回新创建的BIO或NULL

int    BIO_set(BIO *a,BIO_METHOD *type);    //设置现有BIO的方法,成功则返回1,失败则返回0
int    BIO_free(BIO *a);    //释放单个BIO,并返回值 ,成功则返回1,失败则返回0
  
void   BIO_vfree(BIO *a);   //释放单个BIO,但不返回值
void   BIO_free_all(BIO *a);   //释放整个BIO链,发生错误的时候不会停止,也没有返回值

BIO I/O functions

 #include <openssl/bio.h>

 int    BIO_read(BIO *b, void *buf, int len);
//尝试从BIO b中读取len个字节,并将数据放入buf中

 int    BIO_gets(BIO *b, char *buf, int size);
// 执行获取操作,也将数据放置在buf
 int    BIO_write(BIO *b, const void *buf, int len);
// 将len个字节从buf写入BIO b中
 int    BIO_puts(BIO *b, const char *buf);
//将以null终止的字符串buf写入BIO b中

如果返回的值为正则读取和写入成功,者如果结果为0或-1,则没有成功读取或写入数据。如果返回值为-2,则不会以特定的BIO类型实现该操作。

formatted output to a BIO

 #include <openssl/bio.h>

 int BIO_printf(BIO *bio, const char *format, ...)  //输出发送到指定的BIO bio
 int BIO_vprintf(BIO *bio, const char *format, va_list args)  
//输出被发送到指定的BIO bio支持所有通用格式说明符。参数列表args是stdarg参数列表。

 int BIO_snprintf(char *buf, size_t n, const char *format, ...)
//用于没有通用snprintf()函数的平台。但是size参数n指定输出缓冲区的大小

 int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args)



返回写入的字节数,出错为-1

2.生物

truct bio_st {
    BIO_METHOD *method;
    /* bio, mode, argp, argi, argl, ret */
    long (*callback)(struct bio_st *,int,const char *,int, long,long);
    char *cb_arg;   /* first argument for the callback */
    int  init;
    int  shutdown;
    int  flags;      /* extra storage */
    int  retry_reason;
    int  num;
    void *ptr;
    structbio_st *next_bio;   /*usedbyfilterBIOs*/
    struct bio_st *prev_bio; /* used by filter BIOs */
    int references;
    nsigned long  num_read;
    unsigned long num_write;
    CRYPTO_EX_DATA ex_data;
};

/*
主要项含义:

init:   具体句柄初始化标记,初始化后为1。
        比如:文件 BIO 中,通过 BIO_set_fp 关联一个文件指针时,该标记则置 1 ;
             socket BIO中,通过 BIO_set_fd 关联一个链接时,设置该标记为 1。

shutdown: BIO 关闭标记,当该值不为 0 时,释放资源; 该值可以通过控制函 数来设置。

flags:  有些 BIO 实现需要它来控制各个函数的行为。
        比如文件 BIO 默认该值为 BIO_FLAGS_UPLINK,
        这时文件读操作调用UP_fread 函数而不是调用fread 函数。

retry_reason: 重试原因,主要用在 socket 和 ssl BIO 的异步阻塞。
              比如 socket bio 中,遇到 WSAEWOULDBLOCK 错误时,
              openssl 告诉用户的操作需要重试。

num:  该值因具体 BIO 而异,比如 socket BIO 中 num 用来存放链接字。

ptr:  指针,体 bio 有不同含义。比如:
           文件 BIO 中它用来存放文件句柄;
           mem BIO 中它用来存放内存地址;
           connect BIO 中它用来存放 BIO_CONNECT 数据,
           accept BIO 中它用来存放 BIO_ACCEPT 数据。

next_bio: 下一个 BIO 地址,BIO 数据可以从一个BIO传送到另一个BIO,
          该值指明了下一个 BIO 的地址。

references: 被引用数量。
num_read:   BIO 中已读取的字节数。
num_write:  BIO 中已写入的字节数。
ex_data:    用于存放额外数据。
*/



typedef struct bio_st BIO;

struct bio_st
{
     BIO_METHOD *method; //BIO方法结构,是决定BIO类型和行为的重要参数,各种BIO的不同之处主要也正在于此项。

     long (*callback)(struct bio_st *,int,const char *,int, long,long); //BIO回调函数
     char *cb_arg;                                                      //回调函数的第一个参量

     int init;         //初始化标志,初始化了为1,否则为0。比如文件BIO 中,通过BIO_set_fp
                       //关联一个文件指针时,该标记则置1。
     int shutdown;     //BIO开关标志,如果为BIO_CLOSE,则释放BIO时自动释放持有的资源,否则不自动释放持有资源
     int flags;        //有些BIO 实现需要它来控制各个函数的行为。比如文件BIO 默认该值为BIO_FLAGS_UPLINK,
                       //这时文件读操作调用UP_fread 函数而不是调用fread 函数。
     int retry_reason; //重试原因,主要用在socket 和ssl BIO 的异步阻塞。比如socketbio 中,遇到
                       //WSAEWOULDBLOCK 错误时,openssl 告诉用户的操作需要重试
     int num;          //该值因具体BIO 而异,比如socket BIO 中num 用来存放链接字。
     void *ptr;        //ptr:指针,具体bio 有不同含义。比如文件BIO中它用来存放文件句柄;mem bio 中它用来存放
                       //内存地址;connect bio 中它用来存放BIO_CONNECT 数据,acceptbio 中它
                       //用来存放BIO_ACCEPT数据。

     struct bio_st *next_bio; //BIO链中下一个BIO 地址,BIO 数据可以从一个BIO 传送到另一个BIO。
     struct bio_st *prev_bio; //BIO链中上一个BIO 地址,

     int references;          //引用计数
     unsigned long num_read;  //已读出的数据长度
     unsigned long num_write; //已写入的数据长度

     CRYPTO_EX_DATA ex_data;  //额外数据
};

举一个例子,

   Memory BIO对内存的操作,包括了读写操作。使用Openssl需要创建一个SSL_CTX对象,跟踪共享信息的上下文,例如使用的证书、私钥。

#include <stdio.h>
#include <OpenSSL/bio.h>

int main() 
{
	BIO *b=NULL;
	int len=0;
	char *out=NULL;
	
	b=BIO_new(BIO_s_mem()); 			//生成一个mem类型的BIO,用于对内存进行I/O操作
	len=BIO_write(b,"OpenSSL",7);		//将字符串"OpenSSL"写入bio,长度为7
	len=BIO_printf(b,"%s","zcp");		//将字符串"zcp"写入bio

	len=BIO_ctrl_pending(b);			//得到缓冲区中待读取大小

	out=(char *)OPENSSL_malloc(len);    //根据数据的大小来分配数据
	len=BIO_read(b,out,len);			//将bio中的内容写入out缓冲区
	   
	OPENSSL_free(out);
	BIO_free(b);
	return 0;
}

四、密码学的基本术语

加密

     是一个用于将称为纯文本的简单可读数据转换为称为密文的不可读数据的过程,只有在用户知道加密密钥的情况下才能转换为纯文本。在密码学里面包含着两种加密方式:对称加密和非对称加密。

编码

      以不同类型的系统可以轻松使用的格式转换数据的过程。用于编码数据的算法是公开可用的,如果该人知道该算法,对其进行解码,不需要任何密钥来解码信息,它很容易逆转,用于确保数据的完整性和可用性。编码算法示例:ASCII、UNICODE、URL 编码、Base64。

应用场景:

     覆盖网络通信协议:SSL/TLS ,路由器的IPsec,手机的3GPP(3G、4G、5G)

    行业大数据业务与平台:区块链

     数字货币与电子支付:法定货币

签名

     为了防止伪造、篡改和否认,但是要正确运用数字签名技术还有一个非常大的前提,那就是用来验证签名的公钥必须真正的属于发送者。

如何使公钥真正发送给发送者,那么就需要证书了。

证书

       证书是由认证机构(CA)颁发的数字文件,用于证明某个实体(通常是个人或组织)的身份和公钥的有效性。证书包含了主体的身份信息、公钥以及CA的数字签名。可以用于公钥验证、防止中间人攻击、加密通信。

   (图解如上:)

证书的格式:

  证书的生命周期

   从证书申请到被吊销的整体过程

1.证书申请,必须生成一对密钥对,我们常用RSA密钥、DSA密钥。

2.证书颁发,一般有CA的工作人员对用户信息进行审查。

3.证书验证,验证的信息包括CA的数字证书、证书的有效期、证书是否被吊销等信息,我们一般使用verify程序完成验证,没有详细的资料或能力验证时,可以到CA或者CA指定的机构验证证书。

4.证书吊销,两种方法:从CA证书数据库中删除被吊销的证书;对外公布被撤销的证书信息。

5.证书吊销,证书的使用有一定的年限,过期后要进行更新。

CA  :

   负责创建和分配证书,受用户信任的权威机构。

     

CSR(证书签名请求文件)

    用户向CA请求数字证书时,用户需要再自己的电脑中先产生一个公私钥对,用户需要保管好自己的私钥,然后再把公钥和你的个人信息发送给CA机构,CA机构通过你的公钥和个人信息最终签发出数字证书。目前很多人常用的一般是在线产生的CSR。

CSR在线生成工具:


https://www.chinassl.net/ssltools/generator-csr.html

什么样的SSL证书才是安全的证书

  由可信的CA机构签发(可以冒充);访问的地址跟证书认证地址相符合;证书在有效时间内。

如何冒充可信的CA机构?

利用Mkcert工具,

https://github.com/FiloSottile/mkcert

五、RSA的签名:

生成签名需要公钥和私钥:先生成私钥再从私钥中提取出来公钥

创造一个消息:

接下来就用私钥对消息生成一个sha256的签名

cat 命令来查看的时候出现了乱码的现象,因为这个签名是一个二进制

看一下二进制的形式

证明成功了!!!

给大家推荐一个密码学习的平台:

CryptoHack

先创建一个新目录

六、将http升级为https的步骤

   在kali里面,将http升级为https有很多方法。现在演示一种利用Openssl的方法

SSL证书签发流程:

    由于客户端是发起通信的一方,双方没有协商好的加密算法,服务端也不可能持有客户端的公钥信息,所以证书不能被加密发送,那么要解决这个问题就必须引入第三方可信机构(CA),客户端信任它,它就可以对服务器证书做出认证,具体来说就是使用自己的私钥对服务器证书进行签名,签名后的信息包含在证书内,这样客户端只需要持有各个 CA 的公钥,便可以对签名信息进行解密来验证证书的有效性。

 NGINX和Openss

   首先先下载NGINX,kali如果不换源的话,需要找到符合配置的NGINX,所以我换成了清华大学的源。

https和http

访问浏览器的问题。

利用NGINX创建一个网站。

先创建一个目录来进行存放网站的目录。

然后在nano里面写一个简单的前端。

编辑 Nginx 的配置文件,为新网站设置一个服务器块

sudo nano /etc/nginx/sites-available/mywebsite
server {
    listen 80;
    server_name mywebsite;

    location / {
        root /var/www/mywebsite;
        index index.html index.htm;
    }
}

sites-enabled 目录中创建一个软链接,以启用配置。

    

重启 Nginx 之前,测试配置文件是否有错误,如果没有问题的话,就会出现以下:

之后再进行重启操作就可以了。

sudo systemctl restart nginx

可以查看一下端口是否开放

查看防火墙是否关闭和selinux是否禁用,如果没有那就添加一些规则。

创建一个新的目录:

先生成一个私钥

从私钥里面提取出来公钥

然后申请证书

然后就可以生成一个自签证书。

填写一些内容:

  1. 国家
  2. 省份或州;
  3. 公司的名字;
  4. 组织部的名字;
  5. 服务器的完全限定域名(FQDN),或者是证书所有者的名字;
  6. 邮箱账号;

查看一下证书

openssl x509 -text -in server.crt

查看证书的时间

openssl x509 -in server.crt -noout -dates

配置到NGINX里面

    记得打开网站之前打开NGINX哦!

sudo systemctl status nginx
#查看NGINX的状态

sudo systemctl start nginx

#开启NGINX

或者直接设置为开机自启

sudo systemctl enable nginx

    到现在为止,我们就把http升级为https,将它的保密性提高,但是没有经过网站的验证是我们自己生成的。注意:自己生成的SSL证书仍然有安全风险。

利用Apache和Openssl

创建一个目录

cd && mkdir -p /home/kali/Desktop/myCA/signedcerts && mkdir /home/kali/Desktop/myCA/private && cd /home/kali/Desktop/myCA


#创建桌面下的myCA目录存放CA相关信息


#myCA/signedcerts :存放CA认证的证书副本
#myCA/private  :存放私钥



echo '01' > serial && touch Cert.txt
#创建证书库,两个文件存放CA每一次颁发证书的记录

新建一个 caconfig.cnf 文件来配置 CA 信息,


[ local_ca_policy ]
commonName              = supplied
stateOrProvinceName     = supplied
countryName             = supplied
emailAddress            = supplied
organizationName        = supplied
organizationalUnitName  = supplied
#      
#
# x509 extensions to use when generating server certificates.
#
[ local_ca_extensions ]
basicConstraints        = CA:false
#      
#
# The default root certificate generation policy.
# 生成 CA 根证书设置
[ req ]
default_bits    = 2048                                          # 默认生成证书请求时的秘钥长度
default_keyfile = /home/kali/Desktop/myCA/private/cakey.pem # 默认私钥存放位置
default_md      = sha256                                        # 默认证书签名时使用的摘要算法
#     
prompt                  = no
distinguished_name      = root_ca_distinguished_name
x509_extensions         = root_ca_extensions
#
#
# Root Certificate Authority distinguished name.  Change these fields to match
# your local environment!
#
[ root_ca_distinguished_name ]
commonName              = myCA              # CA 机构名
stateOrProvinceName     = JS                # 所在省份
countryName             = CN                # 所在国家(仅限两字符)
emailAddress            = 123456@qq.com    # 邮箱
organizationName        = YUNXI            # 组织名
organizationalUnitName  = YNPC             # 单位名
#      
[ root_ca_extensions ]
basicConstraints        = CA:true

生成自签名的 CA 根证书和秘钥

然后再服务器上生成证书

最后就可以了。

七、Openssl源代码的学习

     对于openssl函数的学习,主要查看openssl自身是如何调用的,或者查看函数的实现。对于openssl中只有实现而没有调用的函数。

   之前演示的内容,基本上是利用命令行进行操作的,接下来就来看看openssl的具体代码吧!

  以RSA的加密/解密来演示,其他的生成的密钥/签名之类,其实也差不多。

      加密函数RSA_public_encrypt

int RSA_public_encrypt(int flen,const unsigned char *from,unsigned char *to,
RSA *rsa,int passing)

flent :明文数据的长度字节数

from :明文数据

to  :存放生成的密文数据

rsa :公钥

padding :填充方式

RSA_public_encrypt一次性只能加密(密钥的位数 / 8 = N)字节的数据,且加密前后数据长度相等。

举例子:1024bit的密钥,一次性可加密 1024 /8=128字节,由于使用了填充,占用了11字节

因此真正加密的明文数据为128-11=117字节。

但是我们多加密几次,拼接在一起就可以了。

生成密钥对

封装了2个函数,一个生成密钥对文件,一个生成密钥对的内存数据

利用c++代码来写:


void RSAC::generateKeyPair(const QString &priKeyFile, const QString &pubKeyFile, int bits)  //生成rsa的密钥对,并将私钥和公钥保存到priKeyFile和pubKeyFile里面
{
    
    RSA* rsa = RSA_generate_key(bits, RSA_F4, nullptr, nullptr);
    // 生成一个密钥对,bits参数负责指定密钥长度,RSA_F4是e值,通常为65537,表示一个质数,nullptr表示不使用回调函数。

    BIO *bp = BIO_new(BIO_s_file());
  //创建一个文件类型的BIO
    BIO_write_filename(bp, (void*)pubKeyFile.toStdString().c_str());
  // 将公钥文件的路径写入BIO里面
    PEM_write_bio_RSAPublicKey(bp, rsa);
  // 将rsa公钥以pem的格式写入BIO里面
    BIO_free_all(bp);
  //释放BIO资源
   
    bp = BIO_new(BIO_s_file());
    BIO_write_filename(bp, (void*)priKeyFile.toStdString().c_str());
    PEM_write_bio_RSAPrivateKey(bp, rsa, nullptr, nullptr, 0, nullptr, nullptr);
    CRYPTO_cleanup_all_ex_data(); //清理Openssl的线程局部数据
    BIO_free_all(bp); 
    RSA_free(rsa);//释放rsa密钥结构的内存
}


void RSAC::generateKeyPair(QByteArray &privateKey, QByteArray &pubKey, int bits)
{
  //用于生成RSA密钥对,并将私钥和公钥分别保存在QByteArray对象中
    RSA *keyPair = RSA_generate_key(bits, RSA_F4, nullptr, nullptr);

    BIO *pri = BIO_new(BIO_s_mem()); //创建一个内存类型的BIO,用于存储私钥。
    BIO *pub = BIO_new(BIO_s_mem()); //创建另一个内存类型的BIO,用于存储公钥

    PEM_write_bio_RSAPrivateKey(pri, keyPair, nullptr, nullptr, 0, nullptr, nullptr);
    //将RSA私钥以PEM格式写入pri BIO
    PEM_write_bio_RSA_PUBKEY(pub, keyPair);
    //将RSA公钥以PEM格式写入pub BIO

    int pri_len = BIO_pending(pri);
    int pub_len = BIO_pending(pub);  //获取长度

    privateKey.resize(pri_len);
    pubKey.resize(pub_len);

    BIO_read(pri, privateKey.data(), pri_len);
    BIO_read(pub, pubKey.data(), pub_len);

    // 内存释放
    RSA_free(keyPair);
    BIO_free_all(pub);
    BIO_free_all(pri);
}

其实,你学习了c语言和openssl 里面的BIO接口的基本知识也就能写出来这个脚本了。

恶补一番c++,

    c++的优势,针对不同的对象去做实例化(OO思想)

面对对象的思想,面对对象来看问题,而不是针对一个个函数和变量。每个对象都是一个完整的独立的个体,它是由相关的属性和行为组合。

   封装,把对象的属性和方法结合成一个独立的系统单位,并尽可能隐藏对象的内部细节。封装是面对对象思想的描述基础。

  抽象,对具体问题进行概括的过程,是对一类公共问题进行统一描述的过程。可以理解为一个得到所有参与活动的有效个体支持的协议。

  继承,子类对象与其基类相同的全部属性和方法。

  多态,基类中定义的属性和行为被子类继承后可以具有不同的数据类型或者表现行为等特性。

cout ,一个输出流对象,属于basic_ostream类的对象。ostream类在iostream头文件中定义

using namespace std;     名字空间,就是c++标准库所使用的所有标识符(即类、函数、对象的名称)多少在同一个名字空间(std)中定义

<<  在c语言里面左移,但是在c++里面发生了变化。

总结

   学习openssl主要可以分为两个部分,一是利用Crypto library 进行密码学相关代码进行的操作,二是利用 SSL library进对SSL、TLS的代码开发。

对于Crypto library,先要学习使用对称加密、非对称加密、数字签名、哈希函数、随机数生成,然后学习如何进行密钥的管理、密码协议的实现、并优化我们算法的性能,最后去研究如何修复密码漏洞、对密码库进行更新。

对于SSL、TLS库,加深对协议的理解,并开展一些实践比如建立安全连接、生成自签证书、配置SSL/TLS的参数、调试SSL/TLS连接,最后的话,还是归到如何对SSL/TLS进行安全审计、优化连接性能的方面。

    

参考于:https://www.cnblogs.com/yxy666/p/9606286.html

https://zhuanlan.zhihu.com/p/667217572
OpenSSL BIO介绍与使用-天翼云开发者社区 - 天翼云

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值