密碼學原理與 Java 實現
內容描述
現在,Java開發可謂如日中天,並且Java安全開發是Java開發領域中的一個重要內容,每個Java開發人員都必須掌握。市面中的絕大多數密碼學書籍都是針對C或C++的,本書重點介紹Java自帶加解密函數的相關技術,以及密碼學領域重要的開源庫OpenSSL在Java開發中的應用。 本書共8章,主要內容包括密碼學和Java概述、搭建Java密碼開發環境、對稱密碼算法原理、利用JCA\JCE對稱加解密、雜湊函數和HMAC、密碼學中常見的編碼格式、非對稱算法RSA的加解密、數字簽名技術等。本書內容非常詳細,學習坡度非常平滑,循序漸進,就算沒有密碼學基礎,也能從零開始到全面掌握。 本書面向的讀者是Java開發人員、企業內轉行電腦信息安全的工作人員、已有信息安全基礎並想瞭解Java加解密新特性的人員。本書也可作為高等院校和培訓機構電腦及相關專業師生的教學參考書。
目錄大綱
目錄
第1章 加解密和Java概述 1
1.1 密碼學基礎知識 1
1.1.1 密碼學概述 1
1.1.2 對稱密鑰加密技術 2
1.1.3 公開密鑰加密技術 2
1.1.4 單向散列函數算法 3
1.1.5 數字簽名基礎知識 3
1.2 身份認證基礎知識 5
1.2.1 身份認證概述 5
1.2.2 身份認證的方式 5
1.3 Java語言概述 6
1.3.1 Java簡介 6
1.3.2 Java主要特性 7
1.3.3 Java的發展史 8
第2章 搭建Java密碼開發環境 10
2.1 搭建Java開發環境 10
2.1.1 下載JDK 10
2.1.2 安裝JDK 11
2.1.3 配置JDK環境變量 12
2.1.4 在命令行下編譯Java程序 13
2.1.5 在Eclipse中開發Java程序 14
2.1.6 下載Eclipse 14
2.1.7 啟動Eclipse 14
2.1.8 第一個Eclipse下的Java工程 15
2.1.9 在工作區中打開工程 18
2.2 搭建Java Web開發環境 18
2.2.1 下載Tomcat 18
2.2.2 安裝Tomcat 19
2.2.3 在Eclipse中配置Tomcat 20
2.2.4 第一個Eclipse下的JSP工程 21
2.2.5 第一個JavaBean工程 25
2.3 使用JNI 30
2.4 Java密碼開發的兩個主流國際庫 35
2.5 準備密碼庫OpenSSL 36
2.5.1 OpenSSL源代碼模塊結構 36
2.5.2 OpenSSL加密庫調用方式 37
2.5.3 OpenSSL支持的對稱加密算法 38
2.5.4 OpenSSL支持的非對稱加密算法 38
2.5.5 OpenSSL支持的信息摘要算法 38
2.5.6 OpenSSL密鑰和證書管理 38
2.5.7 面向對象與OpenSSL 39
2.5.8 BIO接口 40
2.5.9 EVP接口 41
2.5.10 關於版本和操作系統 42
2.5.11 在Windows下編譯OpenSSL1.1.1 42
2.5.12 在Windows下編譯OpenSSL1.0.2m 54
2.5.13 測試使用OpenSSL命令 62
2.6 在Java下使用OpenSSL 64
2.6.1 以命令方式使用OpenSSL 64
2.6.2 以函數庫方式調用OpenSSL 67
2.7 純Java密碼開發庫 72
2.7.1 JCA的基本概念 73
2.7.2 JCA的設計原則 74
2.7.3 JCA中的密碼服務提供者 74
2.7.4 JCA編程的兩大安全包 76
2.7.5 包java.security中的接口和類 77
2.7.6 包javax.crypto中的接口和類 83
2.7.7 第一個JCA例子 84
第3章 對稱密碼算法原理 89
3.1 基本概念 89
3.2 對稱加解密算法的分類 90
3.3 流加密算法 90
3.3.1 基本概念 90
3.3.2 流密碼和分組密碼的比較 91
3.3.3 RC4算法 91
3.4 分組加密算法 95
3.4.1 工作模式 95
3.4.2 短塊加密 99
3.4.3 DES和3DES算法 100
3.4.4 SM4算法 118
第4章 利用JCA/JCE對稱加解密 139
4.1 包java.security 140
4.1.1 密鑰接口 140
4.1.2 安全隨機數 141
4.2 包javax.crypto 150
4.2.1 安全密鑰接口SecretKey 151
4.2.2 密鑰生成類KeyGenerator 151
4.2.3 密鑰規範類SecretKeySpec 155
4.2.4 初始向量類IvParameterSpec 156
4.2.5 加解密類Cipher 157
4.2.6 利用JCA實現DES加密 160
第5章 雜湊函數和HMAC 181
5.1 雜湊函數概述 181
5.1.1 什麽是雜湊函數 181
5.1.2 密碼學和雜湊函數概述 182
5.1.3 雜湊函數的發展 182
5.1.4 雜湊函數的設計 183
5.1.5 雜湊函數的分類 183
5.1.6 雜湊函數的碰撞 183
5.2 SM3雜湊算法 184
5.2.1 SM3算法概述 184
5.2.2 SM3算法的特點 184
5.2.3 常量和函數 184
5.2.4 填充 185
5.2.5 迭代壓縮 185
5.2.6 雜湊值 186
5.2.7 一段式SM3算法的實現 187
5.2.8 三段式SM3雜湊的實現 194
5.2.9 Java和OpenSSL1.1.1b聯合實現SM3算法 198
5.3 MD5消息摘要算法 201
5.3.1 MD5算法概述 202
5.3.2 MD5算法的特點 202
5.3.3 MD5是否屬於加密算法 202
5.3.4 MD5用途 202
5.3.5 MD5算法原理 203
5.3.6 手工實現MD5算法 204
5.3.7 基於Java消息摘要類實現MD5算法 211
5.4 HMAC 213
5.4.1 什麽是HMAC 213
5.4.2 HMAC產生的背景 214
5.4.3 HMAC在身份認證中的應用 214
5.4.4 設計目標 215
5.4.5 算法描述 215
5.4.6 手工實現HMAC-MD5 216
5.4.7 基於Java Mac類實現HMAC-MD5 219
5.4.8 實現HMAC-SM3 222
5.5 更通用的基於OpensSSL的哈希運算 226
5.6 SHA系列雜湊算法 232
5.6.1 SHA算法概述 232
5.6.2 SHA系列算法核心思想和特點 233
5.6.3 SHA256算法原理解析 233
5.6.4 SHA256算法核心思想 235
5.6.5 SHA256算法的實現 240
第6章 密碼學中常見的編碼格式 249
6.1 Base64編碼 249
6.1.1 概述 249
6.1.2 Base64編碼的由來 249
6.1.3 Base64的索引表 249
6.1.4 Base64的轉化原理 250
6.1.5 使用OpenSSL的base64命令 252
6.1.6 Java編程實現Base64編解碼 253
6.2 PEM文件 258
6.2.1 什麽是PEM文件 258
6.2.2 生成一個PEM文件 260
6.3 ASN.1及其編解碼 261
6.3.1 ASN.1的基本概念 261
6.3.2 ASN.1的編碼格式 262
6.3.3 ASN的優點 262
6.3.4 基本語法規則 263
6.3.5 ASN.1數據類型 263
6.3.6 ASN.1實例 266
第7章 非對稱算法RSA的加解密 274
7.1 非對稱密碼體制概述 274
7.2 RSA概述 276
7.3 RSA的數學基礎 276
7.3.1 素數 276
7.3.2 素性檢測 276
7.3.3 倍數 277
7.3.4 約數 277
7.3.5 互質數 277
7.3.6 質因數 277
7.3.7 強素數 277
7.3.8 因子 278
7.3.9 模運算 278
7.3.10 模運算的操作與性質 279
7.3.11 單向函數 279
7.3.12 費馬定理和歐拉定理 280
7.3.13 冪與模冪運算 280
7.3.14 同餘符號≡ 280
7.3.15 歐拉函數 281
7.3.16 最大公約數 281
7.3.17 歐幾里得算法 282
7.3.18 擴展歐幾里得算法 284
7.4 RSA算法描述 292
7.5 RSA算法實例 293
7.5.1 查找法計算d 293
7.5.2 簡便法計算私鑰d 295
7.5.3 擴展歐幾里得計算私鑰d 297
7.5.4 加密字母 298
7.5.5 分組加密字符串 298
7.6 RSA加密長度限制問題 302
7.7 熟悉PKCS#1 303
7.7.1 PKCS#1填充 304
7.7.2 PKCS#1中的 RSA私鑰語法 308
7.8 在OpenSSL命令中使用RSA 309
7.8.1 生成RSA公私鑰 309
7.8.2 提取私鑰參數 311
7.8.3 利用RSA公鑰加密一個文件 312
7.8.4 利用私鑰解密一個文件 313
7.9 基於OpenSSL庫的Java RSA實現 314
7.9.1 OpenSSL的RSA實現 314
7.9.2 主要數據結構 315
7.9.3 主要函數 316
7.10 隨機大素數的生成 332
7.11 Java中的大數表示 333
7.12 基於大素數的RSA算法Java實現 334
7.13 基於JCA的RSA算法實現 339
7.13.1 密鑰對類KeyPair 340
7.13.2 密鑰對生成類KeyPairGenerator 340
7.13.3 密鑰工廠類KeyFactory 342
7.14 RSA算法的攻擊及分析 348
7.14.1 因子分解攻擊 348
7.14.2 選擇密文攻擊 348
7.14.3 公共模數攻擊 348
7.14.4 小指數攻擊 349
第8章 數字簽名技術 350
8.1 概述 350
8.2 什麽是數字簽名技術 351
8.2.1 簽名 351
8.2.2 數字簽名基本概念 352
8.2.3 數字簽名的原理 352
8.2.4 數字簽名的一般性定義 353
8.2.5 數字簽名的分類 354
8.2.6 數字簽名的安全性 355
8.2.7 數字簽名的特徵與應用 356
8.3 RSA 公鑰算法在數字簽名中的應用 356
8.4 利用OpenSSL命令進行簽名驗簽 357
作者介紹
朱文偉,名校計算機專業統招碩士,20年C\C++、Java開發經驗。主導開發過密碼、圖形、人工智能等產品。
精通Linux、Windows系統開發及數據庫開發技術。
著有圖書《Windows C/C++加密解密實戰》《密碼學原理與Java實現》《Linux C與C++ 一線開發實踐》《Visual C++2017從入門到精通》。