STM32HAL库-移植mbedtls开源库示例(二)

2023-11-02

概述


       本篇文章介绍如何使用STM32HAL库,这篇文章只要是讲如何使用mbedtls开源库,实现 1、base64编码,2、AES加解密示例。怎么样移植mbedtls开源库,请阅读我写的一篇文章《STM32HAL库-移植mbedtls开源库示例(一)》

 

GitHub:https://github.com/ARMmbed/mbedtls

硬件:STM32F103CBT6最小系统板
软件:Keil 5.29  + STM32CubeMX6.01

使用前,需了解,你产品中的FLASH不能低于64K的SRAM(内存),如果你使用的比较低端的STM32,那么无解,没法用embedtls。

一、STM32CubeMx配置

注:mbedtls所使用的栈空间是比较大,STM32CubeMX生成工程代码时候将栈空间调大,如下所示:

二、Examples

main.c文件
 

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "mbedtls/sha1.h"		//使用sha1相关加密函数
#include "string.h"				  //使用到了strlen函数

#include "mbedtls/aes.h"
#include "mbedtls/base64.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
#define ORIGINAL_DATA   "ABCDEFGHIJKLMNOP"
#define PASSWORD        "AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDD"
#define PLAINSTRING     "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

//sha1编解码测试代码:
void sha1_test(void)
{
	printf("mbedtls port on STM32F103 core board by champion666\r\n");

	/* sha1 test */
	char *source_cxt = "champion666";
	char encrypt_cxt[64];

	printf("source context is:%s\r\n", source_cxt);

	mbedtls_sha1_context sha1_ctx;
	mbedtls_sha1_init(&sha1_ctx);
	mbedtls_sha1_starts(&sha1_ctx);
	mbedtls_sha1_update(&sha1_ctx, (unsigned char *)source_cxt, strlen(source_cxt));
	mbedtls_sha1_finish(&sha1_ctx, (unsigned char *)encrypt_cxt);
	mbedtls_sha1_free(&sha1_ctx);

	int i = 0;
	printf("sha1 encrypt context is:[");
	while (encrypt_cxt[i]) {
		printf("%02x", encrypt_cxt[i]);
		i++;
	}
	printf("]\r\n");
}

//base64编解码测试代码:
void mbedtls_base64(void)
{
	int i = 0;
	uint16_t len = 0;
	
	// 原始数据
	char* plaintext = ORIGINAL_DATA;
	
	len = strlen(plaintext);
	
  // base64编码和解码输出数据的长度
  size_t enclen = 0, declen = 0;

  // 存放base64编码输出
  uint8_t encode[32];

  // 存放base64解码输出
  uint8_t decode[32];

	// 编码
  mbedtls_base64_encode(encode, sizeof(encode), &enclen, (unsigned char *)plaintext, len);

	// 解码
  mbedtls_base64_decode(decode, sizeof(decode), &declen, encode, enclen);
	
  printf("- enclen:%d\r\n", enclen);
  printf("- encode:%s\r\n", encode);
  printf("- declen:%d\r\n", declen);
  printf("- decode:");
	for(i = 0; i < declen; i++)
	{
		printf("%c", (char)decode[i]);
	}
	printf("\r\n");
}

//AES加解密测试代码(ECB模式):
void mbedtls_aes_ecb(void)
{
	int i = 0;
	mbedtls_aes_context ctx;
	uint16_t len = 0;
	
	// 要加密的数据
	char* plaintext = ORIGINAL_DATA;

	len = strlen(plaintext);
	
	// 密码
	const uint8_t passwd[] = PASSWORD;
	
	// 加密输出
	uint8_t encrypt[len];
	
	// 解密输出
	uint8_t decrypt[len];

	// 初始化
	mbedtls_aes_init(&ctx);

	// 设置加密密钥
	mbedtls_aes_setkey_enc(&ctx, passwd, 256);
	
	// 加密
	mbedtls_aes_crypt_ecb(&ctx, MBEDTLS_AES_ENCRYPT, (unsigned char *)plaintext, encrypt);
	
	// 设置解密密钥
	mbedtls_aes_setkey_dec(&ctx, passwd, 256);
	
	// 解密
	mbedtls_aes_crypt_ecb(&ctx, MBEDTLS_AES_DECRYPT, encrypt, decrypt);

	// 清理
	mbedtls_aes_free(&ctx);
	
	printf("data:%s\r\n", plaintext);
	printf("key:%s\r\n",  PASSWORD);
	
	printf("encrypt:");
	for(i = 0; i < len; i++)
	{
		printf("%02X", encrypt[i]);
	}
	printf("\r\n");
	
	printf("decrypt:");
	for(i = 0; i < len; i++)
	{
		printf("%c", decrypt[i]);
	}
	printf("\r\n");
}

//AES加解密测试代码(CBC模式):
void mbedtls_aes_cbc(void)
{
	int i = 0;

	mbedtls_aes_context ctx;
	uint16_t len = 0;

	// 密码
	char* passwd = "AAAAAABBBBCCCCDD";

	// 用于加密的向量表
	uint8_t iv_encrypt[16] = { 0X00, 0X01, 0X02, 0X03, 0X10, 0X11, 0X12, 0X13, 0X20, 0X21, 0X22, 0X23, 0X30, 0X31, 0X32, 0X33 };

	// 用于解密的向量表
	uint8_t iv_decrypt[16] = { 0X00, 0X01, 0X02, 0X03, 0X10, 0X11, 0X12, 0X13, 0X20, 0X21, 0X22, 0X23, 0X30, 0X31, 0X32, 0X33 };

	// 待加密的数据
	char* plaintext = PLAINSTRING;

	len = strlen(plaintext);	
		
	// 存储加密后的输出
	uint8_t encrypt[len];

	// 存储解密后的输出
	uint8_t decrypt[len];

	// 加密
	mbedtls_aes_setkey_enc(&ctx, (unsigned char *)passwd, 128);
	mbedtls_aes_crypt_cbc(&ctx, MBEDTLS_AES_ENCRYPT, len, iv_encrypt, (unsigned char *)plaintext, encrypt);

	// 解密
	mbedtls_aes_setkey_dec(&ctx, (unsigned char *)passwd, 128);
	mbedtls_aes_crypt_cbc(&ctx, MBEDTLS_AES_DECRYPT, len, iv_decrypt, encrypt, decrypt);

  printf("data:%s\r\n", PLAINSTRING);
	printf("key:%s\r\n",  passwd);
	// 打印出加入后的结果
	printf("encrypt:");	
	for (i = 0; i < len; i++)
	{
		printf("%02X", encrypt[i]);
	}
	printf("\r\n");

	// 打印处解密后的结果
	printf("decrypt:");
	for (i = 0; i < len; i++)
	{
		printf("%c", decrypt[i]);
	}
	printf("\r\n");
}


/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
	//printf("***************sha1_test()***********\r\n");
	//sha1_test();
	printf("***************mbedtls_base64()***********\r\n");
	mbedtls_base64();
	printf("***************mbedtls_aes_ecb()***********\r\n");
	mbedtls_aes_ecb();
	printf("***************mbedtls_aes_cbc()***********\r\n");
	mbedtls_aes_cbc();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */
#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  None
  * @retval None
  */
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
	HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
  return ch;
}
 
int fgetc(FILE * f)
{
  uint8_t ch = 0;
  HAL_UART_Receive(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */

  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

三、运行结果


在线AES加密解密工具,可以验证单片机加解密是否正确。
网址1:https://the-x.cn/cryptography/Aes.aspx
网址2:http://tool.chacuo.net/cryptaes/

传送门->代码

四、总结

    好了,就介绍到此。

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32HAL库-移植mbedtls开源库示例(二) 的相关文章

  • 【沧海拾昧】Proteus8仿真stm32:ADC转换程序

    C0102 沧海茫茫千钟粟 且拾吾昧一微尘 沧海拾昧集 CuPhoenix 阅前敬告 沧海拾昧集仅做个人学习笔记之用 所述内容不专业不严谨不成体系 如有问题必是本集记录有谬 切勿深究 目录 一 原理图绘制 二 多位七段数码管 三 ADC引脚
  • 基于STM32HAL库编写状态机模式

    概述 本篇文章介绍如何使用STM32HAL库 以马达转动的状态示例 来说明 项目中使用的状态模式 参考该文章链接 比较懒 基本都是照搬框架 这种写法确实在项目后续新增功能时 方便不少 还是值得学习 这样的思路 加油 技术同仁们 硬件 STM
  • STM32读写内部Flash(介绍+附代码)

    概述 内部Flash读写详解 一 介绍 首先我们需要了解一个内存映射 stm32的flash地址起始于0x0800 0000 结束地址是0x0800 0000加上芯片实际的flash大小 不同的芯片flash大小不同 RAM起始地址是0x2
  • STM32-TIM4-定时器中断

    include project h include timer h TIM4 Init 2000 72 定时2ms 定时器中断的定时时间设定 定时器只需要配置时钟 TIM和NVIC即可 void TIM4 Init u16 period u
  • 理解stm32当中旋转编码器左转或者右转的联系和区别

    在这里判断左转右转的代码为 判断左转时 K2下降沿 如果这个时候K3为0 那么就可以判断是左转 所以代码为 接下来是中断的中断函数 void EXTI0 IRQHandler void 检查一下中断标志位 if EXTI GetITStat
  • OLED显示小数

    OLED显示小数并不是很难的 在通用的OLED库中是没有显示小数的 需要自己去写 写的方法大致是这样的 写出0到9的ACSLL值 只需要将小数点后面的位数 一位一位的写数字对应的ACSLL值即可 其中小数点 也是写同样对应的ACSLL值 只
  • STM32-定时器系列(一)基本定时器

    相信学过51单片机的小伙伴们使用过定时刷新数码管吧 那也一定想过 我们在STM32中也想要实现定时刷新数码管 这该怎么实现呢 下面小编就带大家走进STM32的定时器模块吧 一 什么是定时器 定时器是一种计时的工具 它具有延时 频率测量 PW
  • 【STM32】

    失败了也挺可爱 成功了就超帅 文章目录 前言 1 JTAG SWD引脚 2 禁用JTAG功能 2 1 标准库 2 2 HAL库 3 禁用SWD JTAG功能 3 1 标准库 3 2 HAL库 总结 前言 最近在画板子耍 我LED灯选用的 P
  • MCU学习笔记_PWR电源管理系统

    MCU学习笔记 电源管理系统 1 STM32电源监控器概述 2 STM32电源 3 HAL库配置PVD实例 1 STM32电源监控器概述 原因 保持系统正常运行 实现特定条件下的低功耗模式 上电复位 POR 掉电复位 PDR 上电复位是指上
  • STM32引用“CmBacktrace”: ARM Cortex-M 系列 MCU 错误追踪库

    目录 概述 一 使用方法 0 CmBacktrace 是什么 1 为什么选择 CmBacktrace 2 CmBacktrace 如何使用 2 1 演示 2 2 Demo 2 3 移植说明 2 4 API 说明 2 5 常见问题 2 6 许
  • stm32cubemx使用mpu6050

    文章目录 接线图 代码 常见问题 接线图 一般情况下 大家买的 mpu 6050 有两种 1 就是 单个的 mpu6050 芯片 2 就是 mpu6050 模块 如果 是第一种情况的话 大家可以参考 下图所示 如果是第二种情况的话 一般来说
  • STM32-ADC电压采样实验(寄存器版)

    STM32F10X系列支持三路ADC 其ADC通道及对应IO口如下表所示 其能接受的电压输入范围一般为0 3 3V VREF VIN VREF 因此 如果需要测量超出0 3 3v量程范围的电压数据 需要在外围硬件增加分压电阻 将电路转换到0
  • #STM32 GPIO编程详解

    硬件环境 stm32f407zet6 软件环境 mdk5 1 GPIO概述 GPIO 翻译为通用输入输出 也就是软件可编程引脚 也就是MCU通过控制GPIO来完成一系列的功能 GPIO属于引脚 但引脚还包含电源 晶振 下载 boot 复位等
  • 001--STM32使用--TIM8的PWM输出

    void TIM8 PWM Init u16 arr u16 psc GPIO InitTypeDef GPIO InitStructure TIM TimeBaseInitTypeDef TIM TimeBaseStructure TIM
  • STM32HAL库-移植mbedtls开源库示例(一)

    目录 概述 一 使用方法 二 STM32CubeMx配置 三 Examples 四 运行结果 五 总结 概述 本篇文章介绍如何使用STM32HAL库 移植mbedtls开源库支持mqtt证书加密示例 GitHub https github
  • 复用推挽输出与推挽输出区别

    GPIO InitStructure GPIO Mode GPIO Mode AF PP 复用推挽输出 GPIO SetBits GPIOE GPIO Pin 5 如果LED1是上拉的话 这时候它被点亮了 GPIO Mode AF PP g
  • Stm32待机模式的进入与唤醒

    1 基础介绍 1 1 单片机的 低功耗模式 像是手机的待机模式 不同于正常运行模式 处于一种省电省资源的状态 1 2 在运行情况下 HCLK为cpu提供时钟 cortex m3内核执行程序的代码 如果处于中断事件的等待时 可以进入低功耗模式
  • Eclipse搭建stm32+jlink开发环境全攻略

    Eclipse搭建stm32 jlink开发环境全攻略 初级篇 前言 为什么需要这样的开发环境 免费 跨平台 自由度高 Eclipse代码提示功能强大 MDK弱爆了 注 本人原创 转载注明作者 by 秋之前 email xia mengli
  • STM32HAL库-针对芯片内部EEprom读写操作介绍

    目录 概述 一 使用方法 二 STM32CubeMx配置 三 Examples 四 运行结果 五 总结 概述 本篇文章介绍如何使用STM32HAL库 操作芯片内部EEprom读写数据 类似操作Flash 可实现掉电保存数据功能 注 有些型号
  • STM32HAL 移植MultiButton小巧简单事件驱动型按键驱动框架(裸机版本)

    目录 概述 一 使用方法 特性 按键事件 Examples 二 STM32CubeMx配置 三 Examples 四 运行结果 五 总结 概述 本篇文章介绍如何使用STM32移植 MultiButton开源框架 引用官网简述如下 Multi

随机推荐

  • jsp Servlet的接口方法简绍

    jsp Servlet的接口方法简绍 简单介绍 三个重要的方法 重要掌握 1 被创建的方法 2 提供服务的方法 3 被销毁的方法 package Servlet import javax servlet import java io IOE
  • 使用 CentOS 7 部署前端项目

    购买服务器 以腾讯云为例 如果是 25 岁以下 可以免学生认证 使用校园优惠套餐 购买地址 云 校园 本文以 CentOS 为例 购买后 会初始化 root 密码 就可以使用云服务器了 配置服务器 购买之后就可以使用 root 用户名和腾讯
  • MySQL备份笔记

    MySQL备份笔记 备份的分类维度 备份时数据库的状态 Hot Backup 热备 正常运行中直接备份 Cold Backup 冷备 完全停止后备份 Warm Backup 温备 数据库只读 备份文件的格式 逻辑备份 输出文本或SQL语句
  • ubuntu 20.04 安装微信和QQ

    安装wine环境 根据教程 首先安装wine环境 然后安装weixin包 下载Wine环境包 http archive ubuntukylin com software pool partner ukylin wine 70 6 3 25
  • Linux安装配置php7+nginx

    1 安装php7 0 下载 wget http cn2 php net distributions php 7 0 4 tar gz 解压安装 tar zxvf php 7 0 4 tar gz cd php 7 0 4 首先查看安装帮助
  • vscode运行php报错php not found

    vscode运行php not found报错 要先检查原来的配置能否正常运行 1 插件 这两款插件试运行php的 2 查看php版本 3 php下载 下载php php下载 下载后配置环境变量 4 Xdebug 下载 找到生产环境 赋值一
  • vs code下运行conda环境报错

    在使用vs code下conda环境 运行程序会报告如下问题 conda activate base CommandNotFoundError Your shell has not been properly configured to u
  • 无法打开“×××”,因为无法确认开发者的身份——解决办法

    当打开这些应用程序时 系统提示无法打开 XXX 因为它来自身份不明的开发者 我们可以按照下面的方法解决 教程 1 打开应用程序 找到你要打开的软件 按住control键 点击应用打开 或者右键打开 2 出现下图所示 点击打开即可 3 只有第
  • http请求与响应,TCP三次握手&四次分手

    从前端发起请求到后台的整个过程 是一个面试中经常遇到的问题 大概的流程想必有一点基础的人都明白 但是要细说 却未必能一一道出来 曾经老师教过的知识也都差不多忘干净了 所以 我上网找了点资料 加上自己的理解 做个记录 华丽的分割线 一 HTT
  • 用Python语言开发VTK程序的步骤

    在Windows环境下用Python语言开发VTK程序 1 安装Python集成开发环境IDLE 下载地址 https www python org downloads 2 然后到VTK官网下载vtkpythone 6 2 0 Window
  • Java数据类型,强制类型转换

    1 基本数据类型 byte short int long float double char boolean 8大类型 1 整型 byte short int long 2 浮点型 float double 小数类型 3 字符型 char
  • 蓝桥杯算法提高VIP-合并石子

    题目 题解 区间dp 我是枚举的两个边界 但是出现问题了 左边界的枚举必须要从后向前 因为需要先获取区间长度小的对应的dp 才能递推出大区间的dp值 如果我左区间从左向右遍历 第二层右边界也从左向右遍历 则会先遍历到大区间 而与之相关的小区
  • vector与list的区别

    概念 vector 连续存储的容器 动态数组 在堆上分配空间 底层实现 数组 两倍容量增长 vector 增加 插入 新元素时 如果未超过当时的容量 则还有剩余空间 那么直接添加到最后 插入指定位置 然后调整迭代器 如果没有剩余空间了 则会
  • 下一步可以学下ue4 shader

    上周六 Osg直播间 恒歌提到了他们的做法 osgearth ue4 shader 这是非常好的思路 因为ue4缺点是底层资料少 优点是渲染效果好 这算是扬长避短的做法了 我正好会ue4 也会shader 正好也在学osgearth 虽然都
  • 微博数据爬虫——获取特定ID的粉丝和关注(二)

    注意 近期发现使用requests库访问微博数据出现ssl error错误 而使用urllib库访问则不会出现错误 功能 给定特定微博用户ID 获取微博用户的粉丝和关注 1 通过o id获取p id 用户主页结构如下所示 通过使用正则匹配即
  • Java远程调试

    1 把导出的jar包放到服务器上 执行的时候增加执行参数 jdk1 7版本之前的命令 java agentlib jdwp transport dt socket address 8000 server y suspend y jar xx
  • linux中病毒排查步骤,linux系统下病毒排除思路

    1 top查看是否有特别吃cpu和内存的进程 病毒进程kill是杀不死的 因为ps命令被修改 2 ls la proc 病毒进程pid pwd为病毒进程程序目录 一般在 usr bin下 3 bin ps bin netsta程序都是1 2
  • unity3d Object.Destroy 销毁

    static function Destroy obj Object t float 0 0F void Description描述 删除一个游戏物体 组件或者资源 物体obj现在被销毁或在指定了t时间过后销毁 如果obj是组件 它将从Ga
  • 深圳白领集体居家办公 远程办公或成企业新选择

    近日 深圳地区疫情爆发 多个办公大楼被划为封控区 众多白领临时接到居家办公的通知 一批又一批的员工从CBD大楼走出来 大量白领带上电脑显示屏与主机 被网友戏称 跑毒 带主机回家办公 成为突发疫情下众多人的无奈选择 远程办公成常态化 远程产品
  • STM32HAL库-移植mbedtls开源库示例(二)

    概述 本篇文章介绍如何使用STM32HAL库 这篇文章只要是讲如何使用mbedtls开源库 实现 1 base64编码 2 AES加解密示例 怎么样移植mbedtls开源库 请阅读我写的一篇文章 STM32HAL库 移植mbedtls开源库