TLS_RSA_WITH_AES_128_CBC_SHA256(0x003c)数据包解密(EtM)

admin 2026-07-12 04:48:29 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文详细介绍了TLSRSAWITHAES128CBCSHA256数据包的解密过程,包括身份鉴别、公钥加密和预主密钥解密等步骤。文章提供了私钥示例和加密数据,并引用了GB/T38636-2020标准,指导如何通过RSA私钥解密预主密钥,进而进行AES-128-CBC解密和HMAC-SHA256完整性校验。 综合评分: 82 文章分类: 渗透测试,漏洞分析,安全工具,技术标准,网络安全


cover_image

TLS_RSA_WITH_AES_128_CBC_SHA256(0x003c) 数据包解密(EtM)

原创

利刃信安 利刃信安

利刃信安

2026年7月12日 00:30 北京

在小说阅读器读本章

去阅读

TLS_RSA_WITH_AES_128_CBC_SHA256

(0x003c) 数据包解密(EtM)

Encrypt-then-MAC · EMS扩展 · AES-128-CBC解密 · HMAC-SHA256完整性校验

01

PART

身份鉴别

AUTHENTICATION

签名值 (ServerKeyExchange)

Server Key Exchange 消息 tls.handshake.type == 12

规范引用: GB/T 38636-2020 §6.4.5.4:

ECDHE: signed_params = client_random + server_random + params

ECC: signed_params = client_random + server_random + enc_cert_len + enc_cert

…Code

tls.handshake.type == 12

查询为空,说明这是一个TLS 1.2 TLS_RSA_WITH_AES_128_CBC_SHA256 (0x003c)(EtM) 传输模式隐式鉴别单向鉴别

02

PART

公钥加密

PUBLIC KEY ENCRYPTION

已知私钥:

…Code

—–BEGIN PRIVATE KEY—–

MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDDMAioS/r50HDE

3FfrFxQbS4Q5ZKjlexFVHDLp4URbsS+Gl7doiScmXVBK/CiHf8qFpz/F0Fk2if7h

D0xKkKSTp39M20cQN2ZSwZbsZozWrHZ+7EznG0NNgRUQv0lbl8XgYsQSLq+iNTVN

GJOcBaWYnVOcUanQpFp1TVTnZG7KtElcG3JuYXpdZ+K6CJ9C73Caxn4E0YmUIC9t

GX8uNf8VtD+1U5pwlTOG5dHa03944Jv0cPeZ3IQQ3b4Hz4uCQE4ofwaakubBahh3

0MyDl5UotY4UvraQDgR4YnQZ9iGR1YY4DC56XSWgsvOeeZkfzsfbcs7saVk6f7xI

QXmDwjbHAgMBAAECggEAGtoo1r5dMLD0UqDdl4H9SiQBdMPcWHWt1L+kYXiUJukh

WKrWmJMFx8lemnJGQR3bhreTlmsrWs1xOxUXscpkWcvZP4GLLTfx48CuOqeBCKeB

RcTMb57Yi3kOpNcsCGXA2zW7M6UolHAtfQW8iOJd/bjnH8I8Um/J4glZfNvcQhZ9

rl8H4dq6l6kFETJXuqST3SxzIp0wSrRf2NBssebDtnXlwL1pd2OsCVbhM8XnEXwE

XAetXHOI96CMJpirR8aPLS5M0u9jegRm0+KTQMqDdWPXXTar4SuWXPge5CDw2yYr

RuNX6qDAehLZTvP/FwGdpRCaTpYnFjLQJquU2XCyAQKBgQDx+p8U5H1nlefNbqOU

tAohEQc92Tpie4g9FyKnVJ/bNoKqLVnC4A8HFX7woSjd/cglvXp1d9Ei/qWJPFMv

uUBCUEo6iQmbg+WpYfsSgWlMszJUnvUGgc+/OA9hGAOoiiSv8PI0Zc784XLHovl/

ePAb1bBhRwKZ7GxXRkR91Tr+ZwKBgQDOf1YGvdWi8+tkR8bq17BtPscxNHCue0Wl

Lx0TTDMrclegPvhqn17HcgAikdOqIUhztvY93sg3L3qnh+KGBdMZmDiaD19Q4RHs

61FSVO1slDKtgTOCZxMf+4pjwMJm+AuD57ymxfEb8kPv9pRfTVocRd20UDTXCElG

wSTcpYMIoQKBgQC9l+WPBBvxznWJ83c96vbIw8PNxOdHBI1ReFARlW+O3Z3xYoki

9FUx8ri8JzmS/eYVE+ngIhn99lGTPm3bRaXAj5IpXPfnHqgSWA/VhwoPK5Ry0v0e

tRUmOPFr3Nn48wwdwoazYVWVs7swClS8ePCAjqSdA3tZSPH2S7sccLbBXwKBgQCG

QGM9ns32U38Gg2Pf6rrZS6dVZjKcPajZ6/eLRE9AP+aYWFhJebO1F3jfANAMG/du

w9T0BJNGzaeAo+eyGrdUPJMQFk5x1uJAlf0Y+f4iSXdpNka20Syt7mvazseVCk7y

Qwdzpd1LvgZNTJLKIxAisYmiYUL5SnnZdljw2uqGAQKBgCLnrHayLOUG7LiE5uKV

7eorFnmXiyfC7SLoaqfiGiU+CpSjrlgUBU7EF44k4MgQHo8o81p08gxnPTLJN/cL

B/QJA5/kQDB2M03pkZdfJs/ZoS6+4eL0xfwkadv1fOsUQ6NC/dhXW0hTnZeFM1ZO

8cNaZKqG3cH0Zguj85vxkIuh

—–END PRIVATE KEY—–

转换十六进制

…Code

308204BE020100300D06092A864886F70D0101010500048204A8308204A40201000282010100C33008A84BFAF9D070C4DC57EB17141B4B843964A8E57B11551C32E9E1445BB12F8697B7688927265D504AFC28877FCA85A73FC5D0593689FEE10F4C4A90A493A77F4CDB4710376652C196EC668CD6AC767EEC4CE71B434D811510BF495B97C5E062C4122EAFA235354D18939C05A5989D539C51A9D0A45A754D54E7646ECAB4495C1B726E617A5D67E2BA089F42EF709AC67E04D18994202F6D197F2E35FF15B43FB5539A70953386E5D1DAD37F78E09BF470F799DC8410DDBE07CF8B82404E287F069A92E6C16A1877D0CC83979528B58E14BEB6900E0478627419F62191D586380C2E7A5D25A0B2F39E79991FCEC7DB72CEEC69593A7FBC48417983C236C70203010001028201001ADA28D6BE5D30B0F452A0DD9781FD4A240174C3DC5875ADD4BFA461789426E92158AAD6989305C7C95E9A7246411DDB86B793966B2B5ACD713B1517B1CA6459CBD93F818B2D37F1E3C0AE3AA78108A78145C4CC6F9ED88B790EA4D72C0865C0DB35BB33A52894702D7D05BC88E25DFDB8E71FC23C526FC9E209597CDBDC42167DAE5F07E1DABA97A905113257BAA493DD2C73229D304AB45FD8D06CB1E6C3B675E5C0BD697763AC0956E133C5E7117C045C07AD5C7388F7A08C2698AB47C68F2D2E4CD2EF637A0466D3E29340CA837563D75D36ABE12B965CF81EE420F0DB262B46E357EAA0C07A12D94EF3FF17019DA5109A4E96271632D026AB94D970B20102818100F1FA9F14E47D6795E7CD6EA394B40A2111073DD93A627B883D1722A7549FDB3682AA2D59C2E00F07157EF0A128DDFDC825BD7A7577D122FEA5893C532FB94042504A3A89099B83E5A961FB1281694CB332549EF50681CFBF380F611803A88A24AFF0F23465CEFCE172C7A2F97F78F01BD5B061470299EC6C5746447DD53AFE6702818100CE7F5606BDD5A2F3EB6447C6EAD7B06D3EC7313470AE7B45A52F1D134C332B7257A03EF86A9F5EC772002291D3AA214873B6F63DDEC8372F7AA787E28605D31998389A0F5F50E111ECEB515254ED6C9432AD81338267131FFB8A63C0C266F80B83E7BCA6C5F11BF243EFF6945F4D5A1C45DDB45034D7084946C124DCA58308A102818100BD97E58F041BF1CE7589F3773DEAF6C8C3C3CDC4E747048D51785011956F8EDD9DF1628922F45531F2B8BC273992FDE61513E9E02219FDF651933E6DDB45A5C08F92295CF7E71EA812580FD5870A0F2B9472D2FD1EB5152638F16BDCD9F8F30C1DC286B3615595B3BB300A54BC78F0808EA49D037B5948F1F64BBB1C70B6C15F028181008640633D9ECDF6537F068363DFEABAD94BA75566329C3DA8D9EBF78B444F403FE69858584979B3B51778DF00D00C1BF76EC3D4F4049346CDA780A3E7B21AB7543C9310164E71D6E24095FD18F9FE224977693646B6D12CADEE6BDACEC7950A4EF2430773A5DD4BBE064D4C92CA231022B189A26142F94A79D97658F0DAEA860102818022E7AC76B22CE506ECB884E6E295EDEA2B1679978B27C2ED22E86AA7E21A253E0A94A3AE5814054EC4178E24E0C8101E8F28F35A74F20C673D32C937F70B07F409039FE4403076334DE991975F26CFD9A12EBEE1E2F4C5FC2469DBF57CEB1443A342FDD8575B48539D978533564EF1C35A64AA86DDC1F4660BA3F39BF1908BA1

被加密的预主密钥:

ClientKeyExchange (tls.handshake.type == 16)

…Code

01794d478ed303417f521f41082321e0cfe12e51806e84dcff8e10acc5e332986b13af29d9c9ab0a9f3cbfab3e39b84b76b2f7cc3596f5754d26aa0e353ea17a1c85ce45b4ac8b58de80cb1c1c6a6ffb1c1fe35cd69a710770b1c8ff42ecbef5527e6b73963b4ffac4e1529f6e08d46b2986077bcad6aa03fa53d12e8d0e03b697a7a1584295ac0aefef1920f80ce8c7c19dd7786011f9c5020cf1426a411c9a4cb0098edb90f300a7312d716435e043445c82d82578ae6e4733568d4450695ae6034b2adfc3049c8d46ea1b4b6abc67a03622e9c9e1c2734daa09b7a21abf43d372c553aa8bb8a2f54d086ef1df72f7e028e08ad4a3f32834d0c22fce0b2454

…Code

TLSv1.2 Record Layer: Handshake Protocol: Client Key Exchange

Content Type: Handshake (22)

Version: TLS 1.2 (0x0303)

Length: 262

Handshake Protocol: Client Key Exchange

Handshake Type: Client Key Exchange (16)

Length: 258

RSA Encrypted PreMaster Secret

Encrypted PreMaster length: 256

Encrypted PreMaster […]: 01794d478ed303417f521f41082321e0cfe12e51806e84dcff8e10acc5e332986b13af29d9c9ab0a9f3cbfab3e39b84b76b2f7cc3596f5754d26aa0e353ea17a1c85ce45b4ac8b58de80cb1c1c6a6ffb1c1fe35cd69a710770b1c8ff42ecbef5527e6b73963b4ffac4e1

03

PART

预主密钥

PRE-MASTER SECRET

对于 RSA 握手协商算法来说,Client 会生成的一个 48 字节的预主密钥,其中前 2 个字节是 ProtocolVersion,后 46 字节是随机数,用 Server 的公钥(服务器公钥证书certificate)加密之后通过 Client Key Exchange 子消息发给 Server,Server 用私钥来解密。

…Code

struct {

uint32 gmt_unix_time;

opaque random_bytes[28];

} Random;

struct {

ProtocolVersion client_version;

opaque random[46];

} PreMasterSecret;

struct {

uint8 major;

uint8 minor;

} ProtocolVersion;

对于 (EC)DHE握手协商算法来说,预主密钥是双方通过椭圆曲线算法生成的,双方各自生成临时公私钥对,保留私钥,将公钥发给对方,然后就可以用自己的私钥以及对方的公钥通过椭圆曲线算法来生成预主密钥,预主密钥长度取决于 DH/ECDH 算法公钥。预主密钥长度是 48 字节或者 X 字节。

RSA/ECB/PKCS1Padding (标准填充)

…Code

0303B05B1076E50E75ADC93044BD04E1F666CCFB88BBB5CA7DCA9F98EB8FF5D8DA2D041EF921E3608957313F25F9B293

04

PART

主密钥

MASTER SECRET

创建预主密钥文件

tlcp_keys.txt

PMS_CLIENT_RANDOM 客户端随机数 预主密钥

…Code

PMS_CLIENT_RANDOM 0d41843a0b7cdeff8055f7f4d499adc52f173aeeee740066795da8d403d5285c 0303B05B1076E50E75ADC93044BD04E1F666CCFB88BBB5CA7DCA9F98EB8FF5D8DA2D041EF921E3608957313F25F9B293

导入WireShark

导出TLS会话密钥

CBC-masterkey.keys

CLIENT_RANDOM 客户端随机数 主密钥

…Code

CLIENT_RANDOM 0d41843a0b7cdeff8055f7f4d499adc52f173aeeee740066795da8d403d5285c 7674934cdf69ec43c073d2ed2c31ce0e8da13e07d2e2f07326630aa5688f2a2b859491cbde6a783ab54ab3f840dcd82c

则主密钥:

…Code

7674934cdf69ec43c073d2ed2c31ce0e8da13e07d2e2f07326630aa5688f2a2b859491cbde6a783ab54ab3f840dcd82c

核心作用:修复三重握手(Triple Handshake)中间人攻击

传统TLS1.0~1.2 (无EMS)主密钥计算

…Code

master_secret = PRF(pre_master_secret, “master secret”, ClientRandom||ServerRandom)

仅依赖双方随机数,不绑定握手完整上下文,攻击者可构造两条会话,让两段连接算出完全相同的主密钥,实现中继劫持、客户端身份伪造(三重握手漏洞)。

协商EMS后(len=0扩展生效)的安全计算

…Code

master_secret = PRF(pre_master_secret, “extended master secret”, session_hash)

session_hash:握手前半段(ClientHello~ClientKeyExchange)所有握手消息的哈希值

主密钥绑定完整握手上下文、证书、密码套件,不同握手必然生成不同主密钥,彻底阻断三重握手攻击

session_hash

…Code

0100006703030d41843a0b7cdeff8055f7f4d499adc52f173aeeee740066795da8d403d5285c000004003c00ff0100003a002300000016000000170000000d002a0028040305030603080708080809080a080b080408050806040105010601030303010302040205020602020000390303350369c9f5d72f5b962187da1ab0f612d54e01479e97a14f78391e6c9d3eb47900003c000011ff010001000023000000160000001700000b0003b10003ae0003ab308203a73082028fa0030201020214249e83b5eba3f55ff890d132c3a19ecb188e4a1b300d06092a864886f70d01010b05003063310b300906035504061302434e3110300e06035504080c0751696e676861693111300f06035504070c0858696e676e696e67310d300b060355040a0c0454657374310c300a060355040b0c034c61623112301006035504030c096c6f63616c686f7374301e170d3236303730343034343233395a170d3237303730343034343233395a3063310b300906035504061302434e3110300e06035504080c0751696e676861693111300f06035504070c0858696e676e696e67310d300b060355040a0c0454657374310c300a060355040b0c034c61623112301006035504030c096c6f63616c686f737430820122300d06092a864886f70d01010105000382010f003082010a0282010100c33008a84bfaf9d070c4dc57eb17141b4b843964a8e57b11551c32e9e1445bb12f8697b7688927265d504afc28877fca85a73fc5d0593689fee10f4c4a90a493a77f4cdb4710376652c196ec668cd6ac767eec4ce71b434d811510bf495b97c5e062c4122eafa235354d18939c05a5989d539c51a9d0a45a754d54e7646ecab4495c1b726e617a5d67e2ba089f42ef709ac67e04d18994202f6d197f2e35ff15b43fb5539a70953386e5d1dad37f78e09bf470f799dc8410ddbe07cf8b82404e287f069a92e6c16a1877d0cc83979528b58e14beb6900e0478627419f62191d586380c2e7a5d25a0b2f39e79991fcec7db72ceec69593a7fbc48417983c236c70203010001a3533051301d0603551d0e04160414405e6f22042c8b59363280061741873d2c89c433301f0603551d23041830168014405e6f22042c8b59363280061741873d2c89c433300f0603551d130101ff040530030101ff300d06092a864886f70d01010b0500038201010093d8595982a1b509ef7f7640b403caf3a130f034d409fd64cb50b908c3ec0c4a3d2d21e5140ccd781fd36f865ee396fdb0d2936f7b2f065e05a1d7f696d90ab6709b10c60cbb87f2d985a92c60b3f9b204f5b372d0d5089ca317914fd9c4a9e2b1dc858fc5c04675707b5f8528dfa06a712511866376c328681e3add08fd9dba6429b8c792e9c8d52e090322bb6068e64b105e78a0ea17325fe6da894d61c79dbc1bac6da13e0bf1b18d5354cb094e2db6b3babdda022f3a415ee0595ff0e86349576063fd6e833955e0add0094e086b8791c1f691bbb578dc179f10f492cc96bd200b1b7482d0750080c770132c1cce2c15e79c709d6cc8fa6a1045cbb8fecd0e00000010000102010001794d478ed303417f521f41082321e0cfe12e51806e84dcff8e10acc5e332986b13af29d9c9ab0a9f3cbfab3e39b84b76b2f7cc3596f5754d26aa0e353ea17a1c85ce45b4ac8b58de80cb1c1c6a6ffb1c1fe35cd69a710770b1c8ff42ecbef5527e6b73963b4ffac4e1529f6e08d46b2986077bcad6aa03fa53d12e8d0e03b697a7a1584295ac0aefef1920f80ce8c7c19dd7786011f9c5020cf1426a411c9a4cb0098edb90f300a7312d716435e043445c82d82578ae6e4733568d4450695ae6034b2adfc3049c8d46ea1b4b6abc67a03622e9c9e1c2734daa09b7a21abf43d372c553aa8bb8a2f54d086ef1df72f7e028e08ad4a3f32834d0c22fce0b2454

…Code

1175513B6AAA75DA232888D75E6D2DC424334AB12C2146E9BF13D80C304A4C01

为了进行密钥生成或验证,需要一个 MAC 算法对数据块进行扩展以增加机密性。这个伪随机函数(PRF)将 secret,seed 和 label 作为输入,产生任意长度的输出。

在 TLS 1.2 中,基于 HMAC 定义了一个 PRF 函数。这个使用 SHA-256 hash 函数的 PRF 函数被用于所有的密码算法套件。

…Code

1175513B6AAA75DA232888D75E6D2DC424334AB12C2146E9BF13D80C304A4C01

计算增强型主密钥(开启EMS)

如果 ClientHello 的扩展中携带了 extended_master_secret 扩展,表示 Client 和 Server 使用增强型主密钥计算方式。

Server 在 ServerHello 中响应该扩展,返回了一个空的 extended_master_secret 扩展,表明会使用增强型主密钥计算方式。

那么增强型主密钥是如何计算的呢?计算方式如下:

…Code

master_secret = PRF(pre_master_secret, “extended master secret”,

session_hash)

[0..47];

密钥Key

…Code

0303B05B1076E50E75ADC93044BD04E1F666CCFB88BBB5CA7DCA9F98EB8FF5D8DA2D041EF921E3608957313F25F9B293

种子Seed

…Code

1175513B6AAA75DA232888D75E6D2DC424334AB12C2146E9BF13D80C304A4C01

标签Label

…Code

657874656E646564206D617374657220736563726574

轮数:3

PRF结果

…Code

7674934CDF69EC43C073D2ED2C31CE0E8DA13E07D2E2F07326630AA5688F2A2B859491CBDE6A783AB54AB3F840DCD82C60EA61447E26C06F93BD3A5F97DDEB78B55EC0879E189976C6CBFAB4C8D19153E5E4B1ACA5AAC6FB1F97898AE7D28F06

主密钥

…Code

7674934CDF69EC43C073D2ED2C31CE0E8DA13E07D2E2F07326630AA5688F2A2B859491CBDE6A783AB54AB3F840DCD82C

05

PART

工作密钥

KEY BLOCK

…Code

key_block = PRF(SecurityParameters.master_secret,

“key expansion”,

SecurityParameters.server_random +

SecurityParameters.client_random);

…Code

===========================================================================

TLS 1.2 工作密钥派生

密码套件: TLS_RSA_WITH_AES_128_CBC_SHA256 (0x003c)

传输模式: Encrypt-then-MAC (EtM)

===========================================================================

【输入参数】

主密钥 (Master Secret, 48字节):

7674934cdf69ec43c073d2ed2c31ce0e8da13e07d2e2f07326630aa5688f2a2b859491cbde6a783ab54ab3f840dcd82c

客户端随机数 (Client Random, 32字节):

0d41843a0b7cdeff8055f7f4d499adc52f173aeeee740066795da8d403d5285c

服务端随机数 (Server Random, 32字节):

350369c9f5d72f5b962187da1ab0f612d54e01479e97a14f78391e6c9d3eb479

【密钥块 (Key Block, 128字节)】

fc065bf335181ca74e3be4a1cf12ce3657c957f5bcd14473c058dbb96a11fc98

cc0ebc600eaae0021ac75cb7c6877c1381709dfca0c23cf39938528cdc199005

133d979339045ce6efdcff88ca55b224663d4fdce3529aa215ee294558cb3919

40457a848faf00313d34f823f02711e7f4dd40f5a10ab059603b93fda54d4fcb

【密钥分配顺序】

client_write_MAC_key 0: 32 ✅ 用于HMAC-SHA256

server_write_MAC_key 32: 64 ✅ 用于HMAC-SHA256

client_write_key 64: 80 ✅ 用于AES-128加密

server_write_key 80: 96 ✅ 用于AES-128加密

client_write_IV 96:112 ⚠️ TLS 1.2 CBC不用于加密

server_write_IV 112:128 ⚠️ TLS 1.2 CBC不用于加密

⚠️ 重要: TLS 1.2 CBC模式下,实际记录加密使用每条记录独立生成的随机IV!

  • AEAD模式(如GCM)会使用这些派生的IV作为nonce的一部分

===========================================================================

【工作密钥结果】

===========================================================================

客户端密钥 (Client Write Keys):

MAC密钥 (32字节): fc065bf335181ca74e3be4a1cf12ce3657c957f5bcd14473c058dbb96a11fc98 ✅

加密密钥 (16字节): 133d979339045ce6efdcff88ca55b224 ✅

IV (16字节): 40457a848faf00313d34f823f02711e7 ⚠️ CBC不用于加密

服务端密钥 (Server Write Keys):

MAC密钥 (32字节): cc0ebc600eaae0021ac75cb7c6877c1381709dfca0c23cf39938528cdc199005 ✅

加密密钥 (16字节): 663d4fdce3529aa215ee294558cb3919 ✅

IV (16字节): f4dd40f5a10ab059603b93fda54d4fcb ⚠️ CBC不用于加密

===========================================================================

【使用说明】

===========================================================================

  1. 数据流向:

• 客户端发送数据: 使用 client_write_key 和 client_write_MAC_key

• 服务端发送数据: 使用 server_write_key 和 server_write_MAC_key

  1. Encrypt-then-MAC (EtM) 模式处理流程:

步骤1: 生成随机IV(16字节加密强度随机数)

iv = os.urandom(16) ⚠️ 不使用派生的IV

步骤2: 使用AES-128-CBC加密明文数据

ciphertext = AES_CBC_encrypt(plaintext, write_key, iv)

步骤3: 计算密文的HMAC-SHA256

mac = HMAC_SHA256(mac_key, seq_num + type + version + length + ciphertext)

步骤4: 组装TLS记录: Type + Version + Length + IV + ciphertext + MAC

  1. 初始化向量(IV)使用 (重要纠正):

• TLS 1.2 CBC模式使用显式IV机制

• ⚠️ 每条记录的IV都是独立随机生成,不使用key_block派生的IV

• IV生成方式: os.urandom(16) – 加密强度随机数

• IV作为记录的一部分显式传输(在密文之前)

• key_block中的client_write_IV/server_write_IV不用于CBC记录加密

• 这是TLS 1.2修复BEAST攻击漏洞的关键设计

• ✅ AEAD模式(如GCM)会使用这些派生的IV作为nonce的一部分

===========================================================================

【TLS 1.2 CBC加密过程演示】

===========================================================================

Python示例代码(仅作演示)

假设要加密的明文数据

plaintext = b’This is a test message for TLS encryption’

TLS 1.2 CBC模式的正确加密流程

步骤1: 生成随机IV(关键!)

⚠️ 重要: IV必须独立随机生成,不使用key_block派生的IV

import os

iv = os.urandom(16) # 生成16字节加密强度随机IV

示例IV: 72d46842cc8b4c46ed332fd6a7002737

步骤2: 使用AES-128-CBC加密明文

使用派生的client_write_key

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes

from cryptography.hazmat.backends import default_backend

write_key = bytes.fromhex(‘133d979339045ce6efdcff88ca55b224’)

cipher = Cipher(algorithms.AES(write_key), modes.CBC(iv), backend=default_backend())

encryptor = cipher.encryptor()

步骤3: PKCS#7填充明文(使长度为16字节的倍数)

from cryptography.hazmat.primitives import padding

padder = padding.PKCS7(128).padder() # AES块大小=128位=16字节

padded_data = padder.update(plaintext) + padder.finalize()

步骤4: 执行加密

ciphertext = encryptor.update(padded_data) + encryptor.finalize()

步骤5: 计算HMAC-SHA256(Encrypt-then-MAC模式)

MAC输入: seq_num(8字节) + type(1字节) + version(2字节) + length(2字节) + ciphertext

seq_num = 0 # 第一条记录序列号为0

record_type = 23 # Application Data

version = (3, 3) # TLS 1.2 = 0x0303

length = len(iv) + len(ciphertext) # 不包括MAC本身

构造MAC输入数据

mac_input = seq_num.to_bytes(8, ‘big’)

mac_input += record_type.to_bytes(1, ‘big’)

mac_input += version[0].to_bytes(1, ‘big’) + version[1].to_bytes(1, ‘big’)

mac_input += length.to_bytes(2, ‘big’)

mac_input += ciphertext

计算MAC

import hmac

import hashlib

mac_key = bytes.fromhex(‘fc065bf335181ca74e3be4a1cf12ce36’)

mac = hmac.new(mac_key, mac_input, hashlib.sha256).digest()

步骤6: 组装TLS记录

TLS记录结构: Type(1B) + Version(2B) + Length(2B) + IV(16B) + Ciphertext + MAC(32B)

tls_record = record_type.to_bytes(1, ‘big’)

tls_record += version[0].to_bytes(1, ‘big’) + version[1].to_bytes(1, ‘big’)

tls_record += (len(iv) + len(ciphertext) + len(mac)).to_bytes(2, ‘big’)

tls_record += iv # ⚠️ 显式IV,作为记录的一部分传输

tls_record += ciphertext

tls_record += mac

发送TLS记录

send(tls_record)

⚠️ 重要提示:

1. 每条记录的IV必须独立随机生成

2. 不使用key_block派生的client_write_iv进行加密

3. IV作为记录的一部分显式传输

4. 这是TLS 1.2修复BEAST攻击的关键设计

===========================================================================

【安全提示】

===========================================================================

⚠️ 警告: 以下密钥材料必须严格保密:

• 主密钥 (Master Secret)

• 工作密钥 (MAC密钥、加密密钥)

⚠️ 建议:

• 不要在日志或控制台中输出实际密钥

• 使用安全的密钥存储机制 (如HSM、密钥管理服务)

• 密钥使用完毕后立即清零内存

• 定期轮换密钥

client_write_MAC _secret:

…Code

fc065bf335181ca74e3be4a1cf12ce3657c957f5bcd14473c058dbb96a11fc98

server_write_ MAC_secret:

…Code

cc0ebc600eaae0021ac75cb7c6877c1381709dfca0c23cf39938528cdc199005

client_write_key:

…server_write_key

133d979339045ce6efdcff88ca55b224

server_write_key:

…Code

663d4fdce3529aa215ee294558cb3919

client_write_IV:

…Code

40457a848faf00313d34f823f02711e7

server_write_IV:

…Code

f4dd40f5a10ab059603b93fda54d4fcb

计算过程

密钥块长度: 128 bytes = 2 × (32 bytes MAC key + 16 bytes encryption key+ 16 bytes iv)

种子: server_random + client_random(64 bytes)

标签: “key expansion”(ASCII)

PRF: P_SHA256(master_secret, “key expansion” + server_random + client_random)

密钥块由 4 个 32-byte P_SHA256 输出块拼接而成,按顺序解析为 client MAC key → server MAC key → client encryption key → server encryption key → client iv → server iv。

注意:TLS 1.2 中 CBC 模式的 IV 是显式的(每记录独立生成),业务数据加密使用的IV不包含在密钥块中。EtM(Encrypt-then-MAC)模式仅影响记录层的处理顺序,不影响密钥导出过程。

在 TLS 1.2 中,CBC 模式的 IV 是显式的(explicit),每条记录独立生成并随记录一起发送,因此业务数据加密使用的IV不属于密钥块的一部分

具体机制(RFC 5246 §6.2.3.2)

每条 TLS 记录的 IV 是独立随机生成的,明文长度 16 字节,直接放在密文之前发送。

发送方生成一个不可预测的随机 IV,加密后得到 record = IV + ciphertext。

第一对工作密钥(client_write_key / server_write_key)的 IV 在 ChangeCipherSpec 之后、第一条加密记录之前生成,后续每条记录都重新生成新的 IV。

对于EtM + CBC

由于开启了 EtM(Encrypt-then-MAC)扩展,加密流程为:

…Code

IV(随机16字节) + Encrypt(plaintext + MAC)

即:先用 server_write_MAC_key 对明文计算 HMAC-SHA256,再将 plaintext + MAC 用 AES-128-CBC 加密(密钥为 server_write_key),最后在密文前拼接随机生成的 16 字节 IV。

实际通信时,每条 TLS 记录都会携带一个随机生成的新 IV,由发送方在加密时现场生成。

06

PART

数据解密

DATA DECRYPTION

被加密的数据

…Code

1feaada0a6efabfc348de38cc2b982d25bc236a6be99ddaf81e0733ee675f1d8c89fb2a04a3915571d24fa6a9dba331593dd32114782e0f8ac6b8897ed2f0785

IV

…Code

1feaada0a6efabfc348de38cc2b982d2

MAC

…Code

c89fb2a04a3915571d24fa6a9dba331593dd32114782e0f8ac6b8897ed2f0785

密文

…Code

5bc236a6be99ddaf81e0733ee675f1d8

明文

…Code

0D0A

07

PART

完整性校验

INTEGRITY VERIFICATION

…Code

hash=SHA256 mac_offset=32 seq=1

type=0x17 ver=0303 length=32 include_seq=True

fragment: 1feaada0a6efabfc348de38cc2b982d25bc236a6…

hash=SHA256

mac_offset=32 (MAC starts at byte 32, not 16!)

seq=1

type=0x17 (Application Data)

ver=0x0303 (TLS 1.2)

length=32

include_seq=True

fragment: IV + CT (32 bytes!)

记录结构

…Code

IV (16 bytes) | CT (16 bytes) | MAC (32 bytes)

1feaada0…d2 | 5bc236a6…d8 | c89fb2a0…85

MAC验证公式

…Code

MAC = HMAC-SHA256(

client_write_MAC_key,

seq_num(8) + content_type(1) + version(2) + length(2) + IV + CT

)

其中:

seq_num = 0x0000000000000001

content_type = 0x17

version = 0x0303

length = 0x0020 (32 = len(IV) + len(CT))

实际数据 0d 0a是回车。

…Code

============================================================================

TLS 1.2 Application Data解密(最终正确版)

密码套件: TLS_RSA_WITH_AES_128_CBC_SHA256 (0x003c)

============================================================================

【解密参数】

方向: client

序列号: 1

============================================================================

TLS 1.2 Application Data 解密

密码套件: TLS_RSA_WITH_AES_128_CBC_SHA256 (0x003c)

============================================================================

【步骤1: 数据拆分】

总数据 (64字节): 1feaada0a6efabfc348de38cc2b982d25bc236a6be99ddaf81e0733ee675f1d8c89fb2a04a3915571d24fa6a9dba331593dd32114782e0f8ac6b8897ed2f0785

IV (16字节): 1feaada0a6efabfc348de38cc2b982d2

Ciphertext (16字节): 5bc236a6be99ddaf81e0733ee675f1d8

MAC (32字节): c89fb2a04a3915571d24fa6a9dba331593dd32114782e0f8ac6b8897ed2f0785

【步骤2: MAC验证(EtM模式)】

MAC输入 = seq_num(8字节) + type(1字节) + version(2字节) + length(2字节) + IV + Ciphertext

seq_num = 0000000000000001

type = 17 (Application Data)

version = 0303 (TLS 1.2)

length = 0020 (32字节 = IV+CT)

IV = 1feaada0a6efabfc348de38cc2b982d2

CT = 5bc236a6be99ddaf81e0733ee675f1d8

计算的MAC: c89fb2a04a3915571d24fa6a9dba331593dd32114782e0f8ac6b8897ed2f0785

接收的MAC: c89fb2a04a3915571d24fa6a9dba331593dd32114782e0f8ac6b8897ed2f0785

✅ MAC验证成功!

【步骤3: AES-128-CBC解密】

密钥: 133d979339045ce6efdcff88ca55b224

IV: 1feaada0a6efabfc348de38cc2b982d2

密文: 5bc236a6be99ddaf81e0733ee675f1d8

解密后: 0d0a0d0d0d0d0d0d0d0d0d0d0d0d0d0d

长度: 16字节

【步骤4: 去除填充(正确结构)】

加密对象结构:

plaintext = content + padding_length(1字节) + padding(padding_length字节)

解密后完整数据 (16字节):

[0d0a] [0d] [0d0d0d0d0d0d0d0d0d0d0d0d0d]

结构拆分:

content(明文): 2字节 → 0d0a

文本: ‘\r\n’

padding_length字节: 1字节 → 0d(值=13,表示后面有13字节padding)

padding数据: 13字节 → 0d0d0d0d0d0d0d0d0d0d0d0d0d

(每个字节值都是0d)

长度验证:

2 + 1 + 13 = 16字节 ✅

✅ 填充验证通过

============================================================================

✅ 解密成功!

============================================================================

真正的明文(content):

十六进制: 0d0a

文本: ‘\r\n’

明文含义: HTTP协议分隔符 \r\n(回车换行)

============================================================================

【最终总结】

============================================================================

✅ 解密状态: 成功

✅ 真正明文(content): 0d0a

✅ 明文文本: ‘\r\n’

✅ 明文含义: HTTP协议标准分隔符(回车换行)

加密对象结构(记忆要点):

plaintext = content + padding_length(1字节) + padding(padding_length字节)

其中 padding_length字节的值表示后面padding的字节数

padding_length字节本身不属于明文content

注意:此实现中 EtM 的 MAC 覆盖了 IV + 密文(而非仅密文),length 字段为 IV 与密文的总长度 32,这与 RFC 7366 的某些实现解释一致(将 TLSCiphertext.fragment 理解为包含 IV 的完整块密码结构)。

我是利刃信安,网络安全和密码安全、数据安全领域的小白。

如果你觉得今天这篇有收获,欢迎点赞、在看、转发三连,我们下篇见

点赞

在看

转发

如有疑问,请联系: Mannix6


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:利刃信安 利刃信安 利刃信安《TLSRSAWITHAES128CBCSHA256(0x003c) 数据包解密(EtM)》

评论:0   参与:  0