Windows C/C++ 加密解密實戰
內容描述
本書詳解Windows加解密算法的原理及其實現技術,內容安排首先從各大主流加解密算法的原理入手,然後用C/C++語言自主實現這些算法,最後從C/C++提供的主流加解密框架和函數庫入手講解其使用方法。 本書分為14章,內容包括密碼學概述、搭建C和C++密碼開發環境、對稱密碼算法、雜湊函數和HMAC、密碼學中常見的編碼格式、非對稱算法RSA的加解密、數字簽名技術、橢圓曲線密碼體制ECC、CSP和CryptoAPI、身份認證和PKI理論基礎、實戰PKI、SSL-TLS編程、SM2算法的數學基礎、SM2算法的實現。 本書適合用於C/C++初中級開發人員自學密碼開發技術,也適合高等院校和培訓機構相關專業的師生教學參考。
目錄大綱
目 錄
1章 密碼學概述 1
1.1 瑪麗女王的密碼 1
1.2 密碼學簡史 5
1.3 密碼學的基本概念 7
1.3.1 基本概念 7
1.3.2 密碼學要解決的5大問題 7
1.3.3 密碼學中的五元組 8
1.3.4 加解密算法的分類 8
2章 搭建C和C++密碼開發環境 9
2.1 密碼編程的兩個重要的國際庫 9
2.2 C/C++密碼庫OpenSSL 9
2.2.1 OpenSSL源代碼模塊結構10
2.2.2 OpenSSL加密庫調用方式10
2.2.3 OpenSSL支持的對稱加密算法11
2.2.4 OpenSSL支持的非對稱加密算法11
2.2.5 OpenSSL支持的信息摘要算法12
2.2.6 OpenSSL密鑰和證書管理12
2.2.7 面向對象與OpenSSL 12
2.2.8 BIO接口14
2.2.9 EVP接口15
2.2.10 關於版本和作系統16
2.2.11 在Windows下編譯OpenSSL 1.1.1 16
2.2.12 在Windows下編譯OpenSSL 1.0.2m 30
2.2.13 在Linu下編譯安裝OpenSSL 1.0.2 38
2.2.14 測試使用openssl命令47
2.3 純C++密碼開發Crypto++庫49
2.3.1 Crypto++的編譯50
2.3.2 使用Cypto++進行AES加解密50
2.4 國產密碼開發庫GmSSL 52
2.4.1 GmSSL的特點52
2.4.2 GmSSL的一些歷史52
2.4.3 什麼是國密算法53
2.4.4 GmSSL的下載53
2.4.5 在Windows下編譯安裝GmSSL 54
2.4.6 在Linu下編譯安裝GmSSL 57
2.4.7 默認編譯安裝GmSSL 61
2.4.8 在老版本的Linu下編譯安裝GmSSL 64
3章 對稱密碼算法68
3.1 基本概念68
3.2 對稱加解密算法的分類69
3.3 流加密算法69
3.3.1 基本概念69
3.3.2 流密碼和分組密碼的比較70
3.3.3 RC4算法71
3.4 分組加密算法81
3.4.1 工作模式81
3.4.2 短塊加密85
3.4.3 DES和3DES算法86
3.4.4 SM4算法104
3.5 利用OpenSSL進行對稱加解密120
3.5.1 基本概念120
3.5.2 對稱加解密相關函數121
4章 雜湊函數和HMAC 131
4.1 雜湊函數概述131
4.1.1 什麼是雜湊函數131
4.1.2 密碼學和雜湊函數131
4.1.3 雜湊函數的發展132
4.1.4 雜湊函數的設計132
4.1.5 雜湊函數的分類133
4.1.6 雜湊函數的碰撞133
4.2 SM3雜湊算法134
4.2.1 常量和函數134
4.2.2 填充135
4.2.3 迭代壓縮135
4.2.4 雜湊值136
4.2.5 一段式SM3算法的實現137
4.2.6 三段式SM3雜湊的實現141
4.2.7 OpenSSL實現SM3算法151
4.3 HMAC 155
4.3.1 什麼是HMAC 155
4.3.2 產生背景155
4.3.3 設計目標156
4.3.4 算法描述156
4.3.5 獨立自主實現HMAC-SM3 157
4.4 SHA系列雜湊算法160
4.4.1 SHA算法概述160
4.4.2 SHA的發展史161
4.4.3 SHA系列算法的核心思想和特點161
4.4.4 單向性161
4.4.5 主要用途161
4.4.6 SHA256算法原理解析161
4.4.7 SHA384和SHA512算法177
4.5 更通用的基於OpenSSL的哈希運算204
4.5.1 獲取摘要算法函數EVP_get_digestbyname 205
4.5.2 創建結構體並初始化函數EVP_MD_CTX_create 205
4.5.3 銷毀摘要上下文結構體EVP_MD_CTX_destroy 206
4.5.4 摘要初始化函數EVP_DigestInit_e 206
4.5.5 摘要更新函數EVP_DigestUpdate 206
4.5.6 摘要結束函數EVP_Digest_Final_e 207
4.5.7 單包摘要計算函數EVP_Digest 207
5章 密碼學中常見的編碼格式210
5.1 Base64編碼210
5.1.1 Base64編碼的由來210
5.1.2 Base64的索引表210
5.1.3 Base64的轉化原理211
5.1.4 使用OpenSSL的base64命令213
5.1.5 編程實現Base64編解碼214
5.2 PEM文件217
5.2.1 什麼是PEM文件217
5.2.2 生成一個PEM文件219
5.3 ASN.1和BER、DER 220
5.3.1 ASN.1的歷史220
5.3.2 ASN.1的基本概念221
5.3.3 ASN.1和ASN.1編碼規則在OSI中的應用222
5.3.4 電子商務中ASN.1和DER編碼的應用223
5.3.5 ASN的優點223
5.3.6 ASN.1的文法描述224
5.3.7 編碼規則225
5.3.8 ASN.1實例232
6章 非對稱算法RSA的加解密236
6.1 非對稱密碼體制概述236
6.2 RSA概述237
6.3 RSA的數學基礎238
6.3.1 素數(質數) 238
6.3.2 素性檢測239
6.3.3 倍數239
6.3.4 約數239
6.3.5 互質數239
6.3.6 質因數240
6.3.7 強素數240
6.3.8 因子240
6.3.9 模運算240
6.3.10 模運算的作與性質241
6.3.11 單向函數241
6.3.12 費馬定理和歐拉定理243
6.3.13 冪243
6.3.14 模冪運算243
6.3.15 同餘符號“≡” 243
6.3.16 歐拉函數244
6.3.17 大公約數244
6.3.18 歐幾里得算法244
6.3.19 擴展歐幾里得算法246
6.4 RSA算法描述254
6.5 RSA算法實例256
6.5.1 查找法計算私鑰d 256
6.5.2 簡便法計算私鑰d 259
6.5.3 擴展歐幾里得算法計算私鑰d 260
6.5.4 加密字母261
6.5.5 分組加密字符串262
6.6 熟悉PKCS#1 266
6.6.1 PKCS#1填充267
6.6.2 PKCS#1中的 RSA私鑰語法271
6.7 在OpenSSL命令中使用RSA 272
6.7.1 生成RSA公私鑰272
6.7.2 提取私鑰各參數273
6.7.3 RSA公鑰加密一個文件275
6.7.4 RSA私鑰解密一個文件276
6.8 基於OpenSSL庫的RSA編程276
6.8.1 OpenSSL的RSA實現277
6.8.2 主要數據結構277
6.8.3 主要函數278
6.9 隨機大素數的生成287
6.10 RSA算法的攻擊及分析287
6.10.1 因子分解攻擊287
6.10.2 選擇密文攻擊287
6.10.3 公共模數攻擊288
6.10.4 小指數攻擊288
7章 數字簽名技術289
7.1 概述289
7.2 什麼是數字簽名技術291
7.2.1 簽名291
7.2.2 數字簽名的基本概念291
7.2.3 數字簽名的原理292
7.2.4 數字簽名的一般性定義292
7.2.5 數字簽名的分類293
7.2.6 數字簽名的安全性294
7.2.7 數字簽名的特徵與應用295
7.3 RSA公鑰算法在數字簽名中的應用295
7.4 使用OpenSSL命令進行簽名和驗簽296
7.5 基於OpenSSL的簽名驗簽編程298
7.5.1 直接使用RSA函數進行簽名驗簽298
7.5.2 使用EVP系列函數進行簽名驗簽304
8章 橢圓曲線密碼體制310
8.1 概述310
8.1.1 信息安全技術310
8.1.2 密碼體制311
8.1.3 橢圓曲線密碼體制311
8.1.4 為什麼使用橢圓曲線密碼體制313
8.2 背景基礎知識313
8.2.1 無窮遠點314
8.2.2 影平面坐標系314
8.2.3 域316
8.2.4 數域316
8.2.5 有限域316
8.2.6 素數域316
8.2.7 逆元317
8.3 橢圓曲線的定義318
8.4 密碼學中的橢圓曲線321
8.5 ECC算法體系326
8.5.1 有限域的模運算327
8.5.2 橢圓曲線上的點加和倍點運算328
8.5.3 標量乘運算333
8.5.4 數據加解密算法336
9章 CSP和CryptoAPI 350
9.1 什麼是CSP 350
9.2 CryptoAPI簡介350
9.3 CSP服務體系351
9.4 CSP的組成353
9.5 CryptoAPI體系結構353
9.6 CryptoAPI調用底層CSP服務方式354
9.7 CrpytoAPI的基本功能355
9.8 搭建CryptoAPI開發環境356
9.9 基本加密函數357
9.9.1 服務提供者函數358
9.9.2 密鑰的產生和交換函數363
9.9.3 編碼/解碼函數364
9.9.4 數據加密/解密函數364
9.9.5 哈希和數字簽名函數364
10章 身份認證和PKI理論基礎369
10.1 身份認證概述369
10.1.1 網絡安全與身份認證369
10.1.2 網絡環境下身份認證所面臨的威脅370
10.1.3 網絡身份認證體系的發展現狀371
10.2 身份認證技術基礎373
10.2.1 用戶名/密碼認證373
10.2.2 智能卡認證374
10.2.3 生物特徵認證374
10.2.4 動態口令374
10.2.5 USB Key認證375
10.2.6 基於衝擊響應的認證模式375
10.2.7 基於數字證書PKI的認證模式375
10.3 PKI概述376
10.3.1 PKI的國內外應用狀態376
10.3.2 PKI的應用前景377
10.3.3 PKI存在的問題及發展趨勢378
10.4 基於X.509證書的PKI認證體系380
10.4.1 數字證書380
10.4.2 數字信封383
10.4.3 PKI體系結構384
10.4.4 認證機構387
10.4.5 基於X.509證書的身份認證388
11章 實戰PKI 391
11.1 只有密碼算法是不夠的391
11.2 OpenSSL實現CA的搭建393
11.2.1 準備實驗環境393
11.2.2 熟悉CA環境394
11.2.3 創建所需要的文件396
11.2.4 CA 自簽名證書(構造根CA) 396
11.2.5 根CA為子CA頒發證書398
11.2.6 普通用戶向子CA申請證書401
11.3 基於OpenSSL的證書編程403
11.3.1 把DER編碼轉換為內部結構體函數d2i_X509 404
11.3.2 獲得證書版本函數X509_get_version 405
11.3.3 獲得證書序列號函數X509_get_serialNumber 405
11.3.4 獲得證書頒發者信息函數X509_get_issuer_name 405
11.3.5 獲得證書擁有者信息函數X509_get_subject_name 406
11.3.6 獲得證書有效期的起始日期函數X509_get_tBefore 406
11.3.7 獲得證書有效期的終止日期函數X509_get_tAfter 406
11.3.8 獲得證書公鑰函數X509_get_pubkey 406
11.3.9 創建證書存儲區上下文環境函數X509_STORE_CTX 407
11.3.10 釋放證書存儲區上下文環境函數X509_STORE_CTX_free 407
11.3.11 初始化證書存儲區上下文環境函數X509_STORE_CTX_init 407
11.3.12 驗證證書函數X509_verify_cert 407
11.3.13 創建證書存儲區函數X509_STORE_new 407
11.3.14 釋放證書存儲區函數X509_STORE_free 408
11.3.15 向證書存儲區添加證書函數X509_STORE_add_cert 408
11.3.16 向證書存儲區添加證書吊銷列表函數X509_STORE_add_crl 409
11.3.17 釋放X509結構體函數X509_free 409
11.4 證書編程實戰409
12章 SSL-TLS編程417
12.1 SSL協議規範417
12.1.1 什麼是SSL協議417
12.1.2 SSL協議的優點417
12.1.3 SSL協議的發展417
12.1.4 SSL v3/TLS提供的服務418
12.1.5 SSL協議層次結構模型419
12.1.6 SSL記錄層協議419
12.1.7 SSL握手協議層421
12.2 OpenSSL中的SSL編程424
12.3 SSL函數425
12.3.1 初始化SSL算法庫函數 SSL library_init 425
12.3.2 初始化SSL上下文環境變量函數 SSL_CTX_new 425
12.3.3 釋放SSL上下文環境變量函數SSL_CTX_free 426
12.3.4 文件形式設置SSL證書函數SSL_CTX _use_certificate_file 426
12.3.5 結構體方式設置SSL證書函數SSL_CTX_use_certificate 426
12.3.6 文件形式設置SSL私鑰函數SSL_CTX_use_PrivateKey_file 426
12.3.7 結構體方式設置SSL私鑰函數SSL_CTX_use_PrivateKey 427
12.3.8 檢查SSL私鑰和證書是否匹配函數SSL_CTX_check_private_key 427
12.3.9 創建SSL結構函數SSL_new 427
12.3.10 釋放SSL套接字結構體函數SSL_free 427
12.3.11 設置讀寫套接字函數SSL_set_fd 427
12.3.12 設置只讀套接字函數SSL_set_rfd 428
12.3.13 設置只寫套接字函數SSL_set_wfd 428
12.3.14 啟動TLS/SSL握手函數SSL_connect 428
12.3.15 接受SSL連接函數SSL_accept 428
12.3.16 獲取對方的X509證書函數SSL_get_peer_certificate 428
12.3.17 向TLS/SSL連接寫數據函數SSL_write 429
12.3.18 從TLS/SSL連接中讀取數據函數SSL_Read 429
12.4 準備SSL通信所需的證書429
12.4.1 準備實驗環境429
12.4.2 熟悉CA環境430
12.4.3 創建所需要的文件430
12.4.4 創建根CA的證書430
12.4.5 生成服務端的證書請求文件432
12.4.6 簽發出服務端證書432
12.4.7 生成客戶端的證書請求文件433
12.4.8 簽發客戶端證書434
12.5 實戰SSL網絡編程435
13章 SM2算法的數學基礎444
13.1 素域Fp 444
13.1.1 素域Fp的定義444
13.1.2 Fp上橢圓曲線的定義445
13.1.3 Fp上橢圓曲線的階447
13.2 二元擴域 447
13.2.1 二元擴域 的定義447
13.2.2 上橢圓曲線的定義451
13.2.3 上橢圓曲線的階453
13.3 橢圓曲線多倍點運算453
13.3.1 定義453
13.3.2 橢圓曲線多倍點運算的實現454
13.3.3 橢圓曲線多倍點運算複雜度估計455
13.4 求解橢圓曲線離散對數問題的方法456
13.4.1 橢圓曲線離散對數求解方法456
13.4.2 安全橢圓曲線滿足的條件457
13.5 橢圓曲線上點的壓縮458
13.5.1 定義458
13.5.2 Fp上橢圓曲線點的壓縮與解壓縮方法458
13.5.3 上橢圓曲線點的壓縮與解壓縮方法458
13.6 有限域和模運算459
13.6.1 有限域中的指數運算459
13.6.2 有限域中的逆運算459
13.6.3 Lucas序列的生成460
13.6.4 模素數平方根的求解460
13.6.5 跡函數和半跡函數461
13.6.6 上二次方程的求解461
13.6.7 整數模素數階的檢查462
13.6.8 整數模素數階的計算462
13.6.9 模素數的階為給定值的整數的構造463
13.6.10 概率素性檢測463
13.6.11 近似素性檢測464
13.7 橢圓曲線算法464
13.7.1 橢圓曲線階的計算464
13.7.2 橢圓曲線上點的尋找464
13.8 曲線示例465
作者介紹
朱晨冰,朱文偉的筆名,名校計算機專業統招碩士,20年C\C++、Java開發經驗。主導開發過密碼、圖形、人工智能等產品。
精通Linux、Windows系統開發及數據庫開發技術。
著有圖書《Windows C/C++加密解密實戰》《密碼學原理與Java實現》《Linux C與C++ 一線開發實踐》《Visual C++2017從入門到精通》。