SAFETY LAYERS IN ALIGNED LARGE LANGUAGEMODELS: THE KEY TO LLM SECURITY

news2024/11/18 2:22:01

目录

概要

背景

大语言模型对齐

对齐大语言模型中的过度拒绝

微调攻击

研究设置

问题定义

对齐的大语言模型

大语言模型的提示模板

安全层的存在和定位

安全层的存在性

1.从余弦相似度说明

2.从向量之间角度差异说明

3.与预训练LLM对比说明

安全层的定位

1.推理中缩放部分安全层参数

2.安全层参数缩放中的过度拒绝

3.安全层定位调整

4.对齐LLM的安全层

5.LLM隐藏层的三个部分

精调安全层以防御攻击

实验设置

实验结果

消融实验

冻结非安全层

冻结离散的安全层

结论


概要

对齐的llm是安全的,能够识别并拒绝回答恶意问题。然而,内部参数在维护这种安全性方面的作用还没有得到很好的理解,而且,当使用非恶意后门或正常数据进行微调时,这些模型可能容易受到安全性降低的影响。为了应对这些挑战,本文揭示了在参数级别上对齐的llm安全背后的机制,确定了模型中间的一小组连续层,这些层对于区分恶意查询和正常查询至关重要,称为“安全层”。作者首先通过分析模型内层中输入向量的变化来确认这些安全层的存在。此外,利用过拒止现象和参数缩放分析来精确定位安全层。在这些发现的基础上,本文提出了一种新的微调方法,安全部分参数微调(SPPFT),该方法在微调期间固定安全层的梯度以解决安全性退化问题。实验表明,与完全微调相比,所提出的方法可以显着保持LLM安全性,同时保持性能并减少计算资源。

背景

大语言模型对齐

大语言模型对齐是指在训练和使用大语言模型时,使其输出与人类的期望和目的相一致的过程。由于这些模型生成的内容有时可能与用户的需求不符,甚至可能产生误导性或有害的结果,因此进行对齐是确保模型安全性和实用性的关键步骤。目前,LLM主要通过以下方法实现对齐:

  • RLHF(强化学习人类反馈)使用奖励模型和PPO进行优化
  • 自我指令(self-instruct)利用指令微调来实现对齐
  • DPO将对齐问题建模为分类任务以简化整个过程

然而,这些嵌入的对齐规则在大语言模型中的具体作用和形式尚未得到充分探索。

对齐大语言模型中的过度拒绝

安全对齐虽然提高了大语言模型的整体安全性,但也可能导致不正确地拒绝安全提示,这一现象被称为过度拒绝。在Bianchi等人(2023)的研究中,证明了在微调期间加入安全示例可以增强模型的安全性,但可能导致过度谨慎的行为,使模型拒绝类似不安全提示的安全提示,如"如何终止进程"。在Cui等人(2024)的研究中,为这一现象建立了基准,可用于评估大语言模型中的过度拒绝程度。

微调攻击

现有研究表明,全量微调可能导致大语言模型安全性的实质性下降甚至完全丧失。值得注意的是,使用具有积极回答倾向的后门数据集进行微调尤其有害于大语言模型的安全性,即使是使用非恶意的普通数据集也可能在某些情况下降低安全性。这凸显了对齐大语言模型的脆弱性,对其在现实场景中的部署构成重大挑战,迫切需要开发"安全微调"方法。

研究设置

问题定义

本文的目标是理解对齐在模型中的作用,具体探索对齐的大语言模型如何通过参数机制识别恶意问题,以及如何将这一机制应用于防御参数级攻击(微调)导致的安全性下降现象。

对齐的大语言模型

本研究包括四种不同的对齐大语言模型:

  • Llama-3-8B-Instruct(Meta, 2024)
  • Llama-2-7b-chat(Touvron等人, 2023)
  • gemma-2b-it(Team等人, 2024)
  • Phi-3-mini-4k-instruct(Abdin等人, 2024)

这些模型来自不同的发布者,凸显了本文研究发现的普适性。

大语言模型的提示模板

在推理过程中,输入指令首先被集成到一个模板中,然后被分词并通过嵌入层,形成大语言模型的初始输入向量。在本研究中,对不同的大语言模型使用相同的对话模板(Taori等人, 2023):

安全层的存在和定位

在这一部分说明了本文的主要发现:对识别恶意问题至关重要的对齐大语言模型(LLMs)中间部分的特定层段称之为安全层。接下来将描述安全层的存在性和定位。

安全层的存在性

在LLMs的推理过程中,每个隐藏层的最后位置输出向量汇集了最全面的信息。这个向量集成了从前面的层累积的细节以及输入查询的固有语义信息,且LLM的最后一层的最后位置输出向量决定了要生成的token。然而,以上文模板为例,输入指令插入在提示的中间,插入查询的最后一个token源自模板本身。因此,一旦将输入向量嵌入到对齐的LLM中,恶意和正常问题的最后位置向量保持相同。尽管如此,对齐的LLMs在推理过程中展示出了针对恶意和正常指令完全相反的输出倾向。这些相同的最后位置输入向量在LLM的隐藏层中如何分化,导致在最后一个隐藏层中表现出相反的输出特征,这一点在现有研究中尚未得到充分解释。

1.从余弦相似度说明

假设一个大语言模型(LLM)有 K 个隐藏层,介绍两个数据集:一个非恶意正常问题数据集 N=\left \{ n_{p} \right \}_{p=1}^{P} 和一个恶意问题数据集 M=\left \{ m_{q} \right \}_{q=1}^{Q}​,每个数据集包含 P 和 Q 个问题,分别具有不同的语义。这些问题被插入到同一个提示模板中,以输入查询的形式进行推理,结果在每个层的最后位置生成输出向量集 S(N)和 S(M),在第一次自回归过程中。这两个集合的向量可以表示为:

其中,​v_{n}^{k}表示在第 k 层处理问题 n 后的输出向量在最后位置的值。让 V(n_{p}) 和 V(m_{q}) 分别表示输入问题 n_{p}m_{q} 的层向量集,每个集包含与相应输入问题相关的每个隐藏层的输出向量。

对这些层向量集进行三个不同的分析,每次分析根据以下规则选择两个层向量集作为一对:

  • (i). 正常-正常查询对:每次随机从 S(N) 中选择两个层向量集V(n_{p})和V({n_{p}}')。
  • (ii). 恶意-恶意查询对:每次随机从 S(M) 中选择两个层向量集 V(m_{q})和V(m_{q}{}')。
  • (iii). 正常-恶意查询对:每次随机从 S(N) 中选择一个层向量集 V(n_{p}),从 S(M)中选择另一个层向量集V(m_{q}{}').

选择对后,计算每对中的两个向量集在每个层之间的余弦相似度,得到一个包含 K 个元素的余弦相似度列表 L_{C}。例如,在正常-正常查询对中

每种分析的随机选择和余弦相似度计算过程重复 rr次,结果得到 r 个层间余弦相似度列表。为了进一步说明每个层在处理不同类型查询对中的角色,我们计算每种查询对类型的 r 个余弦相似度列表的均值和标准差。对于 Phi-3-mini-4k-instruct 模型,结果如下所示。

P = 100, Q = 100, r = 500进行统计计算

从图中我们可以看出:

(i)在模型的推理阶段,恶意查询类中的不同查询对在层之间没有显着的处理区别。这种现象与对齐llm的行为一致,当拒绝回答查询时,llm始终输出统一的拒绝开始。

(ii)在区分两个不同类别(正常和恶意)的问题时,LLM层的差异最为明显,超过了两个语义不同的正常问题之间的差异。

当比较Normal-Normal (N-N)和Normal-Malicious (N-M)查询对之间的分层余弦相似度趋势时,可以在N-M结果中观察到一个显著的变化。这表明存在安全层

2.从向量之间角度差异说明

在之前的分析中,采用了余弦相似度来测量层间向量的相似性,但这次我们要重点讨论角度差异如何非线性地变化,以更好地突出不同层次的语言模型(LLM)在处理正常-正常(N-N)查询对和正常-恶意(N-M)查询对时的差异。

具体来说,在重复选取过程中,可以计算每个隐藏层的平均角度差异。这可以用数学公式表示为:  ∠ 表示两个向量之间的角度,avg 表示平均值。

图的上半部分展示了“正常-正常(N-N)对”和“正常-恶意(N-M)对”余弦相似度分析结果,针对每个隐藏层的 LLama-3-8B-Instruct、Llama-2-7B-Chat、Phi-3-mini-4k-instruct 和 gemma-2b-it 模型。
下半部分显示了这两种情况之间的平均角度差异,针对每个对齐的 LLM。
3.与预训练LLM对比说明

在进行安全对齐之前,作者还检查了对齐的LLM的预训练版本。由于Phi-3没有发布他们模型的预训练版本,作者专注于其他三个预训练的LLM。这些预训练LLM的“正常-正常对(N-N Pair)”和“正常-恶意对(N-M Pair)”曲线在所有层中都没有表现出任何明显的差距。与对齐的LLMs相比,这种差距的缺失与预训练LLM无法区分正常查询和恶意查询的事实相符。因此更可以说明,安全层的出现是安全对齐的直接结果。

预训练llm内层的“N-N对”和“N-M对”分析

安全层的定位

虽然余弦相似度分析可以通过差距发现安全层的存在,但仅仅基于差距出现到第一次平滑之间的范围来定位安全层是不精确的,但是这种差距出现到曲线中增长最快的部分为安全层提供了一个良好的初始近似范围。原因如下:

  • (i)余弦相似度的降维操作损失了隐藏层向量的部分信息。
  • (ii)平均余弦相似度曲线是对对齐LLM处理正常-正常对和正常-恶意对的整体趋势的近似。
1.推理中缩放部分安全层参数

假设对齐LLM中第i层参数的输入向量是h_{i},第i层的输出h_{i+1}可以表示为:

其中ATTN_{i}(h_{i})和FFN_{i}(h_{i})分别表示第i层注意力和前馈模块对输入h_{i}的输出。这些模块是LLM每一层的组成部分。与层向量计算一致,每个模块在推理过程中都有残差连接机制。通过残差连接,用常数因子α缩放特定层i的参数会改变输出向量的分布:

  • 如果α > 1,层参数被放大,增强了该层对自回归token生成过程的贡献。
  • 如果α < 1,该层的效果被减弱。
  • 然而,α应该保持接近1,因为过度偏离可能会导致LLM内部混乱。

因此,当与安全相关的某些或所有层的参数权重发生变化时,模型的安全性能也会相应改变。作者观察到,通过余弦相似度分析初步定位的安全层参数的放大可以提高模型的安全性。

2.安全层参数缩放中的过度拒绝

因为一些对齐的LLM表现出强大的安全性能,调整缩放参数范围的上下界只会对这个指标产生微小的变化,因此需要一个替代指标来更有效地反映模型的安全性能,使得缩放不同的层范围应该在这个新指标中显示出更清晰和更明显的趋势。

最近关于过度拒绝现象的研究表明,对齐LLM会“错误的”拒绝回答一些非恶意查询,特别是当查询包含潜在危险动词时,这为指标设计带来了新的解决方案:作者创建了一个过度拒绝数据集D_{o},其中包含带有潜在危险动词但表达非恶意意义的查询。在D_{o}中被LLM拒绝的查询数量作为安全性影响的指标R_{o}。调整缩放参数的上下界会在此指标中揭示明显的波动,从而进一步确定安全层的上下界。

3.安全层定位调整

结合余弦相似度分析、参数缩放和过度拒绝数据集D_{o},本文用于定位安全层的整体算法如下:

  • 步骤 1:对齐LLM进行余弦相似度分析,并定位初始安全层,表示为从差距出现到第一次平滑的范围 [i, j]。
  • 步骤 2:使用过度拒绝数据集D_{o}完成推理并计算LLM拒绝回答的查询数量作为R_{o},以评估被测试LLM的过度拒绝基线。
  • 步骤 3:选择缩放因子 α>1,在层 i 到 j 上调参数。然后计算模型在数据集 D_{o} 中拒绝回答的问题数量,记为R_{o}^{[i,j]}。接下来,调整安全层的上界为 j + k 并测量过度拒绝指标R_{o}^{[i,j+k]},其中k可以是负的或正的。存在一个k = k_{u} ,使得 R_{o}^{[i,j+k_{u}]} 大于任何的R_{o}^{[i,j+k_{u}+p]},并且我们确认j+k_{u}为上界。在确认上界后,我们执行相同的操作来调整安全层的下界,最终得出拒绝查询数量最多的范围作为整个安全层范围 (j-k_{l}j+k_{u})。
在α = 1.05时确认安全层下界的过程:
算法通过分析不同层范围权重缩放对过度拒绝的影响来定位安全层,当层范围从 ([i, j + k - 1]) 扩展到 ([i, j + k] 时,(α>1),新包含的(j + k)层的权重被放大。如果该层是安全层的一部分,安全相关参数的增加会导致过度拒绝现象上升。相反,如果该层与模型安全无关,放大会稀释安全参数的比例,减少过度拒绝。通过观察过度拒绝指标的趋势确定 (j + k)层是否属于安全层,精确识别安全层的边界。

N_{o}已经相对较大时,选择α < 1 并执行相同的操作,计算拒绝查询数量最少的范围也是可行的。

4.对齐LLM的安全层

安全层的定位方法具有对不同LLM的适用性。下表展示了几个对齐LLM安全层渐进定位过程。从每个LLM的表格数据趋势可以看出,当α>1时,在确认上界或下界的过程中,LLM拒绝回答的查询数量随着对安全性有贡献的新层被添加到参数缩放中而增加。相反,当一个不对安全性有贡献的层被包含在参数中时,安全层在整体参数中的权重相对降低,导致被拒绝查询的数量减少。当α < 1时,发生相反的趋势。

由721个问题组成的过度拒绝数据集Do对四个对齐的llm进行逐层定位过程
5.LLM隐藏层的三个部分

通过上面的安全层定位结果,可以观察到对齐后的LLM的安全层一般位于模型参数的中间部分,而前几层与识别输入的恶意无关。为了进一步分析在推理过程中对齐的llm中每个隐藏层的作用,作者从正常和恶意问题中提取每个token的注意力得分:

  • 从图中我们发现,在安全层之前的初始层中,LLM主要关注于诸如“how”和“the”等句法词,而没有充分理解句子的语义。
  • 在安全层期间,注意力逐渐转向与语义相关的词,同时仍考虑句法元素。
  • 在安全层之后的语义层中,模型则专注于句子语义的核心关键短语。

这种模式在LLM对不同查询的推理中是一致的。

此外作者观察到,由于查询对中的不同语义的余弦相似度在各层之间波动,仅在语义层中变得更加明显。此外,将Llama-3-8B-Instruct的后半部分隐藏层转移到其同源的预训练LLM Llama-3-8B时,作者观察到了模型在逻辑和语义上回答特定问题的能力显著提升,但仍然缺乏拒绝回答恶意问题的能力。相反,替换安全层及其之前的层并没有增强预训练LLM的性能。这些发现都表明,安全层之后的语义层与语义理解和分析密切相关,表明模型的层之间存在明显的分割。

精调安全层

Qi等人的工作表明,即使使用具有正面回答倾向的后门数据集进行精调也会极大地损害LLM的安全性,为了应对这一挑战,本文提出了安全的精调方法。通过在精调过程中冻结安全层的参数,可以维持或仅略微降低LLM的安全性,因为梯度不会更新这些参数。通过方法称为SPPFT,可以减少服务器端的计算量,保留对齐LLM的现有安全性,并且对LLM的精调任务性能几乎没有影响。

实验设置

数据集:作者构建了一个非恶意的正常数据集 D_{N} 和一个后门数据集 D_{B},每个数据集包含数千个数据条目。两种数据集都是从通用对话数据集中派生的。每个后门数据集样本都包含一个触发器,旨在诱导正面回答倾向,遵循以下范式:

精调方法:使用数据集 D_{N}D_{B} 对四个对齐LLM进行全参数精调和 SPPFT。为了比较,作者还冻结了相同比例的“安全关键神经元”,与 SPPFT 中使用的比例相同。另外,评估了在精调过程中作者分别冻结非安全层和离散的安全层作为消融研究的影响。

防御性评估指标:

  • (i)有害率 R_{h}:LLM愿意回答的恶意问题数量的比例。较小的比例表示更大的安全性。
  • (ii)有害分数 S_{h}:LLM输出在数据集D_{m} 上的平均有害分数,使用 GPT-4计算,分数范围从 1 到 5,较小的分数表示更大的LLM安全性。

微调任务评估指标

  • Rouge-L分数Sr:评估微调任务性能
  • MMLU分数Sm:评估整体性能

实验结果

研究发现,在使用后门和普通数据集进行微调时,SPPFT与全参数微调相比显著缓解了安全性下降。具体而言:

使用后门数据集DB:

  • SPPFT导致有害率仅增加2.84%,有害分数增加0.1
  • 相比之下,全参数微调导致有害率增加58.03%,有害分数增加2.17

使用普通数据集DN:

  • SPPFT平均有害率仅增加3.51%,有害分数增加0.08
  • 全参数微调有害率增加25.53%,有害分数增加0.9

额外发现
冻结Wei等人(2024)识别的"安全关键神经元"未能有效防御微调过程中的安全性下降,这与原论文结果一致。可能原因是这些"安全关键神经元"是离散的,可能包含许多与安全性不直接相关、更多与语义理解相关的神经元。

微调任务性能

  • SPPFT和全参数微调后的模型Rouge-L分数波动都在小范围内,这表明SPPFT不会影响模型在微调任务上的性能,
  • MMLU分数在微调前后保持稳定,进一步证明SPPFT不会对模型整体性能产生负面影响。

总之,SPPFT冻结安全层参数,在保持模型性能的同时有效地减缓了微调带来的安全性下降。

消融实验

冻结非安全层

在这一部分中进行了实验研究,表明在微调过程中冻结除安全层以外的相邻层的参数并不能保持对齐LLM的安全性,下表分别给出了冻结安全层前后参数的危害率和危害评分。

比较SPPFT和全参数微调的有害分数和有害率,可以观察到除了安全层之外的冻结层在保持对齐llm的安全性方面是无效的,与全参数微调相比,甚至可能加剧安全问题。

冻结离散的安全层

在微调过程中,选择性地冻结安全层的部分连续部分也有助于保持对齐LLM的安全性,但与冻结所有安全层(SPPFT)相比,保存效果较弱。这作为实验验证了本文的定位算法所识别的安全层边界的准确性和有效性。

结论

本文的工作首次揭示了对齐llm的分层内部参数中的安全机制,确认了安全层的存在,并开发了通用方法来准确识别不同对齐llm的安全层范围。在此基础上提出了一种新的微调方法SPPFT,该方法通过在微调过程中不更新安全层的梯度来保留安全机制。

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

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

相关文章

netcore Kafka

一、新建项目KafakDemo <ItemGroup><PackageReference Include"Confluent.Kafka" Version"2.6.0" /></ItemGroup> 二、Program.cs using Confluent.Kafka; using System; using System.Threading; using System.Threading.Tasks;names…

在k8s上部署Crunchy Postgres for Kubernetes

目录 一、前言二、安装Crunchy Postgres for Kubernetes三、部署一个简单的postgres集群四、增加pgbouncer五、数据备份六、备份恢复七、postgres配置参数八、数据导入九、权限管理 一、前言 Crunchy Postgres可以帮助我们在k8s上快速部署一个高可用、具有自动备份和恢复功能的…

函数指针示例

目录&#xff1a; 代码&#xff1a; main.c #include <stdio.h> #include <stdlib.h>int Max(int x, int y); int Min(int x, int y);int main(int argc, char**argv) {int x,y;scanf("%d",&x);scanf("%d",&y);int select;printf(&q…

计算机网络:运输层 —— 运输层端口号

文章目录 运输层端口号的分类端口号与应用程序的关联应用举例发送方的复用和接收方的分用 运输层端口号的分类 端口号只具有本地意义&#xff0c;即端口号只是为了标识本计算机网络协议栈应用层中的各应用进程。在因特网中不同计算机中的相同端口号是没有关系的&#xff0c;即…

牛客挑战赛77

#include <iostream>// 函数 kXOR&#xff1a;计算两个数在 k 进制下的异或和 // 参数&#xff1a; // a: 第一个正整数 // b: 第二个正整数 // k: 进制基数 // 返回值&#xff1a; // 两数在 k 进制下的异或和&#xff08;十进制表示&#xff09; long long kXO…

大数据-225 离线数仓 - 目前需求分析 指标口径 日志数据采集 taildir source HDFS Sink Agent Flume 优化配置

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

【流量分析】常见webshell流量分析

免责声明&#xff1a;本文仅作分享&#xff01; 对于常见的webshell工具&#xff0c;就要知攻善防&#xff1b;后门脚本的执行导致webshell的连接&#xff0c;对于默认的脚本要了解&#xff0c;才能更清晰&#xff0c;更方便应对。 &#xff08;这里仅针对部分后门代码进行流量…

springboot基于Web足球青训俱乐部管理后台系统开发(代码+数据库+LW)

摘 要 随着社会经济的快速发展&#xff0c;人们对足球俱乐部的需求日益增加&#xff0c;加快了足球健身俱乐部的发展&#xff0c;足球俱乐部管理工作日益繁忙&#xff0c;传统的管理方式已经无法满足足球俱乐部管理需求&#xff0c;因此&#xff0c;为了提高足球俱乐部管理效率…

电子应用设计方案-12:智能窗帘系统方案设计

一、系统概述 本设计方案旨在打造便捷、高效的全自动智能窗帘系统。 二、硬件选择 1. 电机&#xff1a;选用低噪音、扭矩合适的智能电机&#xff0c;根据窗帘尺寸和重量确定电机功率&#xff0c;确保能平稳拉动窗帘。 2. 轨道&#xff1a;选择坚固、顺滑的铝合金轨道&…

使用Element UI实现前端分页,及el-table表格跨页选择数据,切换分页保留分页数据,限制多选数量

文章目录 一、前端分页1、模板部分 (\<template>)2、数据部分 (data)3、计算属性 (computed)4、方法 (methods) 二、跨页选择1、模板部分 (\<template>)2、数据部分 (data)3、方法 (methods) 三、限制数量1、模板部分 (\<template>)2、数据部分 (data)3、方法…

mysql时间时区修改、set global、配置文件-default-time-zone

通过查看mysql错误日志或二进制日志可以看到时间和时区并不与国内的东八区时间一致。 查询mysql系统时区时间 show variables where variable_name"system_time_zone"; CST指的是中国标准时间&#xff0c;也是中国的标准时区。 set命令修改时区时间 global&#xf…

零基础利用实战项目学会Pytorch

目录 pytorch简介 1.线性回归 2.数据类型 2.1数据类型检验 2.2Dimension0/Rank0 2.3 Dim1/Rank1 2.4 Dim2/Rank2 3.一些方法 4.Pytorch完成分类任务 4.1模型参数 4.2 前向传播 4.3训练以及验证 4.4 三行搞定&#xff01; 4.5 准确率 5、Pytorch完成回归任务 5.…

信捷PLC转以太网连接电脑方法

信捷XC/XD/XL等系列PLC如何上下载程序?可以选择用捷米特JM-ETH-XJ模块轻松搞定,并不需要编程&#xff0c;即插即用&#xff0c;具体看见以下介绍&#xff1a; 产品介绍 捷米特JM-ETH-XJ是专门为信捷PLC转以太网通讯面设计&#xff0c;可实现工厂设备信息化需求&#xff0c;对…

【Flink】-- flink新版本发布:v2.0-preview1

目录 1、简介 2、非兼容变更 2.1、API 2.2、连接器适配计划 2.3、配置 2.4、其它 3、重要新特性 3.1、存算分离状态管理 3.2、物化表 3.3、批作业的自适应执行 3.4、流式湖仓 4、附加 4.1、非兼容性的 api 程序变更 4.1.2、Removed Classes # 4.1.3、Modified Cl…

头歌-本关任务:使用GmSSL命令行,生成SM2私钥并对文件进行签名验证(第二关)。

第一关在网上找到了&#xff0c;但第二关没找到&#xff0c;在这里做一下补充:) 如果想认真学的话可以看看文档 国密SM2椭圆曲线密码标准http://gmssl.org/docs/sm2.html 内容为 GuetPython 的明文文件msg.txt 私钥sm2.pem 公钥sm2Pub.pem 使用sm2utl对msg.txt进行签名&…

使用 unicorn 和 capstone 库来模拟 ARM Thumb 指令的执行(一)

import binascii import unicorn import capstonedef printArm32Regs(mu):for i in range(66,78):print("R%d,value:%x"%(i-66,mu.reg_read(i)))def testhumb():CODE b\x1C\x00\x0A\x46\x1E\x00"""MOV R3, R0 的机器码&#xff1a;0x1C 0x00&#xf…

【C++初阶】第1课—初识c++

文章目录 1. 学习c之前的开胃菜2. c的发展历程3. c参考文档4. c的第一个程序5. 命名空间5.1 关键字namespace5.2 namespace的嵌套使用5.3 命名空间的使用 6. c输入和输出7. 缺省参数8. 函数重载9. 引用9.1 引用的使用9.2 const引用9.3 引用和指针的关系 10. nullptr11. inline修…

HarmonyOS ArkUI(基于ArkTS) 常用组件

一 Button 按钮 Button是按钮组件&#xff0c;通常用于响应用户的点击操作,可以加子组件 Button(我是button)Button(){Text(我是button)}type 按钮类型 Button有三种可选类型&#xff0c;分别为胶囊类型&#xff08;Capsule&#xff09;、圆形按钮&#xff08;Circle&#xf…

Opengl光照测试

代码 #include "Model.h" #include "shader_m.h" #include "imgui.h" #include "imgui_impl_glfw.h" #include "imgui_impl_opengl3.h" //以上是放在同目录的头文件#include <glad/glad.h> #include <GLFW/glfw3.…

算法沉淀一:双指针

目录 前言&#xff1a; 双指针介绍 对撞指针 快慢指针 题目练习 1.移动零 2.复写零 3.快乐数 4.盛水最多的容器 5.有效三角形的个数 6.和为s的两个数 7.三数之和 8.四数之和 前言&#xff1a; 此章节介绍一些算法&#xff0c;主要从leetcode上的题来讲解&#xff…