学习笔记之加密解密,PKI,CA

本文详细介绍了加密解密技术的基本概念,包括对称加密、公钥加密和单向加密等不同加密方式的特点与应用场景。此外还讲解了OpenSSL和GPG这两种常用的Linux加密工具,并深入探讨了公钥基础设施(PKI)的组成及其工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.加密解密

背景:在网络通信中为了达到安全需要,比如通信保密性,保证信息完整性和可用性,这就需要一些技术,下面就来介绍相关的技术

技术包括:加密和解密

       服务(用于抵御***的服务,也即是为了上述安全目标而特地设计的安全服务)

 

 加密和解密:

      传统加密方法:替代加密方法、置换加密方法

      现代加密方法:主要是现代块加密方法

注:真正的加密主要依赖密钥而不是加密算法

 服务:

    认证机制

    访问控制机制

 加密包括:

      对称加密

      公钥加密

      单向加密

      认证加密

2.对Linux系统:为了实现上述安全目标需要一些工具需要一些服务来实现上述功能,而linux的常用工具如下:

   linux常用于上述功能(就是的加密算法、协议或服务等)

   解决方案的工具主要有两个OpenSSL(ssl),GPG(pgp)

     OpenSSL(ssl):是ssl协议和加密解密的实现

     GPG(pgp):是gpg协议的实现

 

3. OpenSSL是什么?

   OpenSSL由三部分组成:

         libencrypt库(用于实现加密解密的库)

         libssl库(用于实现ssl安全通信机制的库)

         openssl多用途命令行工具(能实现加密解密等)

   

4.详解加密解密

加密算法和协议:(我们了解工作模式就行了)

  4.1对称加密:加密和解密使用同一个密钥

      常见的方式:

      DES:data encryption standard 使用16位加密

      3DES:Triple DES(即三倍的DES)

      AES:advanced encryption standart高级加密

          (128bits,192bits,256bits,384bits)

      blowfish

      twofish

      IDEA

      RC6

      CASTS

     加密算法特性: 

        1、加密解密使用同一个密钥 

        2、将原始数据分隔成为固定大小的块逐个进行加密

      缺陷:

        1、密钥过多()

        2、密钥发放困难

  4.2公钥加密:密钥分为公钥和私钥

    公钥:从私钥中提取产生;可公开给所有人;pubkey

    私钥:通过工具创建,使用者自己留存,必须保证其私密性:secret key

    特点:用公钥加密的数据,只能使用与之配对儿的私钥解密;反之亦然 

   

   公钥加密的算法:

     算法:RSA,DSA,ELGamal

         dsa不能用于加密解密,仅能用于签名

         rsa:既能加密解密又能用于签名

         DSS:Digital Signature Standard(数字签名标准)

         DSA:Digital Signature Algorthm

    公钥加密用途:

        数字签名:主要在于让接收方确认发送方的身份

        密钥交换:发送方用对方公钥加密一个对称密钥,并发送给对方

        数据加密

        主要是前两种

    双方通信的加密过程步骤:

      第一:发送方(A)先生成一份数据,为了保证数据安全无误保密的送达给接收方(B),A要先用单向加密的算法计算出这段数据的特征码

      第二:A会用自己的私钥加密这段特征码,并将结果附加在数据后面,

      第三:A生成一个临时的对称密钥,并使用这对称密钥加密整段数据

      第四:A会获取B的公钥,并使用B的公钥去再加密上一步已经加密的整段数据,并发送给B,实现秘密通信

    双方的解密过程:

       第一:B用自己的私钥去解密发送过来的对称密钥

       第二:用对称密钥解密整段加密的内容

       第三:用A的公钥去解密这段特征码,能解密则判断是A发送过来的,A的身份得到验证。

       第四:B再用同样的对称加密算法去计算这段数据的特征码,并与解密出来的进行比较,如果相同,数据完整性得到验证,同时保密性也得到验证。

    

    思考:这中间存在安全隐患就是,中途有个人在冒充,同时冒充AB,这时中间人就将AB的信息全部看了一遍。为了解决这个问题于是就有了第三方CA

 

   4.3 单向加密:即提取数据指纹(特征码),只能加密,不能解密

    

     特性:定长输出,雪崩效应(初始结果的微小改变将导致结果的巨大变化)

     功能:实现数据的完整性校验

     算法:md5:Message Digest5,128bits消息摘要算法

         sha1, sha256,sha224,  sha384,  sha512

         sha1:secure hash algorthm 1,安全的hash算法

 

 

5. PKI:public key infrastructure

     公钥基础设施

  它是以CA为核心生成的另一个安全机构

  其组成:

      签证机构:CA

      注册机构:RA

      证书吊销列表:CRL

      证书存取库

  证书包含的内容:

     X509v3(数字证书结构标准v3版):定义了证书的结构以及认证协议标准

         版本号: 

         序列号: serial

         签名算法ID(用什么算法算的)

         发行者名称

         有效期限

         主体名称(拥有者的信息)

         主体公钥

         发行者的唯一标识

         主体的唯一标识

         扩展

         发行者的签名

部分截图:如下

wKiom1cZiPbD5SqBAABJk420JP4356.png

 

 

6. CA:

  CA种类:公共信任的CA,私有CA;

    

  建立私有CA:(只在私有范围内使用时)

      工具:openssl:使用范围很小就可以用此来生成CA

          OpenCA

      

  6.1 构建私有CA:

      在确定配置为CA的服务上生成一个自签证书,并为CA提供所需要的目录及文件即可;    

    步骤:(要做到耳熟能详)

      (1) 生成私钥;

         ~]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)

      (2) 生成自签证书;

         ~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655

          以上命令内容说明:

            -new:生成新证书签署请求;

            -x509:生成自签格式证书,专用于创建私有CA时使用;

            -key:生成请求时用到的私有文件路径;

            -out:生成的请求文件路径;如果自签操作将直接生成签署过的证书;

            -days:证书的有效时长,单位是day;

          (3) 为CA提供所需的目录及文件;

            ~]# mkdir  -pv  /etc/pki/CA/{certs,crl,newcerts}##一般就已经存在

            ~]# touch  /etc/pki/CA/{serial,index.txt}

            ~]# echo  01 > /etc/pki/CA/serial  ##此为给一个序列号

             

注意:只有创建私建CA时,就是只有作为CA主机的时候才在/etc/pki/CA/目录下进行创建,即上面的例子。在用到证书目录下的服务器要在其对应目录下创建,比如下面的例子实现,以httpd服务器为例。其目录为/etc/httpd/ssl

      

  6.2 某服务器要用到证书进行安全通信的服务器,需要向CA请求签署证书:   

        步骤123在服务器172.18.26.22上执行

        步骤4在主机172.18.26.21上执行

    步骤:(以httpd为例)

       (1) 用到证书的主机A生成私钥;

          ~]# mkdir  /etc/httpd/ssl 

          ~]# cd  /etc/httpd/ssl

          ~]# (umask  077; openssl  genrsa -out  /etc/httpd/ssl/httpd.key  2048)

       (2) 生成证书签署请求

          ~]# openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr  -days  365

       (3) 将请求通过可靠方式发送给CA主机;

             比如远程复制:

               #scp httpd.csr root@172.18.26.21:/tmp/

       (4) 在CA主机上签署证书;

           先创建文件

           ~]# touch  /etc/pki/CA/{serial,index.txt}

           ~]# echo  01 > /etc/pki/CA/serial

           再签署

           ~]# openssl ca  -in  /tmp/httpd.csr  -out  /etc/pki/CA/certs/httpd.crt  -days  365

     注:在第二步的时候配置服务地址比如httpd注意是以www开头的。

    查看证书中的信息:

      ~]# openssl  x509  -in /etc/pki/CA/certs/httpd.crt  -noout  -serial  -subject

             -serial表示查看序列号

             -subject 查看

知识补充:1.scp 命令:把本机文件复制到远程主机上

  

 

DQN(Deep Q-Network)是一种使用深度神经网络实现的强化学习算法,用于解决离散动作空间的问题。在PyTorch中实现DQN可以分为以下几个步骤: 1. 定义神经网络:使用PyTorch定义一个包含多个全连接层的神经网络,输入为状态空间的维度,输出为动作空间的维度。 ```python import torch.nn as nn import torch.nn.functional as F class QNet(nn.Module): def __init__(self, state_dim, action_dim): super(QNet, self).__init__() self.fc1 = nn.Linear(state_dim, 64) self.fc2 = nn.Linear(64, 64) self.fc3 = nn.Linear(64, action_dim) def forward(self, x): x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return x ``` 2. 定义经验回放缓存:包含多条经验,每条经验包含一个状态、一个动作、一个奖励和下一个状态。 ```python import random class ReplayBuffer(object): def __init__(self, max_size): self.buffer = [] self.max_size = max_size def push(self, state, action, reward, next_state): if len(self.buffer) < self.max_size: self.buffer.append((state, action, reward, next_state)) else: self.buffer.pop(0) self.buffer.append((state, action, reward, next_state)) def sample(self, batch_size): state, action, reward, next_state = zip(*random.sample(self.buffer, batch_size)) return torch.stack(state), torch.tensor(action), torch.tensor(reward), torch.stack(next_state) ``` 3. 定义DQN算法:使用PyTorch定义DQN算法,包含训练和预测两个方法。 ```python class DQN(object): def __init__(self, state_dim, action_dim, gamma, epsilon, lr): self.qnet = QNet(state_dim, action_dim) self.target_qnet = QNet(state_dim, action_dim) self.gamma = gamma self.epsilon = epsilon self.lr = lr self.optimizer = torch.optim.Adam(self.qnet.parameters(), lr=self.lr) self.buffer = ReplayBuffer(100000) self.loss_fn = nn.MSELoss() def act(self, state): if random.random() < self.epsilon: return random.randint(0, action_dim - 1) else: with torch.no_grad(): q_values = self.qnet(state) return q_values.argmax().item() def train(self, batch_size): state, action, reward, next_state = self.buffer.sample(batch_size) q_values = self.qnet(state).gather(1, action.unsqueeze(1)).squeeze(1) target_q_values = self.target_qnet(next_state).max(1)[0].detach() expected_q_values = reward + self.gamma * target_q_values loss = self.loss_fn(q_values, expected_q_values) self.optimizer.zero_grad() loss.backward() self.optimizer.step() def update_target_qnet(self): self.target_qnet.load_state_dict(self.qnet.state_dict()) ``` 4. 训练模型:使用DQN算法进行训练,并更新目标Q网络。 ```python dqn = DQN(state_dim, action_dim, gamma=0.99, epsilon=1.0, lr=0.001) for episode in range(num_episodes): state = env.reset() total_reward = 0 for step in range(max_steps): action = dqn.act(torch.tensor(state, dtype=torch.float32)) next_state, reward, done, _ = env.step(action) dqn.buffer.push(torch.tensor(state, dtype=torch.float32), action, reward, torch.tensor(next_state, dtype=torch.float32)) state = next_state total_reward += reward if len(dqn.buffer.buffer) > batch_size: dqn.train(batch_size) if step % target_update == 0: dqn.update_target_qnet() if done: break dqn.epsilon = max(0.01, dqn.epsilon * 0.995) ``` 5. 测试模型:使用训练好的模型进行测试。 ```python total_reward = 0 state = env.reset() while True: action = dqn.act(torch.tensor(state, dtype=torch.float32)) next_state, reward, done, _ = env.step(action) state = next_state total_reward += reward if done: break print("Total reward: {}".format(total_reward)) ``` 以上就是在PyTorch中实现DQN强化学习的基本步骤。需要注意的是,DQN算法中还有很多细节和超参数需要调整,具体实现过程需要根据具体问题进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值