【加密与解密】【08】Java加密算法详解

news2024/7/6 19:11:27

文章目录

          • Java加密库
          • 摘要算法
          • MD5代码实现
          • SHA256代码实现
          • HmacMD5代码实现
          • CRC32代码实现
          • 对称加密算法
          • 查看JDK支持的算法
          • Base64代码实现
          • DES代码实现
          • DESede代码实现
          • AES代码实现
          • RC代码实现
          • IDEA代码实现
          • PBE代码实现
          • 非对称加密算法
          • DH秘钥交换算法数学原理
          • DH算法代码实现
          • RSA算法代码实现
          • DSA算法代码实现
          • ECC算法代码实现
          • 数字签名算法
          • 数字签名算法代码实现

Java加密库
  • JDK
  • Apache Commons Codec
  • Bouncy Castle
// commons codec
api("commons-codec:commons-codec:1.17.0")
// bouncy castle provider
api("org.bouncycastle:bcprov-jdk18on:1.71")
// register bouncy castle provider
Security.addProvider(BouncyCastleProvider())
// use bouncy castle provider
KeyGenerator.getInstance(algorithm, "BC")
Cipher.getInstance(algorithm, "BC")
摘要算法

常用的摘要算法有

  • MD,Message Digest,如MD5
  • MD5生成的摘要为128位,对应的十六进制字符串为32位
  • MD5已被破解,适合对安全性要求不高的场景,常用于校验文件
  • SHA,Secure Hash Algorithm,如SHA256
  • SHA256生成的摘要为256位,对应的十六进制字符串为64位
  • SHA256常用于数字签名,账号密码加密
  • SHA算法在MD算法的基础上演进而来,安全性更高
  • SHA1算法已被破解,SHA2未来也大概率会被破解,目前SHA2算法仍然是安全的
  • SHA2系列算法包括SHA224,SHA256,SHA384,SHA512
  • MAC,Message Authentication Code,消息认证码,也叫HMAC
  • MAC算法在MD或SHA的基础上,加入秘钥机制,即持有秘钥才能生成摘要
  • MAC可以和MD或SHA来组合使用,比如HmacMD5,HmacSHA256,生成的摘要程度为MD或SHA的长度
  • CRC,Cyclic Redundancy Check,循环冗余校验,如CRC32
  • CRC算法生成一个简短的摘要,放在原数据的结尾,一起发送给接收方
  • CRC算法多用于硬件和通信领域,一般用于校验数据完整性
  • CRC32生成的摘要为32位,对应的十六进制字符串为8位
  • JDK支持以上所有摘要算法的常用版本
MD5代码实现
import java.io.FileInputStream
import java.security.MessageDigest

@OptIn(ExperimentalStdlibApi::class)
fun main() {
    val file = "resources/data.txt"
    val origin = FileInputStream(file).readAllBytes()
    val digest = MessageDigest.getInstance("MD5")
    val encrypted = digest.digest(origin)
    val md5 = encrypted.toHexString()
    println(md5)
}
SHA256代码实现

和MD5一样,只是algorithm不一样

val digest = MessageDigest.getInstance("SHA256")
HmacMD5代码实现
@OptIn(ExperimentalStdlibApi::class)
fun digestByMac() {
    val input = "Hello World".encodeToByteArray()
    // generate key
    val generator = KeyGenerator.getInstance("HmacMD5")
    val key = generator.generateKey()
    // digest by mac
    val mac = Mac.getInstance(key.algorithm)
    mac.init(key)
    val output = mac.doFinal(input)
    println(output.toHexString())
    // verify by mac
    val spec = SecretKeySpec(key.encoded, key.algorithm)
    val verifyMac = Mac.getInstance(key.algorithm)
    verifyMac.init(spec)
    val verifyOutput = verifyMac.doFinal(input)
    println(verifyOutput.toHexString())
}
CRC32代码实现
import java.io.FileInputStream
import java.util.zip.CRC32

@OptIn(ExperimentalStdlibApi::class)
fun main() {
    val file = "resources/data.txt"
    val origin = FileInputStream(file).readAllBytes()
    val crc32 = CRC32()
    crc32.update(origin)
    val checksum = crc32.value.toInt().toHexString()
    println(checksum)
}
对称加密算法

常用的对称加密算法有

  • Base64,将字节编码为Base64字符的一套算法
  • Base64不算严格意义上的对称加密,因为它没有秘钥,但是字符映射表间接充当了秘钥的角色
  • Base64字符仅包含大小写字母,数字,+,/,-,共64个字符
  • 由于Base64包含的都是基本字符,所以兼容性特别强,Base64主要用来解决数据传输过程中的编码问题,而不是加密
  • DES,最早规模化使用的加密算法
  • DES的密码较短,加密算法不完全公开,因此遭到安全性的质疑,并且存在安全漏洞
  • DESede,基于DES算法的三重迭代,来提升安全性,但同时也导致的加密效率较低的问题
  • AES,为了替代DES而诞生的一种算法
  • AES加密效率高,内存占用低,安全性高于DES算法,目前被广泛认可与应用
  • 并且,AES算法成为后来许多算法实现的主要参考模型
  • IDEA,International Data Encryption Algorithm,国际数据加密标准
  • IDEA算法早于AES,作为DES的替代算法出现
  • IDEA不是基于DES的改良而产生的,而是完全独创了一套新的算法
  • IDEA不是在美国发展起来的算法,没有遭到法律出口限制,在使用范围上更加灵活
  • 电子邮件加密协议PGP,即是使用了IDEA算法
  • RC,Rivest Cipher,AES同时代的竞争方案之一
  • Twofish,AES同时代的竞争方案之一,前身是Blowfish
  • PBE,Password Baed Encryption,基于口令的加密算法
  • PBE采用随机数,再拼凑多重加密的方式,来保证数据的安全性
  • 作为口令的随机数被称作为盐(Salt),同一个随机数不能被使用两次
  • 盐在固定秘钥的基础上引入了变数,这样就加大了破解难度
  • PBE是一个综合性算法,加密过程会用到其它算法,比如PBEWithMD5AndDES
  • JDK支持DES,AES,Blowfish,RC,PBE算法
查看JDK支持的算法
Security.getAlgorithms("KeyGenerator")
Security.getAlgorithms("KeyPairGenerator")
Security.getAlgorithms("Cipher")
Security.getAlgorithms("Signature")
Base64代码实现
import java.io.FileInputStream
import java.util.Base64

fun main() {
    val file = "resources/data.txt"
    val origin = FileInputStream(file).readAllBytes()
    // encode bytes to base64 string
    val encoder = Base64.getEncoder()
    val encoded = encoder.encodeToString(origin)
    println(encoded)
    // decode base64 string to bytes
    val decoder = Base64.getDecoder()
    val decoded = decoder.decode(encoded)
    println(String(decoded))
}
DES代码实现
import java.io.FileInputStream
import javax.crypto.Cipher
import javax.crypto.KeyGenerator
import javax.crypto.spec.SecretKeySpec

@OptIn(ExperimentalStdlibApi::class)
fun main() {
    val algorithm = "DES"
    // create test data
    val file = "resources/data.txt"
    val origin = FileInputStream(file).readAllBytes()
    // generate encrypt key
    val generator = KeyGenerator.getInstance(algorithm)
    val secretKey = generator.generateKey()
    // encrypt
    val cipher1 = Cipher.getInstance(algorithm)
    cipher1.init(Cipher.ENCRYPT_MODE, secretKey)
    val encrypted = cipher1.doFinal(origin)
    // generate decrypt key
    val keySpec = SecretKeySpec(secretKey.encoded, algorithm)
    // decrypt
    val cipher2 = Cipher.getInstance(algorithm)
    cipher2.init(Cipher.DECRYPT_MODE, keySpec)
    val decrypted = cipher2.doFinal(encrypted)
    println(decrypted.toHexString() == origin.toHexString())
}
DESede代码实现

和DES完全一致,算法名称改为DESedeTripleDES即可

AES代码实现

和DES完全一致,算法名称改为AES即可

RC代码实现

和DES完全一致,算法名称改为RC2即可

IDEA代码实现

JDK没有提供IDEA算法的实现,此时就轮到Bouncy Castle出场了

import org.bouncycastle.jce.provider.BouncyCastleProvider
import java.io.FileInputStream
import java.security.Security
import javax.crypto.Cipher
import javax.crypto.KeyGenerator
import javax.crypto.spec.SecretKeySpec

@OptIn(ExperimentalStdlibApi::class)
fun main() {
    val provider = "BC"
    val keyAlgorithm = "IDEA"
    val cipherAlgorithm = "IDEA"
    // register bouncy castle provider
    Security.addProvider(BouncyCastleProvider())
    // create test data
    val file = "resources/data.txt"
    val origin = FileInputStream(file).readAllBytes()
    // generate encrypt key
    val generator = KeyGenerator.getInstance(keyAlgorithm, provider)
    val secretKey = generator.generateKey()
    // encrypt
    val cipher1 = Cipher.getInstance(cipherAlgorithm, provider)
    cipher1.init(Cipher.ENCRYPT_MODE, secretKey)
    val encrypted = cipher1.doFinal(origin)
    // generate decrypt key
    val keySpec = SecretKeySpec(secretKey.encoded, keyAlgorithm)
    // decrypt
    val cipher2 = Cipher.getInstance(cipherAlgorithm, provider)
    cipher2.init(Cipher.DECRYPT_MODE, keySpec)
    val decrypted = cipher2.doFinal(encrypted)
    println(decrypted.toHexString() == origin.toHexString())
}
PBE代码实现

PBE是加盐算法,因此需要用到密码和盐两个参数来加解密

import java.io.FileInputStream
import java.security.SecureRandom
import javax.crypto.Cipher
import javax.crypto.SecretKeyFactory
import javax.crypto.spec.PBEKeySpec
import javax.crypto.spec.PBEParameterSpec

@OptIn(ExperimentalStdlibApi::class)
fun main() {
    val keyAlgorithm = "PBEWithMD5AndDES"
    val cipherAlgorithm = "PBEWithMD5AndDES"
    val password = "123456"
    val salt = SecureRandom().generateSeed(8)
    // create test data
    val file = "resources/data.txt"
    val origin = FileInputStream(file).readAllBytes()
    // generate secret key
    val keySpec = PBEKeySpec(password.toCharArray())
    val keyFactory = SecretKeyFactory.getInstance(keyAlgorithm)
    val secretKey = keyFactory.generateSecret(keySpec)
    // encrypt
    val algorithmSpec = PBEParameterSpec(salt, 100)
    val cipher1 = Cipher.getInstance(cipherAlgorithm)
    cipher1.init(Cipher.ENCRYPT_MODE, secretKey, algorithmSpec)
    val encrypted = cipher1.doFinal(origin)
    // decrypt
    val cipher2 = Cipher.getInstance(cipherAlgorithm)
    cipher2.init(Cipher.DECRYPT_MODE, secretKey, algorithmSpec)
    val decrypted = cipher2.doFinal(encrypted)
    println(decrypted.toHexString() == origin.toHexString())
}
非对称加密算法

常用的非对称加密算法有

  • DH算法,Diffie Hellman
  • DH算法基于离散对数的数学基础,通过模运算和幂运算实现秘钥交换
  • DH算法只能用于秘钥交换,不能用于数据解密
  • DH算法最早的非对称加密算法,为非对称加密算法奠定了理论基础
  • 几乎所有的非对称加密算法,都是基于数学问题的求解来设计的
  • RSA算法,Rivest Shamir Adleman
  • RSA算法基于大数因子分解问题
  • RSA算法技能既能用于数据加密,也能用于数字签名
  • RAS算法是应用范围最为广泛的非对称加密算法
  • RSA虽然能用于数据加密,但由于性能原因,只允许加密245字节以内的数据
  • 因此RSA的主流用法,还是用于数字签名
  • DSA算法,Digital Signature Algorithm
  • DSA算法基于离散对数问题
  • DSA算法的前身是ElGamal算法
  • DSA算法主要用于数字签名
  • DSA算法的私钥,不能解密公钥加密的数据,因此不具备完整加密功能
  • ECC算法,Elliptical Curve Cryptography
  • ECC算法基于椭圆曲线问题
  • ECC秘钥生成速度比RSA快,安全性也比RSA高,硬件占用比RSA低,但是普及度没RSA广
  • ECC算法技能既能用于数据加密,也能用于数字签名
  • ECC算法用于加密时,只允许公钥加密,私钥解密
  • ECDH算法,借鉴ECC算法改良的DH算法
  • ECDH算法沿用DH算法的思路,但基于ECC椭圆曲线问题来实现
  • ECDSA算法,借鉴ECC算法改良的DSA算法
  • JDK支持支持RSA和DSA算法
DH秘钥交换算法数学原理

DH秘钥交换算法,是一个通过公钥私钥,来协商对称秘钥的一种算法

  • 参数g,p是算法共享参数,所有人都知道
  • publicA = g^privateA mod p
  • publicB = g^privateB mod p
  • shareA = publicB^privateA mod p
  • shareB = publicA^privateB mod p
  • 通过数学理论可以论证,shareA==shareB
  • 因此可以使用shareA和shareB作为AB通信时的SecretKey
  • 由于shareA和shareB的生成依赖于自己的私钥和对方的公钥,对每个人都不一样,并且不存在网络交换过程,因为是安全的
DH算法代码实现

DH算法主要借助KeyAgreement类来实现

KeyAgreement是一个秘钥协商工具类,用于交换公钥,以生成相同的对称秘钥

@OptIn(ExperimentalStdlibApi::class)
fun swapSecretKey() {
    System.setProperty("jdk.crypto.KeyAgreement.legacyKDF", "true")
    val generator = KeyPairGenerator.getInstance("DH")
    val keyPair1 = generator.genKeyPair()
    val keyPair2 = generator.genKeyPair()
    val agreement = KeyAgreement.getInstance(generator.algorithm)
    agreement.init(keyPair1.private)
    agreement.doPhase(keyPair2.public, true)
    val secretKey1 = agreement.generateSecret("AES")
    agreement.init(keyPair2.private)
    agreement.doPhase(keyPair1.public, true)
    val secretKey2 = agreement.generateSecret("AES")
    println(secretKey1.encoded.toHexString(HexFormat.UpperCase))
    println(secretKey2.encoded.toHexString(HexFormat.UpperCase))
}
RSA算法代码实现
import java.io.FileInputStream
import java.security.KeyPairGenerator
import javax.crypto.Cipher

@OptIn(ExperimentalStdlibApi::class)
fun main() {
    val keyAlgorithm = "RSA"
    val cipherAlgorithm = "RSA"
    // create test data
    val file = "resources/data.txt"
    val origin = FileInputStream(file).readAllBytes().copyOf(245)
    // generate key pair
    val keyGenerator = KeyPairGenerator.getInstance(keyAlgorithm)
    val keyPair = keyGenerator.genKeyPair()
    // encrypt
    val cipher1 = Cipher.getInstance(cipherAlgorithm)
    cipher1.init(Cipher.ENCRYPT_MODE, keyPair.private)
    val encrypted = cipher1.doFinal(origin)
    // decrypt
    val cipher2 = Cipher.getInstance(cipherAlgorithm)
    cipher2.init(Cipher.DECRYPT_MODE, keyPair.public)
    val decrypted = cipher2.doFinal(encrypted)
    println(decrypted.toHexString() == origin.toHexString())
}
DSA算法代码实现

DSA不能用于加密,只能用于签名

用于签名时,必须要配合Signature使用,不能直接使用Cipher

虽然说,签名的实质就是对摘要进行加密,但是Cipher类的定位是数据加密,因此并不支持DSA算法

import java.io.FileInputStream
import java.security.KeyPairGenerator
import java.security.Signature

fun main() {
    val keyAlgorithm = "DSA"
    val signAlgorithm = "SHA256withDSA"
    // create test data
    val file = "resources/data.txt"
    val origin = FileInputStream(file).readAllBytes()
    // generate key pair
    val keyGenerator = KeyPairGenerator.getInstance(keyAlgorithm)
    val keyPair = keyGenerator.genKeyPair()
    // sign
    val sign = Signature.getInstance(signAlgorithm)
    sign.initSign(keyPair.private)
    sign.update(origin)
    val signature = sign.sign()
    // verify
    val verify = Signature.getInstance(signAlgorithm)
    verify.initVerify(keyPair.public)
    verify.update(origin)
    val result = verify.verify(signature)
    println(result)
}
ECC算法代码实现

ECC用于加密时,需要借助Bouncy Castle来实现

import org.bouncycastle.jce.provider.BouncyCastleProvider
import java.io.FileInputStream
import java.security.KeyPairGenerator
import java.security.Security
import javax.crypto.Cipher

@OptIn(ExperimentalStdlibApi::class)
fun main() {
    val provider = "BC"
    val keyAlgorithm = "ECIES"
    val cipherAlgorithm = "ECIES"
    // register bouncy castle provider
    Security.addProvider(BouncyCastleProvider())
    // create test data
    val file = "resources/data.txt"
    val origin = FileInputStream(file).readAllBytes()
    // generate key pair
    val keyGenerator = KeyPairGenerator.getInstance(keyAlgorithm, provider)
    val keyPair = keyGenerator.genKeyPair()
    // encrypt
    val cipher1 = Cipher.getInstance(cipherAlgorithm, provider)
    cipher1.init(Cipher.ENCRYPT_MODE, keyPair.public)
    val encrypted = cipher1.doFinal(origin)
    // decrypt
    val cipher2 = Cipher.getInstance(cipherAlgorithm, provider)
    cipher2.init(Cipher.DECRYPT_MODE, keyPair.private)
    val decrypted = cipher2.doFinal(encrypted)
    println(decrypted.toHexString() == origin.toHexString())
}

ECC用于签名时,必须要配合Signature使用,不能直接使用Cipher加密摘要

Cipher在进行数据加密时,会对公钥私钥格式进行检测,避免用户乱用

import org.bouncycastle.jce.provider.BouncyCastleProvider
import java.io.FileInputStream
import java.security.KeyPairGenerator
import java.security.Security
import java.security.Signature

fun main() {
    val provider = "BC"
    val keyAlgorithm = "ECIES"
    val signAlgorithm = "SHA256withECDSA"
    // register bouncy castle provider
    Security.addProvider(BouncyCastleProvider())
    // create test data
    val file = "resources/data.txt"
    val origin = FileInputStream(file).readAllBytes()
    // generate key pair
    val keyGenerator = KeyPairGenerator.getInstance(keyAlgorithm, provider)
    val keyPair = keyGenerator.genKeyPair()
    // sign
    val sign = Signature.getInstance(signAlgorithm, provider)
    sign.initSign(keyPair.private)
    sign.update(origin)
    val signature = sign.sign()
    // verify
    val verify = Signature.getInstance(signAlgorithm, provider)
    verify.initVerify(keyPair.public)
    verify.update(origin)
    val result = verify.verify(signature)
    println(result)
}
数字签名算法

数字签名包含两步,第一步是生成摘要,第二步是对摘要进行加密

所以数字签名算法,即是摘要算法和非对称加密算法的组合,常见的组合有

MD5withRSA,SHA256withRSA,SHA256withDSA,SHA256withECDSA

数字签名算法代码实现

数字签名有专门的工具类Signature,不需要我们手动去摘要再加密

上面两节,在介绍DSA和ECC时,已经展示了其用于签名时的使用方式

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

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

相关文章

【计算机毕业设计】基于Springboot的B2B平台医疗病历交互系统【源码+lw+部署文档】

包含论文源码的压缩包较大,请私信或者加我的绿色小软件获取 免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者…

Python爬取国家医保平台公开数据

国家医保服务平台数据爬取python爬虫数据爬取医疗公开数据 定点医疗机构查询定点零售药店查询医保机构查询药品分类与代码查询 等等,数据都能爬 接口地址:/ebus/fuwu/api/nthl/api/CommQuery/queryFixedHospital 签名参数:signData {dat…

H5打包失败:JS堆内存不足

傻子没看懂报错,像个无头苍蝇 解决方式:清空缓存,重启电脑,打包成功。

二叉树中序遍历-递归法详解-数据结构与算法

首先看下中序遍历的代码:(左 跟 右) 其首先要接受一个根结点root作为参数 判断根节点是否为NULL 不为NULL则递归遍历左子树 ①我们把树根结点A传递给它 其左结点为B,右结点为C ②首先我们要检查root是否为NULL 其不为NULL …

使用pyinstaller 如何打包python项目

参考:【python项目正确打包方法-哔哩哔哩】 https://b23.tv/EDB6zbG Pyinstaller 详解多种打包过程(去坑,填坑)。_pyinstaller -f -w-CSDN博客 1.打开命令提示符: 找到python项目所在位置,输入cmd即可 2. 安装pipenv: 在命令提示符&#…

1000T的文件怎么能快速从南京传到北京?最佳方案你肯定想不到

今天刷面试题看到一个有意思的面试题, 1000T的文件怎么能以最快速度从南京传到北京? 网络传输 首先我们考虑通过网络传输,需要多长时间。 我特地咨询了在运营商工作的同学,目前带宽: 家庭宽带下行最大1Gbps&#…

x264 编码器汇编模块介绍

aarch64汇编架构 解释:AArch64 是 ARM 架构的 64 位版本,也称为 ARMv8-A特点: 64位寻址能力,支持更大的地址空间,理论上可达16EB(Exabyte)使用64位宽的寄存器,有31个通用寄存器(X0-X30),外加一个链接寄存器(X31)支持扩展的 NEON SIMD 指令集,提供更多的执行单元和…

电脑显示由于找不到MSVCP140.dll,无法继续执行代码

电脑已经成为我们生活和工作中不可或缺的工具,然而,在使用电脑的过程中,我们常常会遇到一些错误提示,其中之一就是“电脑显示由于找不到MSVCP140.dll是怎么回事?”这个问题。小编将详细介绍该问题的原因、解决方法以及…

新版本发布丨昂辉科技EasySAR-Configurator V1.2.0再启航

昂辉科技新一代跨平台高性能AUTOSAR配置工具EasySAR-Configurator V1.2.0全新版本重磅发布!产品基于Web架构前后端分离的方式开发,可提供SaaS部署,能够实现精准配置和最大限度的代码裁剪,且配备标准的约束限制、配置验证、代码生成…

技术成神之路:设计模式(二)建造者模式

1.定义 建造者模式(Builder Pattern)是一种创建型设计模式,它允许你分步骤创建复杂对象,而不必直接调用构造函数。建造者模式特别适合那些包含多个组成部分并且构造过程复杂的对象。 2. 结构 建造者模式的主要组成部分包括&#…

基于字符和词特征融合的恶意域名检测

传统的恶意域名检测方法在检测由域名生成算法(DGA)随机生成的恶意域名方面性能不佳,尤其是对于那些由随机单词组成的域名。文章提出了一种新的检测算法,通过融合字符和词特征来提高对恶意域名的检测能力,特别是对于更具…

【RT摩拳擦掌】如何构建RT AVB switchendpoint平台

【RT摩拳擦掌】如何构建RT AVB switch&endpoint平台 一,文档简介二,平台构建2.1 软硬件情况2.2 配置RT1170 AVB端点2.2.1 1块MIMXRT1170开发板做talker配置2.2.2 2块MIMXRT1170开发板做listener配置 2.3 AVB Switch 配置2.3.1 MOTU AVB Switch2.3.2 …

【鸿蒙学习笔记】@Prop装饰器:父子单向同步

官方文档:Prop装饰器:父子单向同步 [Q&A] Prop装饰器作用 Prop装饰的变量可以和父组件建立单向的同步关系。Prop装饰的变量是可变的,但是变化不会同步回其父组件。 [Q&A] Prop装饰器特点 1・Prop装饰器不能在Entry装饰的…

关于ant design vue 使用Modal无法关闭弹窗的解决思路

文章目录 1: 出现问题的版本2.出现问题(1)ant design 的问题(2)poina的提示报错 3.正确版本总结 1: 出现问题的版本 "ant-design-vue": "^3.2.20", "pinia": "^2.1.7", "vue"…

Mybatis Plus 自动填充注解 @TableField(fill = FieldFill.INSERT_UPDATE)

第一步:在需要自动填充的位置加上注解 通过在创建时间和修改时间上添加 fill 填充字段 进行自动填充 第二步:要想实现自动填充还需要实现MetaObjectHandler接口,在这里实现自动填充的逻辑 Component public class MyMetaObjectHandler …

python sklearn机械学习-数据预处理

🌈所属专栏:【机械学习】✨作者主页: Mr.Zwq✔️个人简介:一个正在努力学技术的Python领域创作者,擅长爬虫,逆向,全栈方向,专注基础和实战分享,欢迎咨询! 您…

filex文件系统功能预研

filex资源 filex的源码路径有两个: 一个是azure-rtos下的filex:azure-rtos/filex (github.com)一个是eclipse-threadx下的filex:eclipse-threadx/filex filex的文档地址:rtos-docs/rtos-docs/filex 第三方文档:Thre…

搭建知识付费系统的技术框架与实现路径

知识付费系统已经成为内容创作者和企业变现的重要工具。要成功搭建一个高效、稳定、用户体验良好的知识付费系统,明确技术框架和实现路径至关重要。本文将详细解析搭建知识付费系统的技术框架,并提供具体的实现路径和相关技术代码示例。 一、知识付费系…

大陆ARS548使用记录

一、Windows连接上位机 雷达是在深圳路达买的,商家给的资料中首先让配置网口,但我在使用过程中一直出现无法连接上位机的情况。接下来说说我的见解和理解。 1.1遇到的问题 按要求配置好端口后上位机无连接不到雷达,但wireshark可以正常抓到数…

基于改进YOLOv5s的跌倒行为检测 | 引入SKAttention注意机制 + 引入空间金字塔池化结构SPPFCSPC + 结合ASFF自适应空间融合

前言:Hello大家好,我是小哥谈。为了实现电厂人员跌倒行为的实时检测,防止跌倒昏迷而无法及时发现并救援的事件发生,针对跌倒行为检测实时性以及特征提取能力不足的问题,提出了一种改进YOLOv5s的跌倒行为检测算法网络&a…