计算机网络安全 —— 对称加密算法 DES (一)
一、对称加密算法概念#
我们通过计算机网络传输数据时,如果无法防止他人窃听, 可以利用密码学技术将发送的数据变换成对任何不知道如何做逆变换的人都不可理解的形式, 从而保证了数据的机密性。这种变换被称为加密( encryption),被加密的数据被称为密 文( ciphertext),而加密前的数据被称为明文( plaintext)。 接收方必须能通过某种逆变换将密文重新变换回原来的明文,该逆变换被称为解密( decryption)。加密和解密过程可以以一个密钥( key)为参数,并且加密和解密过程可以公开, 而只有密钥需要保密。 即只有知道密钥的人才能解密密文,而任何人,即使知道加密或解密算法也无法解密密文。
加密密钥和解密密钥可以相同,也可以不同,取决于采用的是对称密钥密码体制还是公开密钥密码体制。
所谓对称密钥密码体制是一种加密密钥与解密密钥相同的密码体制。在这种加密系统中, 两个参与者共享同一个秘密密钥,如果用一个特定的密钥加密一条消息,也必须要使用相同的密钥来解密该消息。该系统又称为对称密钥系统。
数据加密标准( Data Encryption Standard, DES)是对称密钥密码的典型代表,由IBM公司研制,于1977年被美国定为联邦信息标准 。其加密解密基本流程如下图:
二、.NET 使用 DES 加密#
DES使用的密钥为64 位( 实际密钥长度为56 位,有8位用于奇偶校验)。密码的字节长度不能低于64位(8个字节),下面是实现代码:
1 using System;2 using System.IO;3 using System.Linq;4 using System.Security.Cryptography;5 using System.Text;6 7 namespace encryption.des8 {9 /// <summary>10 /// DES 加密与解密11 /// DES加密:https://www.zhihu.com/question/3676782912 /// 加密基本知识:https://www.biaodianfu.com/des.html13 /// </summary>14 public class DesAlgorithm15 {16 public Encoding Encoding { get; set; }17 public PaddingMode Padding { get; set; }18 public CipherMode Mode { get; set; }19 public string PassWord { get; private set; }20 private DESCryptoServiceProvider _des;21 22 #region .ctor23 24 public DesAlgorithm()25 {26 _des = new DESCryptoServiceProvider();27 PassWord = Convert.ToBase64String(_des.Key);28 Encoding = Encoding.UTF8;29 Padding = PaddingMode.PKCS7;30 Mode = CipherMode.CBC;31 }32 #endregion33 34 35 /// <summary>36 /// 通过字符串生成新的密钥37 /// </summary>38 /// <param name="password">密码</param>39 /// <returns></returns>40 public DESCryptoServiceProvider CreateNewkey(string password)41 {42 try43 {44 byte[] buffer = Encoding.GetBytes(password).Skip(0).Take(8).ToArray();45 _des = new DESCryptoServiceProvider()46 {47 Key = buffer,48 IV=buffer,49 };50 PassWord = password;51 return _des;52 }53 catch (Exception e)54 {55 Console.WriteLine($"Wrong Length:{e.Message},{e.InnerException}");56 return null;57 }58 }59 60 /// <summary>61 /// DES加密62 /// </summary>63 /// <param name="pToEncrypt">需要加密的字符串<see cref="string"/></param>64 /// <returns></returns>65 public string Encrypt(string pToEncrypt)66 {67 byte[] inputByteArray = Encoding.GetBytes(pToEncrypt);68 return Convert.ToBase64String(this.Encrypt(inputByteArray));69 }70 71 /// <summary>72 /// DES加密73 /// </summary>74 /// <param name="pToEncrypt">待加密的byte数组<see cref="byte"/></param>75 /// <returns></returns>76 public byte[] Encrypt(byte[] pToEncrypt)77 {78 byte[] base64 = null;79 using (var ms = new MemoryStream())80 {81 using (var cs = new CryptoStream(ms, _des.CreateEncryptor(), CryptoStreamMode.Write))82 {83 cs.Write(pToEncrypt, 0, pToEncrypt.Length);84 cs.FlushFinalBlock();85 }86 base64 = ms.ToArray();87 }88 return base64;89 }90 91 /// <summary>92 /// DES解密93 /// </summary>94 /// <param name="pToDecrypt">需要解密的字符串</param>95 /// <returns></returns>96 public string Decrypt(string pToDecrypt)97 {98 byte[] inputByteArray = Convert.FromBase64String(pToDecrypt);99 return Encoding.GetString(this.Decrypt(inputByteArray));
100 }
101
102 /// <summary>
103 /// DES解密
104 /// </summary>
105 /// <param name="pToDecrypt">待解密的byte数组<see cref="byte"/></param>
106 /// <returns></returns>
107 public byte[] Decrypt(byte[] pToDecrypt)
108 {
109 byte[] data = null;
110 using (var ms = new MemoryStream())
111 {
112 using (CryptoStream cs = new CryptoStream(ms, _des.CreateDecryptor(), CryptoStreamMode.Write))
113 {
114 cs.Write(pToDecrypt, 0, pToDecrypt.Length);
115 cs.FlushFinalBlock();
116 }
117 data = ms.ToArray();
118 }
119 return data;
120 }
121 }
122 }
三、.NET 使用 3DES 加密#
DES使用的密钥为64 位,它是一个优秀的密码算法,目前还没有发现比蛮力攻击更好的破解方法。但随着计算机运算速度的快速提高,56位长的密钥已显得太短。56位长的密钥意味着共有256种可能的密钥,也就是说,共约有7. 6 × 1016 种密钥。假设一台计算机1 µ s可执行一次DES加密,同时假定平均只需搜索密钥空间的一半即可找到密钥,那么破译DES要超过1千年。但现在利用并行计算技术已经设计出搜索DES密钥的专用芯片。例如,在1999年有一批在因特网上合作的人借助于一台不到25万美元的专用计算机,在略大于22h的时间就破译了56 位密钥的DES。
为解决DES密钥太短的问题,人们提出了三重DES(Triple DES, 3DES),并在1985年成为美国的一个商用加密标准[ RFC 2420]。3DES在加密时,用三个密钥,执行三次DES算法: 即 E运算 → D运算 → E运算。 解密时,按相反顺序使用这三个密钥,执行D运算 → E运算 → D运算。
3DES目前正在被2001年发布的高级加密标准( Advanced Encryption Standard, AES)所替代。AES能够使用128位、192位和256位长的密钥,用硬件和软件都可以快速实现。它不需要太多内存,因此适用于小型移动设备。美国国家标准与技术研究所NIST估计,如果用1s破解56位DES的计算机来破解一个128位的AES密钥的话,要用大约149万亿年的时间才有可能。
3DES 使用现有的DES算法,并且当三个密钥相同时,效果就和DES一样。这有利于逐步推广使用3DES。也可以仅使用两个密钥,即 K1= K3,相当于密钥长度112位,这对于多数商业应用也已经足够长了。下面代码我们采用密钥长度56*3=168位的3EDS算法:
1 using System;2 using System.IO;3 using System.Linq;4 using System.Security.Cryptography;5 using System.Text;6 7 namespace encryption.des8 {9 /// <summary>10 /// 3DES加密与解密11 /// </summary>12 public class TripleDesAlgorithm13 {14 public Encoding Encoding { get; set; }15 public PaddingMode Padding { get; set; }16 public CipherMode Mode { get; set; }17 public string PassWord { get; private set; }18 19 private TripleDESCng _des;20 21 #region .ctor22 23 public TripleDesAlgorithm()24 {25 _des = new TripleDESCng();26 PassWord = Convert.ToBase64String(_des.Key);27 Encoding = Encoding.UTF8;28 Padding = PaddingMode.PKCS7;29 Mode = CipherMode.CBC;30 }31 #endregion32 33 /// <summary>34 /// 通过字符串生成新的密钥35 /// </summary>36 /// <param name="password">密码</param>37 /// <returns></returns>38 public TripleDESCng CreateNewkey(string password)39 {40 try41 {42 byte[] key = Encoding.GetBytes(password).Skip(0).Take(24).ToArray();43 byte[] iv = Encoding.GetBytes(password).Skip(0).Take(8).ToArray();44 _des = new TripleDESCng()45 {46 Key = key,47 IV = iv,48 };49 PassWord = password;50 return _des;51 }52 catch (Exception e)53 {54 Console.WriteLine($"Wrong Length:{e.Message},{e.InnerException}");55 return null;56 }57 }58 59 /// <summary>60 /// 3DES加密61 /// </summary>62 /// <param name="pToEncrypt">需要加密的字符串<see cref="string"/></param>63 /// <returns></returns>64 public string Encrypt(string pToEncrypt)65 {66 byte[] inputByteArray = Encoding.GetBytes(pToEncrypt);67 return Convert.ToBase64String(this.Encrypt(inputByteArray));68 }69 70 /// <summary>71 /// 3DES加密72 /// </summary>73 /// <param name="pToEncrypt">需要加密的byte数组<see cref="byte"/></param>74 /// <returns></returns>75 public byte[] Encrypt(byte[] pToEncrypt)76 {77 byte[] base64 = null;78 using (var ms = new MemoryStream())79 {80 using (var cs = new CryptoStream(ms, _des.CreateEncryptor(), CryptoStreamMode.Write))81 {82 cs.Write(pToEncrypt, 0, pToEncrypt.Length);83 cs.FlushFinalBlock();84 }85 base64 = ms.ToArray();86 }87 return base64;88 }89 90 /// <summary>91 /// 3DES解密92 /// </summary>93 /// <param name="pToDecrypt">需要解密的字符串<see cref="string"/></param>94 /// <returns></returns>95 public string Decrypt(string pToDecrypt)96 {97 byte[] inputByteArray = Convert.FromBase64String(pToDecrypt);98 return Encoding.GetString(this.Decrypt(inputByteArray));99 }
100
101 /// <summary>
102 /// 3DES解密
103 /// </summary>
104 /// <param name="pToDecrypt">需要解密的byte数组<see cref="byte"/></param>
105 /// <returns></returns>
106 public byte[] Decrypt(byte[] pToDecrypt)
107 {
108 byte[] data = null;
109 using (var ms = new MemoryStream())
110 {
111 using (CryptoStream cs = new CryptoStream(ms, _des.CreateDecryptor(), CryptoStreamMode.Write))
112 {
113 cs.Write(pToDecrypt, 0, pToDecrypt.Length);
114 cs.FlushFinalBlock();
115 }
116 data = (ms.ToArray());
117 }
118 return data;
119 }
120 }
121 }
四、测试代码与效果#
1 static void Main(string[] args)2 {3 // DES字符串加密与解密4 {5 Console.WriteLine("-----------------------------------------------------DES字符串加密与解密--------------------------------------------------");6 var input = "数据加密标准( Data Encryption Standard, DES)是对称密钥密码的典型代表,由IBM公司研制,于1977年被美国定为联邦信息标准 。";7 Console.Write($"加密内容:\r\n{input}\r\n");8 var des = new DesAlgorithm();9 // TEST:可使用该方法通过字符串生成新的密钥
10 //des.CreateNewkey("https://www.cnblogs.com/dongweian");
11 Console.WriteLine($"DES密钥:\r\n{des.PassWord}\r\n");
12 var encrypt = des.Encrypt(input);
13 Console.WriteLine($"DES加密后内容:\r\n{encrypt}\r\n");
14 var decrypt = des.Decrypt(encrypt);
15 Console.WriteLine($"DES解密后内容:\r\n{decrypt}\r\n");
16 }
17
18 // DES文件加密与解密
19 {
20 Console.WriteLine("---------------------------------------------------DES文件加密与解密--------------------------------------------------");
21 var input = System.IO.File.ReadAllBytes(@"C:\Users\97460\Desktop\1.rar");
22 Console.Write($"加密内容:\r\n{Convert.ToBase64String(input)}\r\n");
23 var des = new DesAlgorithm();
24 // TEST:可使用该方法通过字符串生成新的密钥
25 //des.CreateNewkey("https://www.cnblogs.com/dongweian");
26 Console.WriteLine($"DES密钥:\r\n{des.PassWord}\r\n");
27 var encrypt = des.Encrypt(input);
28 Console.WriteLine($"DES加密后内容:\r\n{Convert.ToBase64String(encrypt)}\r\n");
29 var decrypt = des.Decrypt(encrypt);
30 Console.WriteLine($"DES解密后内容:\r\n{Convert.ToBase64String(decrypt)}\r\n");
31 System.IO.File.WriteAllBytes("1.rar", decrypt);
32 }
33
34
35
36 // 3DES字符串加密与解密
37 {
38 Console.WriteLine("---------------------------------------------------3DES字符串加密与解密--------------------------------------------------");
39 var input = "数据加密标准( Data Encryption Standard, DES)是对称密钥密码的典型代表,由IBM公司研制,于1977年被美国定为联邦信息标准 。";
40 Console.Write($"加密内容:\r\n{input}\r\n");
41 var des = new TripleDesAlgorithm();
42 // TEST:可使用该方法通过字符串生成新的密钥
43 //des.CreateNewkey("https://www.cnblogs.com/dongweian");
44 Console.WriteLine($"3DES密钥:\r\n{des.PassWord}\r\n");
45 var encrypt = des.Encrypt(input);
46 Console.WriteLine($"3DES加密后内容:\r\n{encrypt}\r\n");
47 var decrypt = des.Decrypt(encrypt);
48 Console.WriteLine($"DES解密后内容:\r\n{decrypt}\r\n");
49 }
50
51 // 3DES文件加密与解密
52 {
53 Console.WriteLine("---------------------------------------------------3DES文件加密与解密--------------------------------------------------");
54 var input = System.IO.File.ReadAllBytes(@"C:\Users\97460\Desktop\1.rar");
55 Console.Write($"加密内容:\r\n{Convert.ToBase64String(input)}\r\n");
56 var des = new TripleDesAlgorithm();
57 // TEST:可使用该方法通过字符串生成新的密钥
58 //des.CreateNewkey("https://www.cnblogs.com/dongweian");
59 Console.WriteLine($"3DES密钥:\r\n{des.PassWord}\r\n");
60 var encrypt = des.Encrypt(input);
61 Console.WriteLine($"3DES加密后内容:\r\n{Convert.ToBase64String(encrypt)}\r\n");
62 var decrypt = des.Decrypt(encrypt);
63 Console.WriteLine($"3DES解密后内容:\r\n{Convert.ToBase64String(decrypt)}\r\n");
64 System.IO.File.WriteAllBytes("1.rar", decrypt);
65 }
66 Console.ReadKey();
67 }
相关内容:计算机网络安全 —— 非对称加密算法 RSA 和数字签名(二)、计算机网络安全 —— 报文摘要算法 ME5 (三)、计算机网络安全 —— 实体鉴别与生成大随机数(四)
相关文章:

计算机网络安全 —— 对称加密算法 DES (一)
一、对称加密算法概念# 我们通过计算机网络传输数据时,如果无法防止他人窃听, 可以利用密码学技术将发送的数据变换成对任何不知道如何做逆变换的人都不可理解的形式, 从而保证了数据的机密性。这种变换被称为加密( encryptio…...

5. ARM_指令集
概述 分类 汇编中的符号: 指令:能够编译生成一条32位机器码,并且能被处理器识别和执行伪指令:本身不是指令,编译器可以将其替换成若干条指令伪操作:不会生成指令,只是在编译阶段告诉编译器怎…...
Jenkins的pipeline Script的 每个组件的详细讲解
在Jenkins的Pipeline脚本中,各个组件的配置和Groovy的一些常用函数起到了决定性的作用,帮助开发人员控制自动化流程的执行。以下是对Jenkins Pipeline的主要组件和Groovy常用函数的详细讲解: 1. Jenkins Pipeline主要组件 1.1 agent 功能&…...
Tomcat 和 Netty 的区别及应用场景分析
在 Java Web 开发中,Tomcat 和 Netty 都是常见的网络框架,它们各自有着不同的设计理念和适用场景。本文将通过详细的对比和实际场景示例,帮助你理解 Tomcat 和 Netty 在功能、性能、架构等方面的差异,帮助你在实际开发中做出更合理…...

6.C操作符详解,深入探索操作符与字符串处理
C操作符详解,深入探索操作符与字符串处理 C语言往期系列文章目录 往期回顾: C语言是什么?编程界的‘常青树’,它的辉煌你不可不知VS 2022 社区版C语言的安装教程,不要再卡在下载0B/s啦C语言入门:解锁基础…...

生数科技发布 Vidu 1.5 新版本,引领视频大模型新潮流
在国内视频大模型领域,生数科技一直以创新和突破而备受瞩目。近日,生数科技再度发力,发布了 Vidu 1.5 新版本,为视频创作带来了全新的变革与机遇。 Vidu 1.5 新版本在多个方面展现出了卓越的性能和创新的特点。首先,它…...
CentOS 7 aarch64停止更新后安装gcc8 —— 筑梦之路
CentOS 7.9非X86架构系统生命周期结束后(2024-6-30)配置在线可用yum源 —— 筑梦之路_centos7.9 arm-CSDN博客 以前的做法 sudo yum install centos-release-scl-rh sudo yum install devtoolset-8-buildsudo yum install devtoolset-8-gdb sudo yum i…...

WPF下 DataGrid加入序号列
先上代码: <DataGrid Name"DGV" AutoGenerateColumns"False" Grid.Row"0" Grid.Column"0" HorizontalGridLinesBrush"RoyalBlue" VerticalGridLinesBrush"Tomato" CanUserAddRows"False&qu…...
iOS UI 自动化 手势右滑退出当前页面
1、TouchAction from appium.webdriver.common.touch_action import TouchAction# 获取屏幕的宽度和高度 screen_width driver.get_window_size()["width"] screen_height driver.get_window_size()["height"]# 定义滑动的起点和终点坐标 start_x 0 en…...
《MySQL 实战教程:从零开始到高手进阶》
当然可以。下面是一篇关于MySQL的学习指南,它适合初学者到中级用户,涵盖了MySQL的基础知识、安装步骤、基本命令以及一些高级功能。 MySQL 学习指南 1. 了解 MySQL MySQL 是一个关系型数据库管理系统(RDBMS),由瑞典…...

第27天 安全开发-PHP应用TP 框架路由访问对象操作内置过滤绕过核心漏洞
时间轴 演示案例 TP 框架-开发-配置架构&路由&MVC 模型 TP 框架-安全-不安全写法&版本过滤绕过 TP 框架-开发-配置架构&路由&MVC 模型 参考: https://www.kancloud.cn/manual/thinkphp5_1 1、配置架构-导入使用 去thinkphp官网可以看到&…...

应用系统开发(12) Zync中实现数字相敏检波
在 Xilinx Zynq 系列(如 Zynq-7000 或 Zynq UltraScale+)中实现数字相敏检波(DSP,Digital Synchronous Detection)可以通过硬件(PL部分,FPGA逻辑)和软件(PS部分,ARM Cortex-A 处理器)的协同工作来实现。以下是一个详细的设计方法,包括基本原理和 Zynq 的实现步骤。…...

栈Stack和队列Queue
目录 一、栈 (1)用数组实现 (2)用单链表实现 (3)用标注尾结点的单链表实现 (4)用双向链表实现 2、栈的实际应用 (1)改变元素的序列 (2&am…...

uniapp 微信小程序地图标记点、聚合点/根据缩放重合点,根据缩放登记显示气泡marik标点
如图,如果要实现上方的效果: 上方两个效果根据经纬度标记点缩放后有重复点会添加数量 用到的文档地址https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.addMarkers.htmlMapContext.addMarkers(Object object) 添加标记点Ma…...

Percona XtraBackup备份docker版本mysql 5.7
my.cnf配置文件 [client] default_character_setutf8[mysqld] # 数据存储目录(必须手动指定) datadir/var/lib/mysql/data# 字符集 collation_server utf8_general_ci character_set_server utf8 # 二进制日志 server-id1 log_bin/var/log/mysql/binl…...
C++:关联式容器的介绍及map与set的使用
我们之前已经学习过string,vector,list,queue,priority_queue等容器,这些容器我们统称为序列式容器,因为它们的数据的逻辑结构呈线性。因为这些容器中存储的数据即便二者之间发生交换,也不会对原有的容器结构造成太大影响。 但上篇文章我们介…...
一文说清:Linux下C++静态库的封装和调用
一 引言 《一文说清:windows下C静态库的封装和调用》中说了: 静态库允许开发者在多个项目中复用代码,减少重复劳动,并增强程序的可维护性。并讲述了windows环境下创建、封装以及调用C静态库的过程。 本文则描述了,如…...

【Java 学习】数据类型、变量、运算符、条件控制语句
Java基础语法 1. 打印 Hello World !2. 变量类和数据类型2.1 什么是变量?什么是数据类型?2.2 常用的数据类型2.3 使用变量2.4 String 类数据类型2.4.1 String 类基本概念2.4.2 String 类的使用 3. 运算符3.1 算数运算符3.2 关系运算符3.3 逻辑运算符3.4 …...
【软考】系统架构设计师-数据库设计基础
数据库核心考点 三级模式-两级映射 外模式--视图 概念模式--表(模式、基本表) 内模式--物理文件 数据库设计 概念结构设计:属性冲突、命名冲突、结构冲突 逻辑结构设计:关系模式(层次模型、网络模型)…...
【Jmeter相关】
Jmeter 可以作为接口测试问题,也会涉及到性能相关的问题 一、JMeter中用户定义的变量(User Defined Variables)和用户参 数(User Parameters)的区别是什么? 在JMeter中都是用于定义和存储测试数据的方法,但它们有一…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...