新書推薦:
《
夺回大脑 如何靠自己走出强迫
》
售價:NT$
299.0
《
夏天,19岁的肖像(青鲤文库)岛田庄司两次入围日本通俗文学奖直木奖的作品 ,同名电影由黄子韬主演!
》
售價:NT$
225.0
《
图解机械工程入门
》
售價:NT$
440.0
《
股市长线法宝(第6版)
》
售價:NT$
640.0
《
中文版SOLIDWORKS 2024机械设计从入门到精通(实战案例版)
》
售價:NT$
450.0
《
纯数学教程
》
售價:NT$
390.0
《
威尔士史:历史与身份的演进
》
售價:NT$
490.0
《
黄金、石油和牛油果:16件商品中的拉丁美洲发展历程
》
售價:NT$
395.0
|
編輯推薦: |
本书讲解加密解密原理及其实现,内容包括对称密码算法、杂凑函数和HMAC、密码学中常见的编码格式、非对称算法RSA的加解密、数字签名技术、椭圆曲线密码体制ECC、CSP和CryptoAPI、身份认证和PKI理论基础、实战PKI、SSL-TLS编程、SM2算法的数学基础、SM2算法。
|
內容簡介: |
本书详解Windows加解密算法的原理及其实现技术,内容安排首先从各大主流加解密算法的原理入手,然后用C/C 语言自主实现这些算法,*后从C/C 提供的主流加解密框架和函数库入手讲解其使用方法。 本书分为14章,内容包括密码学概述、搭建C和C 密码开发环境、对称密码算法、杂凑函数和HMAC、密码学中常见的编码格式、非对称算法RSA的加解密、数字签名技术、椭圆曲线密码体制ECC、CSP和CryptoAPI、身份认证和PKI理论基础、实战PKI、SSL-TLS编程、SM2算法的数学基础、SM2算法的实现。 本书适合用于C/C 初中级开发人员自学密码开发技术,也适合高等院校和培训机构相关专业的师生教学参考。
|
關於作者: |
朱晨冰,朱文伟的笔名,名校计算机专业统招硕士,20年C\\C 、Java开发经验。主导开发过密码、图形、人工智能等产品。精通Linux、Windows系统开发及数据库开发技术。著有图书《Windows C/C 加密解密实战》《密码学原理与Java实现》《Linux C与C 一线开发实践》《Visual C 2017从入门到精通》。
|
目錄:
|
第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 在Linux下编译安装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 在Linux下编译安装GmSSL 57
2.4.7 默认编译安装GmSSL 61
2.4.8 在老版本的Linux下编译安装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_ex 206
4.5.5 摘要更新函数EVP_DigestUpdate 206
4.5.6 摘要结束函数EVP_Digest_Final_ex 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_notBefore 406
11.3.7 获得证书有效期的终止日期函数X509_get_notAfter 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
13.8.1 Fp上的椭圆曲线 465
13.8.2 上的椭圆曲线 466
13.9 椭圆曲线方程参数的拟随机生成 467
13.9.1 Fp上椭圆曲线方程参数的拟随机生成 467
13.9.2 上椭圆曲线方程参数的拟随机生成 468
13.10 椭圆曲线方程参数的验证 468
13.10.1 Fp上椭圆曲线方程参数的验证 468
13.10.2 上椭圆曲线方程参数的验证 469
第14章 SM2算法的实现 470
14.1 为何要推出SM2算法 470
14.2 SM2算法采用的椭圆曲线方程 471
14.3 SM2算法的用途 471
14.4 椭圆曲线密码体制的不足 471
14.5 椭圆曲线的研究热点 472
14.6 SM2算法中的有限域 473
14.6.1 素域Fq 473
14.6.2 二元扩域 473
14.7 有限域上的椭圆曲线 473
14.7.1 Fp上的椭圆曲线 474
14.7.2 上的椭圆曲线 474
14.8 椭圆曲线系统参数及其验证 474
14.8.1 一般要求 474
14.8.2 Fp上椭圆曲线系统参数及其验证 474
14.8.3 上椭圆曲线系统参数及其验证 475
14.9 密钥对的生成 476
14.10 公钥的验证 477
14.10.1 Fp上椭圆曲线公钥的验证 477
14.10.2 上椭圆曲线公钥的验证 477
14.11 MIRACL库入门 477
14.11.1 获取MIRACL 478
14.11.2 生成静态库并测试 478
14.12 SM2加解密算法 481
14.12.1 算法参数 481
14.12.2 辅助函数 481
14.12.3 加密算法及流程 482
14.12.4 解密算法及流程 483
14.12.5 椭圆曲线消息加解密示例 484
14.12.6 用代码实现SM2加解密算法 489
14.13 SM2数字签名 508
14.13.1 算法参数 508
14.13.2 辅助函数 509
14.13.3 数字签名的生成算法及流程 509
14.13.4 数字签名的验证算法及流程 510
14.13.5 数字签名与验证示例 511
14.13.6 用代码实现SM2签名验签算法 517
|
內容試閱:
|
随着计算机及网络技术的发展,信息安全,特别是各行各业信息系统的安全成为社会关注的焦点,直接影响国家的安全和社会的稳定。
信息安全技术是核心技术中的核心。信息安全,大到国防安全,小到个人银行账号,一出事对国家和个人都是大事。网络世界黑白难分,暗礁险滩出入相随,保护信息安全是每个IT人员必须重视的课题,一定要保证所开发的信息系统是安全的,经得起攻击。作为一个IT人,无论你是在Linux下开发,还是在Windows下开发,无论是用C/C 开发,还是Java开发,或者用C#开发,都应该掌握信息安全技术,这项技术就像我们大学学习的数据结构、离散数学那样,是任何信息系统的基础。举一个简单的例子,你在开发一个信息管理系统,总不能把用户的登录口令以明文的方式保存在数据库中吧。
C/C 语言作为当今世界主流的开发语言,使用十分广泛,而关于C/C 加解密方面的图书寥寥无几,而且现有的只是对基本的函数进行介绍,并没有深入算法原理。也就是读者看了,只知道这样用,而不理解为何这样用。学习信息安全技术,不先从原理上来理解其本质,是开发不出安全的系统来的。
为何要写一本密码书?答案是市面上的密码书实在太学院派或太工程派。本书不同于以往的密码书,很多学院派的密码书对许多常用或不常用的密码算法只是蜻蜓点水、浅尝辄止地介绍,而没有进行上机的代码实现,让学生看了似懂非懂。而实践派的密码书从头到尾只是几个业界算法库的函数介绍,然后调用,接着就结束了,让学生看了只知其然,而不知其所以然。
本书来自于拥有几十年经验的密码开发工程师一手资料,知道哪些算法是重要并且常用的,瞄准这几个常用的算法(本书全方面地从理论到实现介绍SM2/SM3/SM4算法),循序渐进(甚至从小学数学讲起),详细地介绍其原理,到自主实现,再到业界库的调用(工作中必定会碰到,一定要在找工作之前学习),对于有理解难点的地方会重点介绍。通过本书,读者不仅能理解原理,还能自己上机实现,还可以熟练调用业界知名算法库,做到从理论到实践的全线精通,这一点是市面上99%的密码书都无法做到的。可以说,学完本书,立即上岗,毫无压力!
本书首先从各大主流加解密算法的原理入手,然后用C/C 语言手工实现该算法(这是理解算法理论的必要过程),后从C/C 提供的主流加解密框架和函数库入手熟悉其使用。记住,会使用函数库是基本的技能,真正的专家是要会设计和实现算法库,因为很多场合,尤其是国防军工领域,很多敏感的、需要高性能的地方都要自己实现加解密算法,而不能照搬别人的函数库,所以不理解原理是不可以的。C/C 作为信息系统开发的主流语言,其信息安全需求十分旺盛,在C/C 开发的信息系统中,熟练运用信息安全技术迫在眉睫。
作者长期工作在信息安全开发一线,有着较为丰富的密码算法使用经验,经常使用各种算法来保护数据安全,自己平时也积累了不少技术心得和开发经验,但这些技术比较零散,系统性不强,借此机会,将这些内容整理成一个完整的系统,并且将所涉及的技巧和方法讲述出来,是一件很荣幸的事。作者所做的工作来源于长期的实践,对于密码安全的开发技巧都从基本的内容讲起,然后稍微提高,所以本书可以说是“贴近实战”。软件开发是一门需要实践的技术,本书对理论尽量用简单易懂的语言介绍,然后配合相应的实例,避免空洞的说教,对于其中的技术细节,都尽量讲深、讲透,为读者提供翔实可靠的技术资料。
实践反复告诉我们,只有把关键核心技术掌握在自己手中,才能从根本上保障国家经济安全、国防安全和其他安全。作为一名老工程师,真心希望每个IT从业者都能静下心来学一学密码学。
密码学在信息技术应用中占有重要的地位,国家也日益重视信息安全,密码技术成为开发者经常会碰到的问题。针对当前密码学领域的书,要么理论太枯燥,要么太简单笼统,无法应对一线实战开发的情况,因此就有了这么一本面对初中级程序员的密码学开发方面的书。很多人学习密码学主要是应用密码算法来保护数据安全,实际开发过程中也是如此,所以学习密码学的度很有讲究,太深没必要,太浅没什么用。本书在学习深度方面也经过了仔细斟酌。
源码下载与技术支持
本书示例源码请扫描下面的二维码下载,也可按页面提示转发到自己的邮箱中下载。由于写作时间紧迫,书中疏漏之处在所难免,读者若有疑问、建议和意见,可以加作者技术支持QQ或者发送邮件联系作者(QQ、邮箱参见下载资源),邮件主题为“Windows C/C 加密解密实战”,在此表示感谢。
作 者
2021年1月
|
|