數據安全系列4:常用的對稱算法淺析

常用的算法介紹

常用的算法JAVA實現

jce及其它開源包介紹、對比

傳送門

數據安全系列1:開篇

數據安全系列2:單向散列函數概念

數據安全系列3:密碼技術概述

時代有浪潮,就有退去的時候

在我的博客文章里面,其中絕大多數都是專注于技術探討,間或一些設計或項目管理的分享。極少有關于個人看法、感悟之類。不過在上一篇數據安全系列3:密碼技術概述里面談到了如何應對工作的壓力:

打工的終極目標是跳槽或者變成合伙人

?所以這里就想再寫幾句,權當"吐槽"幾句!

這是最好的時代,也是最壞的時代

“這是最好的時代,也是最壞的時代”,英國文學家狄更斯曾這樣描述工業革命發生后的世界。這句話放在現在亦不為過,彼時彼刻恰如此時此刻!記得14年住在杭州出租屋的時候,偶然看到同學買的《浪潮之巔》被序里面的幾句話所吸引:

因為,雖然對于一個公司來講,趕上一次浪潮不能保證它長盛不衰;但是,對于一個人來講,一生趕上這樣一次浪潮就足夠了。對于一個弄潮的年輕人來講,最幸運的莫過于趕上一波大潮。

--------引自《浪潮之巔》

里面的內容:微軟、google、IBM這些超一流公司的前世今生介紹;瀏覽器大戰,客廳爭奪、微機之爭商戰風起云涌;還有對于投資銀行、華爾街、硅谷的角色解讀;關于亞太地區,尤其是阿里巴巴的精準預測,深深打動了當時那個年輕人,迷茫又堅定的投入了軟件開發行業!在后續的幾年中也確實趕上了移動互聯網這個浪潮。

近一百多年來,總有一些公司很幸運地、有意識或者無意識地站在技術革命的浪尖之上。
一旦處在了那個位置,即使不做任何事,也可以隨著波浪順順當當地向前漂個十年甚至更長
的時間。在這十幾年間,它們代表著科技的浪潮,直到下一波浪潮的來臨。

--------也引自《浪潮之巔》

誠如作者所說,浪潮襲來整個行業生機勃勃、浪尖之上一切看起來皆有可為。但是浪潮退祛之后到底是繼續繁榮、還是平穩衰退作者卻并為給出預測。甚至哀鴻遍野都殊為可知,而且一切并非妄語!做為身在其中的從業者感受更是提前感受到了"寒冬"

經濟的沖擊

俗話說“春江水暖鴨告知”。首當其沖的是大家普遍會覺得找工作變難了,大家也不敢隨便跳槽了:

  • 很多公司都開始裁員了,無論是所謂的老牌BAT、新晉的PATB這些互聯網;還是國企所屬
  • 很多公司都嚴查考勤了,包括宣稱"不打卡"的互聯網;也開始到期不續約了,變相裁員
  • 更重要的是降薪,不論是砍福利、通過績效手段勸退、還是整體降薪

而這一切其實最終都是經濟這只大手帶來的影響,企業打響了"降本增效"的大旗,砍向了里面的每一個人。被迫離開的人有的找工作時間普遍變長了,GAP幾個月屢見不鮮;還有的人可能就真的徹底告別這個行業了,離職=失業不再是一句自我調侃。

一個在阿里呆了5年的同事,懷著"闖一番"的念頭主動離職,加入了做在線教育的創業公司,沒過多久由于眾所周知的原因失業了,從此在本地再也找不到合適的工作,最后異地去了蘇州上班。

AI的沖擊

除了外部環境沖擊,行業內也在悄然起了變化。這2年AI的興起其實對IT行業也有影響,這點不得不承認。比如我感覺AI對話的很多問題,就算是計算機專業領域,也回答的非常合理甚至更為全面(請放心這里不是打廣告也不賣課...)。等哪一天AI真的能寫業務邏輯,那就是真正的程序員革命,公司也不需要招這么多程序員了,這與前2年掛羊頭狗肉的低代碼有本質區別,意味著AI可能真的要來臨了!

山重水復疑無路,柳暗花明又一村

十年前我剛加入這一行的時候,就聽過35歲危機,當時大家對這種觀點更多的是一種自嘲。時過境遷再回首人已中年。不過借用一句古話,天踏下來還有高個子頂著,就不要再散播焦慮,讓我們言歸正傳,看看常用的密碼算法吧

密碼學家的工具箱

章節名稱的由來

前面推薦了作為一本入門書的《圖解密碼技術_百度百科 》,里面提出了密碼學家的工具箱這個說法,也通過討論得到了下面這個圖:

常見的密碼算法

有一點要明確下來的就是所討論的加密算法最終目的,是為了解決信息安全所面臨的問題:

機密性

我們為了保證信息的機密性,也就是不讓別人看到信息或者看到了也"看不懂"所以引入了加密的這種方法,而出于安全性與性能的區別,又有很多不同的加密算法。其中最常見的就是對稱加密!

對稱加密算法
對稱加密基本概念

對稱加密是指加密和解密使用相同密鑰的加密算法。發送方使用密鑰將明文加密成密文,接收方使用相同的密鑰將密文解密回明文。對稱加密算法通常計算效率高,適合大量數據的加密。

加密過程

解密過程

DES

先來看看DES算法:

DES全稱為Data Encryption Standard,即數據加密標準,是一種使用密鑰加密的塊算法,1977年被美國聯邦政府的國家標準局確定為聯邦資料處理標準(FIPS),并授權在非密級政府通信中使用,隨后該算法在國際上廣泛流傳開來。需要注意的是,在某些文獻中,作為算法的DES稱為數據加密算法(Data Encryption Algorithm,DEA),已與作為標準的DES區分開來。

----------------------引自百度百科DES

它出現的時期比較早,由于現在計算機技術的發展已不再推薦使用,因為可以被暴力破解了。它的加密過程如下:

圖片來源《圖解密碼技術_百度百科?》

?看一個用JAVA生成的例子:

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;public class DESExample {private static final String ALGORITHM = "DES";public static String encrypt(String key, String value) throws Exception {// DES需要8字節的密鑰if (key.length() < 8) {throw new IllegalArgumentException("Key must be at least 8 characters for DES");}SecretKeySpec secretKey = new SecretKeySpec(key.substring(0, 8).getBytes("UTF-8"), ALGORITHM);Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE, secretKey);byte[] encryptedBytes = cipher.doFinal(value.getBytes());return Base64.getEncoder().encodeToString(encryptedBytes);}public static String decrypt(String key, String encryptedValue) throws Exception {SecretKeySpec secretKey = new SecretKeySpec(key.substring(0, 8).getBytes("UTF-8"), ALGORITHM);Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, secretKey);byte[] decodedBytes = Base64.getDecoder().decode(encryptedValue);byte[] decryptedBytes = cipher.doFinal(decodedBytes);return new String(decryptedBytes);}public static void main(String[] args) {try {String key = "mySecret"; // 8字節的密鑰String original = "Hello, World!";String encrypted = encrypt(key, original);System.out.println("Encrypted: " + encrypted);String decrypted = decrypt(key, encrypted);System.out.println("Decrypted: " + decrypted);} catch (Exception e) {e.printStackTrace();}}
}

上面的示例代碼可以完整的展現DES的加解密過程,但是要強調幾點:

  • DES 已被 NIST 淘汰(2005 年),切勿用于新項目
  • 密鑰為什么需要 8 字節?DES 算法要求密鑰必須是 8 字節(64 位)(實際有效密鑰為 56 位,8 位用于奇偶校驗)
3DES

接著看看看看3DES算法:

3DES(即Triple DES)是DES向AES過渡的加密算法,它使用3條56位的密鑰對數據進行三次加密。是DES的一個更安全的變形。它以DES為基本模塊,通過組合分組方法設計出分組加密算法。比起最初的DES,3DES更為安全。

現在由于DES已經可以在限時的時間內破解,因此三重DES就是開發出來替代DES的一種分組密碼。它的加密過程如下:

圖片來源《圖解密碼技術_百度百科?》

看一個用JAVA生成的例子:?

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;public class TripleDESExample {private static final String ALGORITHM = "DESede";public static String encrypt(String key, String value) throws Exception {// 3DES需要24字節的密鑰if (key.length() < 24) {throw new IllegalArgumentException("Key must be at least 24 characters for 3DES");}SecretKeySpec secretKey = new SecretKeySpec(key.substring(0, 24).getBytes("UTF-8"), ALGORITHM);Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE, secretKey);byte[] encryptedBytes = cipher.doFinal(value.getBytes());return Base64.getEncoder().encodeToString(encryptedBytes);}public static String decrypt(String key, String encryptedValue) throws Exception {SecretKeySpec secretKey = new SecretKeySpec(key.substring(0, 24).getBytes("UTF-8"), ALGORITHM);Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, secretKey);byte[] decodedBytes = Base64.getDecoder().decode(encryptedValue);byte[] decryptedBytes = cipher.doFinal(decodedBytes);return new String(decryptedBytes);}public static void main(String[] args) {try {String key = "mySecretKey12345678901234"; // 24字節的密鑰String original = "Hello, World!";String encrypted = encrypt(key, original);System.out.println("Encrypted: " + encrypted);String decrypted = decrypt(key, encrypted);System.out.println("Decrypted: " + decrypted);} catch (Exception e) {e.printStackTrace();}}
}
AES

接著看看AES算法:

密碼學中的高級加密標準(Advanced Encryption Standard,AES),又稱Rijndael加密法,是美國聯邦政府采用的一種區塊加密標準。

這個標準用來替代原先的DES(Data Encryption Standard),已經被多方分析且廣為全世界所使用。經過五年的甄選流程,高級加密標準由美國國家標準與技術研究院 (NIST)于2001年11月26日發布于FIPS PUB 197,并在2002年5月26日成為有效的標準。2006年,高級加密標準已然成為對稱密鑰加密中最流行的算法之一

?----------------------引自百度百科AES

由于AES的設計目標就是要解決DES的安全性的問題,所以在沒有特殊的要求場景(比如舊程序兼容性問題)都建議使用AES。它的加密過程如下:

圖解密碼技術_百度百科

看一個用JAVA生成的例子:?

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;
import java.util.Base64;public class AESUtil {private static final String ALGORITHM = "AES";private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding";private static final int IV_SIZE = 16; // 128位IV/*** AES加密(使用CBC模式)*/public static String encrypt(String key, String value) throws Exception {// 生成隨機IVbyte[] iv = new byte[IV_SIZE];new SecureRandom().nextBytes(iv);SecretKeySpec secretKey = new SecretKeySpec(key.getBytes("UTF-8"), ALGORITHM);IvParameterSpec ivSpec = new IvParameterSpec(iv);Cipher cipher = Cipher.getInstance(TRANSFORMATION);cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);byte[] encrypted = cipher.doFinal(value.getBytes());// 將IV和加密數據合并byte[] encryptedIVAndText = new byte[iv.length + encrypted.length];System.arraycopy(iv, 0, encryptedIVAndText, 0, iv.length);System.arraycopy(encrypted, 0, encryptedIVAndText, iv.length, encrypted.length);return Base64.getEncoder().encodeToString(encryptedIVAndText);}/*** AES解密*/public static String decrypt(String key, String encryptedValue) throws Exception {byte[] ivAndEncrypted = Base64.getDecoder().decode(encryptedValue);// 提取IVbyte[] iv = new byte[IV_SIZE];System.arraycopy(ivAndEncrypted, 0, iv, 0, iv.length);// 提取加密數據byte[] encrypted = new byte[ivAndEncrypted.length - IV_SIZE];System.arraycopy(ivAndEncrypted, IV_SIZE, encrypted, 0, encrypted.length);SecretKeySpec secretKey = new SecretKeySpec(key.getBytes("UTF-8"), ALGORITHM);IvParameterSpec ivSpec = new IvParameterSpec(iv);Cipher cipher = Cipher.getInstance(TRANSFORMATION);cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec);byte[] decrypted = cipher.doFinal(encrypted);return new String(decrypted);}public static void main(String[] args) {try {String key = "MySecretKey12345"; // 16字節用于AES-128String original = "敏感數據需要加密";String encrypted = encrypt(key, original);System.out.println("加密結果: " + encrypted);String decrypted = decrypt(key, encrypted);System.out.println("解密結果: " + decrypted);} catch (Exception e) {e.printStackTrace();}}
}
SM4

    SM4(原名SMS4)是中國國家密碼管理局發布的商用密碼算法標準(GB/T 37033-2018),屬于對稱分組密碼算法。其分組長度和密鑰長度均為128位,與AES(Advanced Encryption Standard)類似,但屬于中國自主知識產權的加密算法。以下是SM4的基本原理及Java實現的詳細說明。

    SM4屬于國密范疇,它有其自身的特點,尤其是在信創的大背景下,使得它的應用會越來越廣泛:

    一、SM4算法概述

    1. 分組長度:128位(16字節)
    2. 密鑰長度:128位(16字節)
    3. 加密輪數:32輪
    4. 工作模式:支持ECB(電子密碼本)、CBC(密碼塊鏈接)、CFB(反饋模式)、OFB(輸出反饋模式)等。
    5. 應用場景:適用于需要國密合規的場景,如金融、政務、物聯網等。

    Java標準庫(JCE)默認不支持SM4,需通過第三方庫(如?Bouncy Castle)實現。

    <dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.70</version> <!-- 使用最新版本 -->
    </dependency>

    看一個用JAVA生成的例子:?

    import org.bouncycastle.jce.provider.BouncyCastleProvider;
    import javax.crypto.Cipher;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.SecretKeySpec;
    import java.security.Security;public class SM4Example {static {// 注冊Bouncy Castle提供者Security.addProvider(new BouncyCastleProvider());}// SM4加密public static byte[] encrypt(byte[] data, byte[] key) throws Exception {SecretKey secretKey = new SecretKeySpec(key, "SM4");Cipher cipher = Cipher.getInstance("SM4/ECB/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE, secretKey);return cipher.doFinal(data);}// SM4解密public static byte[] decrypt(byte[] cipherText, byte[] key) throws Exception {SecretKey secretKey = new SecretKeySpec(key, "SM4");Cipher cipher = Cipher.getInstance("SM4/ECB/PKCS5Padding");cipher.init(Cipher.DECRYPT_MODE, secretKey);return cipher.doFinal(cipherText);}public static void main(String[] args) throws Exception {String plainText = "Hello, SM4!";byte[] key = "1234567890abcdef".getBytes(); // 16字節密鑰// 加密byte[] encrypted = encrypt(plainText.getBytes(), key);System.out.println("加密結果(Base64): " + java.util.Base64.getEncoder().encodeToString(encrypted));// 解密byte[] decrypted = decrypt(encrypted, key);System.out.println("解密結果: " + new String(decrypted));}
    }
    
    分析對比

    上面介紹了幾種常用、主流的算法,下面表格列出了相應的特點:

    算法密鑰長度塊大小狀態特點
    DES56位64位已淘汰早期標準,易被暴力破解
    3DES112/168位64位逐漸淘汰DES的三重應用,安全性提高但效率低
    AES128/192/256位128位推薦使用目前最廣泛使用的標準,安全高效
    SM4128位128位推薦使用適用于需要國密合規的場景,如金融、政務等

    除此以外還一些不是很常用的算法:

    Blowfish32-448位64位可用速度快,但塊大小較小
    RC440-2048位流密碼不推薦曾廣泛使用,現發現多處漏洞

    這里就不展開了,有興趣的可以直接鏈接查看。

    還有一個值得關注的算法是Gooble開發的ChaCha20:

    ChaCha20-Poly1305是Google所采用的一種新式加密算法,性能強大,在CPU為精簡指令集的ARM平臺上尤為顯著(ARM v8前效果較明顯),在同等配置的手機中表現是AES的4倍(ARM v8之后加入了AES指令,所以在這些平臺上的設備,AES方式反而比chacha20-Poly1305方式更快,性能更好),可減少加密解密所產生的數據量進而可以改善用戶體驗,減少等待時間,節省電池壽命等。

    ChaCha20-Poly1305是由ChaCha20流密碼和Poly1305消息認證碼(MAC)結合的一種應用在互聯網安全協議中的認證加密算法,由Google公司率先在Andriod移動平臺中的Chrome中代替RC4使用。

    由于其算法精簡、安全性強、兼容性強等特點,目前Google致力于全面將其在移動端推廣

    模式介紹

    從上面的對比討論可以看出,現在推薦的加密算法要么是AES、要么是SM4這兩種。它們的代碼也極其類似:

    // AES
    private static final String ALGORITHM = "AES";private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding";private static final int IV_SIZE = 16; // 128位IVSecretKey secretKey = new SecretKeySpec(key.getBytes("UTF-8"), ALGORITHM);IvParameterSpec ivSpec = new IvParameterSpec(iv);Cipher cipher = Cipher.getInstance(TRANSFORMATION);cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);
    // SM4
    SecretKey secretKey = new SecretKeySpec(key, "SM4");Cipher cipher = Cipher.getInstance("SM4/ECB/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE, secretKey);

    這里的格式:AES/CBC/PKCS5Padding是指定算法的參數格式,表示為

    算法/工作模式/填充模式
    工作模式
    圖片來源《圖解密碼技術_百度百科?》

    這里列個表格來對比看看:

    模式全稱特點安全性推薦使用
    ECBElectronic Codebook相同明文→相同密文? 極不安全絕不使用
    CBCCipher Block Chaining需要IV,錯誤傳播?? 需謹慎實現傳統系統可用
    CTRCounter類似流密碼,可并行? 良好適合流式處理
    GCMGalois/Counter Mode認證加密,帶完整性? 最佳現代系統首選
    寫在最后

    關于數據安全雖然整理了好幾篇文章。不過說實話,我覺得對于算法還是沒有入門,最多是使用上初窺門徑(嘗試看了一下算法源碼,就是看不懂。。。),所以建議大家有興趣還是先看看作為一本入門書的《圖解密碼技術_百度百科?》雖然看了第2遍了,還是常看常新!

    至于非對稱算法,我們下篇文章再來仔細討論

    附錄:JCA與JCE關系

    ?因為它們底層都是使用的同一個加密算法框架Java Cryptography Architecture (JCA)?:

    JCA是Java平臺的加密體系基礎架構,它是一個框架性設計而非具體實現:

    • 本質:一套服務提供者接口(SPI)和應用程序接口(API)的集合
    • 核心包java.securityjava.security.certjava.security.interfaces
    • 設計目標
      • 提供統一的加密服務訪問方式
      • 支持算法獨立性(應用程序不依賴特定算法)
      • 支持Provider機制(可插拔的加密實現)
      • 遵循"一次編寫,到處運行"的Java原則

    而它對應的代碼就在jce.jar包里面,是對jca的擴展:

    JCE是JCA的官方擴展,專注于提供對稱加密、非對稱加密和密鑰協商功能:

    • 本質:JCA框架的擴展規范
    • 核心包javax.cryptojavax.crypto.interfacesjavax.crypto.spec
    • 關鍵類CipherKeyGeneratorSecretKeyFactoryMac

    3. jce.jar

    jce.jar是JCE規范的具體實現文件

    • 位置$JAVA_HOME/jre/lib/jce.jar
    • 內容:SunJCE Provider的實現代碼
    • 作用:提供JCE API的具體算法實現
    • 歷史:最初是獨立下載的擴展包,現已成為標準JDK的一部分

    詳細關系解析

    JCA是基礎架構,JCE是其擴展

    • JCA:提供基礎加密服務框架,包括:

      • 消息摘要(MD5, SHA)
      • 數字簽名(DSA, RSA)
      • 密鑰生成(KeyPairGenerator)
      • 安全隨機數生成(SecureRandom)
    • JCE:在JCA基礎上擴展了:

      • 對稱加密(AES, DES, 3DES)
      • 非對稱加密(RSA加密/解密)
      • 密鑰協商(Diffie-Hellman)
      • 消息認證碼(HMAC)

    關鍵區別:JCA主要關注"驗證"(如數字簽名),而JCE關注"保密"(如數據加密)

    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/diannao/96212.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/diannao/96212.shtml
    英文地址,請注明出處:http://en.pswp.cn/diannao/96212.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    云計算學習100天-第26天

    地址重寫地址重寫語法——關于Nginx服務器的地址重寫&#xff0c;主要用到的配置參數是rewrite 語法格式&#xff1a; rewrite regex replacement flag rewrite 舊地址 新地址 [選項]地址重寫步驟&#xff1a;#修改配置文件(訪問a.html重定向到b.html) cd /usr/local/ngin…

    【Python辦公】字符分割拼接工具(GUI工具)

    目錄 專欄導讀 項目簡介 功能特性 ?? 核心功能 1. 字符分割功能 2. 字符拼接功能 ?? 界面特性 現代化設計 用戶體驗優化 技術實現 開發環境 核心代碼結構 關鍵技術點 使用指南 安裝步驟 完整代碼 字符分割操作 字符拼接操作 應用場景 數據處理 文本編輯 開發輔助 項目優勢 …

    Windows 命令行:dir 命令

    專欄導航 上一篇&#xff1a;Windows 命令行&#xff1a;Exit 命令 回到目錄 下一篇&#xff1a;MFC 第一章概述 本節前言 學習本節知識&#xff0c;需要你首先懂得如何打開一個命令行界面&#xff0c;也就是命令提示符界面。鏈接如下。 參考課節&#xff1a;Windows 命令…

    軟考高級--系統架構設計師--案例分析真題解析

    提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄前言試題一 軟件架構設計一、2019年 案例分析二、2020年 案例分析三、2021年 案例分析四、2022年 案例分析試題二 軟件系統設計一、2019年 案例分析二、2020年 案例分…

    css中的性能優化之content-visibility: auto

    content-visibility: auto的核心機制是讓瀏覽器智能跳過屏幕外元素的渲染工作&#xff0c;包括布局和繪制&#xff0c;直到它們接近視口時才渲染。這與虛擬滾動等傳統方案相比優勢明顯&#xff0c;只需要一行CSS就能實現近似效果。值得注意的是必須配合contain-intrinsic-size屬…

    通過uniapp將vite vue3項目打包為android系統的.apk包,并實現可自動升級功能

    打包vue項目,注意vite.config.ts文件和路由文件設置 vite.config.ts,將base等配置改為./ import {fileURLToPath, URL } from node:urlimport {defineConfig } from vite import vue from @vitejs/plugin-vue import AutoImport from unplugin-auto-import/vite import Com…

    經營幫租賃經營板塊:解鎖資產運營新生態,賦能企業增長新引擎

    在商業浪潮奔涌向前的當下&#xff0c;企業資產運營與租賃管理的模式不斷迭代&#xff0c;“經營幫” 以其租賃經營板塊為支點&#xff0c;構建起涵蓋多元業務場景、適配不同需求的生態體系&#xff0c;成為眾多企業破局資產低效困局、挖掘增長新動能的關鍵助力。本文將深度拆解…

    C語言---編譯的最小單位---令牌(Token)

    文章目錄C語言中令牌幾類令牌是編譯器理解源代碼的最小功能單元&#xff0c;是編譯過程的第一步。C語言中令牌幾類 1、關鍵字&#xff1a; 具有固定含義的保留字&#xff0c;如 int, if, for, while, return 等。 2、標識符&#xff1a; 由程序員定義的名稱&#xff0c;用于變…

    機器學習 | Python中進行特征重要性分析的9個常用方法

    在Python中,特征重要性分析是機器學習模型解釋和特征選擇的關鍵步驟。以下是9種常用方法及其實現示例: 1. 基于樹的模型內置特征重要性 原理:樹模型(如隨機森林、XGBoost)根據特征分裂時的純度提升(基尼不純度/信息增益)計算重要性。 from sklearn.ensemble import Ra…

    心路歷程-了解網絡相關知識

    在做這個題材的時候&#xff0c;考慮的一個點就是&#xff1a;自己的最初的想法&#xff1b;可是技術是不斷更新的&#xff1b; 以前的材料會落后&#xff0c;但是萬變不能變其中&#xff1b;所以呈現出來的知識點也相對比較老舊&#xff0c;為什么呢&#xff1f; 因為最新的素…

    CAT1+mqtt

    文章目錄 MQTT知識點mqtt數據固定報頭可變報頭(連接請求)有效載荷 阿里云MQTT測試訂閱Topic下發數據給MQTT.fxMQTT.fx 發布消息給服務器 下載mqtt(C-嵌入式版)我的W5500項目路徑使用Cat1連接阿里云平臺AT指令串口連接1. 開機聯網2. 激活內置SIM卡(貼片卡)3. 我這里使用連接的是…

    AiPPT怎么樣?好用嗎?

    AiPPT怎么樣&#xff1f;好用嗎&#xff1f;AiPPT 是一款智能高效的PPT生成工具&#xff0c;通過AI技術快速將主題或文檔&#xff08;如Word/PDF&#xff09;轉化為專業PPT&#xff0c;提供超10萬套行業模板&#xff0c;覆蓋商務、教育等22場景&#xff0c;支持一鍵生成大綱、文…

    惡補DSP:2.F28335的定時器系統

    一、定時器原理F28335 城市的三座時鐘塔&#xff08;Timer0、Timer1、Timer2&#xff09;是城市時間管理的核心設施&#xff0c;每座均為32位精度&#xff0c;依靠城市能源脈沖&#xff08;系統時鐘 SYSCLKOUT&#xff0c;典型頻率為150 MHz&#xff09;驅動。它們由兩個核心模…

    用倒計時軟件為考研備考精準導航 復習 模擬考試 日期倒計時都可以用

    考研&#xff0c;是一場與時間的博弈。從決定報名的那一刻起&#xff0c;日歷上的每一個數字都被賦予了特殊意義 —— 報名截止日、現場確認期、初試倒計時、成績查詢點…… 這些節點如同航標&#xff0c;指引著備考者的方向。而在這場漫長的征途里&#xff0c;一款精準、易用的…

    React學習(七)

    目錄&#xff1a;1.react-進階-antd-搜索2.react-進階-antd-依賴項說明 3.react-進階-antd-刪除1.react-進階-antd-搜索我們jsx代碼里只能返回一個最頂層的根元素下拉框簡化寫法&#xff1a;把這個對象結構賦值一下&#xff1a;清空定義個參數類型做修改事件需要定義三個…

    Unix Domain Socket(UDS)和 TCP/IP(使用 127.0.0.1)進程間通信(IPC)的比較

    Unix Domain Socket&#xff08;UDS&#xff09;和 TCP/IP&#xff08;使用 127.0.0.1 或 localhost&#xff09;都是進程間通信&#xff08;IPC&#xff09;的方式&#xff0c;但它們在實現、性能和適用場景上有顯著區別。以下是兩者的對比&#xff1a;1. 通信機制Unix Domain…

    SQL中對時間操作的函數

    以下是SQL中常用時間操作函數的匯總&#xff0c;按功能分類整理&#xff0c;結合多個權威來源內容綜合而成&#xff1a; 一、獲取當前時間 函數名稱功能說明示例適用數據庫CURDATE()獲取當前日期&#xff08;不含時間&#xff09;SELECT CURDATE(); → 2024-08-21MySQL, Mari…

    NUS PC5215 Lecture分析 Week1 Python基礎

    NUS PC5215 Lecture分析 Week1 Python基礎前言Python基礎數據類型保留字表達式Import 相關庫IEEE浮點數前言 課程網站 作為一名計算機本科畢業的學生&#xff0c;該課程有點類似于本科期間學的數值分析的進化版&#xff0c;大抵是教會你如何實現各種方法&#xff0c;諸如蒙特卡…

    模型私有化部署(Ollama vLLM LMDeploy)

    一、魔塔社區平臺介紹 1.1 什么是魔塔社區&#xff1f; 魔塔&#xff08;ModelScope&#xff09;是由阿里巴巴達摩院推出的開源模型即服務&#xff08;MaaS&#xff09;共享平臺&#xff0c;匯聚了計算機視覺、自然語言處理、語音等多領域的數千個預訓練AI模型。其核心理念是…

    C++編程實踐--資源管理、標準庫、并發與并行

    文章目錄 資源管理 資源訪問 指向資源句柄或描述符的變量,在資源釋放后立即賦予新值 lambda函數 當lambda會逃逸出函數外面時,禁止按引用捕獲局部變量 避免lambda表達式使用默認捕獲模式 資源分配與回收 避免出現delete this操作 使用恰當的方式處理new操作符的內存分配錯誤 …