Go 中的 AES-CBC-Ciphertext Stealing(密文窃取)加解密:aescts 包原理与在 Kerberos 加密链中的实战应用
网络安全【免费下载链接】sliverAdversary Emulation Framework项目地址https://gitcode.com/gh_mirrors/sl/sliver点击查看免费下载本篇文章以 Sliver 仓库中 vendor 化的gopkg.in/jcmturner/aescts.v1包README.md为核心系统讲解在 Go 中如何使用 AES CBC Ciphertext StealingCTS密文窃取模式对数据进行加密与解密包括包的安装与导入、Encrypt/Decrypt两个核心函数的完整语义、三种明文长度场景下的算法分支以及该包在 Kerberos 5RFC 3962 / RFC 8009AES 加密类型中的真实调用链。读完本文你将理解 CTS 模式为何能免填充、其交换末两块并截断的具体实现并能在自己的 Go 项目中正确使用该包。一、CBC 密文窃取Ciphertext Stealing是什么传统 CBC 模式要求明文长度必须是 16 字节AES 块大小的整数倍否则需要使用 PKCS#7 等填充方案补齐最后一个块。而Ciphertext StealingCTS是一种不用填充即可处理任意长度明文的 CBC 变体它让最后两个块互相借用密文——倒数第二个密文块中截取所需字节补全最后一个块加密完成后交换末两块的位置最后再按原始明文长度截断输出。该包的源码注释明确引用了这一设计见 aescts.go为保持一致性密文窃取总是作用于待加密数据的最后两个块。如果数据长度恰好是块大小的整数倍则等价于普通 CBC 模式再将最后两个密文块交换一次加密输出中倒数第二块即最后一个明文块的加密结果被用作下一次加密的初始向量。这意味着 CTS 模式具有两个关键特性输出密文与明文等长无填充膨胀以及可以自然地传递 next IV 用于连续分片的加密——这两点对 Kerberos 这类需要把加密数据嵌入协议消息的场景至关重要。二、获取与导入 aescts 包原文档给出了最直接的获取方式go get gopkg.in/jcmturner/aescts.v1在 Go Modules 模式下更稳妥的做法是指定版本当前仓库 vendor 的版本为 v1.0.1见 implant/go-mod 第 42 行go get gopkg.in/jcmturner/aescts.v1v1.0.1导入方式同样继承自原文档import gopkg.in/jcmturner/aescts.v1该包只暴露两个公开函数aescts.Encrypt与aescts.Decrypt依赖 Go 标准库crypto/aes与crypto/cipher无任何第三方依赖。三、核心 APIEncrypt 与 DecryptEncrypt加密并返回 next IVfunc Encrypt(key, iv, plaintext []byte) ([]byte, []byte, error)参数与返回值对应 aescts.go 的Encrypt实现项说明keyAES 密钥必须是 16 / 24 / 32 字节对应 AES-128/192/256否则aes.NewCipher返回错误iv初始向量必须是 16 字节函数内部不会修改传入的 ivplaintext明文任意长度含非块整数倍允许为空调用则由内部zeroPad报错返回值 1next IV取自加密输出倒数第二块供后续分片加密接力使用返回值 2密文长度与明文严格一致CTS 无填充膨胀返回值 3错误密钥非法、明文为空等场景返回非 nil从源码看Encrypt内部首先用aes.NewCipher(key)创建分组密码再用cipher.NewCBCEncrypter(block, iv)创建 CBC 加密器随后按明文长度分三种分支处理详见下一节。值得注意的是函数内部对plaintext做了拷贝因此不会破坏调用方的切片。Decrypt逆向恢复明文func Decrypt(key, iv, ciphertext []byte) ([]byte, error)Decrypt的实现aescts.go有几点值得注意先拷贝密文源码注释明确指出即使以值传递切片其底层数组仍可能被修改因此内部先copy一份避免污染调用方数据长度下限校验密文长度小于一个块16 字节直接返回错误Ciphertext is not large enough...整数倍场景只需把末两块交换回来再用标准 CBC 解密单个块恰好 16 字节时无法交换直接按 CBC 解密非整数倍场景需要从倒数第二块密文尾部借出npb BlockSize - len(ct) % BlockSize个字节拼接到最后一块上再依次解密最后按len(ct)截断输出。返回值只有明文与错误长度与原始密文等长。四、三种明文长度场景的算法分支Encrypt依据l : len(plaintext)与aes.BlockSize16的关系走三条路径理解这三条路径是掌握该包行为的关键场景 1明文 ≤ 16 字节单块m, _ zeroPad(m, aes.BlockSize) mode.CryptBlocks(m, m) return m, m, nil先用零填充到 16 字节做一次 CBC 加密返回的密文是 16 字节注意此时输出比明文长这是唯一填充的情形next IV 即该密文本身。场景 2明文长度是块大小的整数倍mode.CryptBlocks(m, m) iv m[len(m)-aes.BlockSize:] rb, _ : swapLastTwoBlocks(m, aes.BlockSize) return iv, rb, nil整段按普通 CBC 加密然后交换最后两个密文块返回的 next IV 是交换前的最后一块密文。场景 3明文长度不是块大小的整数倍真正的 CTS先zeroPad到块大小整数倍再调用tailBlocks拆出前半段 rb / 倒数第二块 pb / 最后一块 lb三部分前半段按 CBC 连续加密并滚动更新 iv随后分别加密 pb 与 lb最后将密文按lb pb顺序拼接交换末两块并按原始明文长度ct[:l]截断。这正是维基百科密文窃取条目所描述的 CBC-CTS 标准做法源码注释中直接引用了该参考见 aescts.go。五、辅助函数tailBlocks、swapLastTwoBlocks、zeroPad包内还有三个未导出的辅助函数共同支撑上述流程aescts.gotailBlocks(b []byte, c int) ([]byte, []byte, []byte, error)把切片拆成剩余部分 / 倒数第二块 / 最后一块三块。最后一块的长度按len(b) % BlockSize计算余数为 0 时整块为 16 字节当数据不超过两个块时返回的rb为 nil。数据不大于一个块时返回错误bytes slice is not larger than one block so cannot tail。swapLastTwoBlocks(b []byte, c int) ([]byte, error)在tailBlocks基础上重排为rb lb pb实现末两块交换。加密整数倍场景与解密交换回来两侧都在使用它。zeroPad(b []byte, m int) ([]byte, error)用零字节把数据补到m的整数倍。块大小参数非法m 0或数据为空时返回错误。注意它与 PKCS#7 填充不同——只是补零因为 CTS 最终会按原始长度截断补零部分不进入最终输出。六、仓库中的实战应用Kerberos AES 加密链这个看似只有两个函数的包在仓库中的实际价值体现在它是Kerberos 5 AES 加密类型的内核。aescts 在 implant/go-mod 中被列为间接依赖indirect由gopkg.in/jcmturner/gokrb5.v7 v7.5.0第 45 行引入并被打包进 Sliver 的 implant 端 vendor 目录。RFC 3962AES-CTS-HMAC-SHA1-96rfc3962/encryption.go 中的EncryptData与DecryptData直接转调 aesctsivz : make([]byte, e.GetCypherBlockBitLength()/8) return aescts.Encrypt(key, ivz, data)这里 IV 是全零的 16 字节ivz。对应的加密类型在 aes128-cts-hmac-sha1-96.go 的文件头注释中列出aes128-cts-hmac-sha1-96etype 17128 位密钥与aes256-cts-hmac-sha1-96etype 18256 位密钥加密/解密函数均为 AES in CBC-CTS mode校验和类型为hmac-sha1-96-aes128/25696 位。EncryptMessage在加密前还会拼接随机 confounder 并通过DeriveKey按 usage 派生会话密钥。RFC 8009AES-CTS-HMAC-SHA2 系列rfc8009/encryption.go 的结构类似区别在于AES256_CTS_HMAC_SHA384_192类型需要 32 字节密钥且完整性哈希按HMAC(Ki, IV | C)方式计算先验密再解密见第 108-118 行注释。两条路径最终都汇聚到同一个aescts.Encrypt/aescts.Decrypt。上层链路implant 的 SSH Kerberos 认证在 Sliver 的 implant 端implant/sliver/shell/ssh/ssh.go 的getClient函数在同时提供krb5conf、keytab、realm时走 Kerberos 认证分支调用github.com/yiya1989/sshkrb5/krb5forssh.NewKrb5InitiatorClient该库导入gokrb5.v7的client、spnego、keytab、messages等包见 sshkrb5 client.go。由此构成的依赖链是implant SSH 命令Kerberos 认证 └─ github.com/yiya1989/sshkrb5SPNEGO/KRB5 客户端 └─ gopkg.in/jcmturner/gokrb5.v7RFC 3962 / RFC 8009 加密类型 └─ gopkg.in/jcmturner/aescts.v1AES-CBC-CTS 加解密内核也就是说implant 通过 SSH 使用 Kerberos 票据认证时票据与认证器消息中所有 AES 加密数据的机密性保障最终都落在这个约 186 行的 aescts 包上。七、使用注意事项结合源码行为使用该包时建议注意以下几点密钥与 IV 长度必须正确key必须是 16/24/32 字节iv必须是 16 字节否则要么aes.NewCipher返回错误要么在加密过程中产生错误结果Kerberos 场景中 IV 通常取全零向量。务必保存并使用返回的 next IVEncrypt第一个返回值是供后续加密使用的 next IV加密输出倒数第二块。如果要分片加密长消息并保持 CBC 链式依赖必须在下一片加密时传入它而不是沿用原始 iv。密文长度与明文等长除单块场景输出被补齐到 16 字节外CTS 输出长度恒等于明文长度解密方必须知晓这个语义避免把补零字节误当数据。Decrypt 会做长度校验密文不足一个块会直接返回错误整数倍与非整数倍两条解密路径不能互换必须与加密侧保持一致。在 Sliver 中它是间接依赖日常开发一般无需直接调用 aescts它通过 gokrb5 服务于 implant 的 Kerberos/SPNEGO 认证链路如需独立使用参考第二节的go get与import方式即可。结语aescts.v1虽然是一个只有两个公开函数的小型加密包但它以标准库crypto/aes与crypto/cipher为基础完整实现了 CBC 密文窃取模式的免填充加密并在本仓库中承担着 Kerberos 5 AES 加密类型RFC 3962 / RFC 8009的底层加解密职责。理解其单块 / 整数倍 / 非整数倍三分支逻辑与 next IV 语义既能帮助你在自己的 Go 项目中正确引入 CTS 加密也能更深入地读懂 Sliver implant 中 SSH Kerberos 认证这条完整依赖链。赞分享网络安全【免费下载链接】sliverAdversary Emulation Framework项目地址https://gitcode.com/gh_mirrors/sl/sliver点击查看免费下载相关推荐SeaTunnel FieldEncrypt 加密 Transform 插件实战指南AES-GCM/AES-CBC 字段加解密原理与配置SeaTunnel FieldEncrypt 加密 Transform 插件实战指南AES GCM/AES CBC 字段加解密原理与配置 SeaTunnel数据集成ETL大数据批处理流处理变更数据捕获AhabAssistantLimbusCompanyLimbus Company自动化助手终极指南AhabAssistantLimbusCompanyLimbus Company自动化助手终极指南 AhabAssistantLimbusCompany简称桌面应用RPA计算机视觉MicroPython cryptolib 模块实战AES 加密解密ECB / CBC / CTR完整指南MicroPython cryptolib 模块实战AES 加密解密ECB / CBC / CTR完整指南 本指南以 MicroPython 仓库中 do嵌入式语言运行时编程语言解释器编译器物联网系统编程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Airbyte db-harness-lib 深入解析:数据库连接器端到端测试的无引擎编排库

Airbyte db-harness-lib 深入解析:数据库连接器端到端测试的无引擎编排库

数据工程数据集成ETL后端大数据 【免费下载链接】airbyte Open-source data movement for ELT pipelines and AI agents — from APIs, databases & files to warehouses, lakes, and AI applications. Both self-hosted and Cloud. 项目地址: https://gitcode.…

2026/9/23 18:51:07 阅读更多 →
ug教学3个坑避不开?看完整示例秒懂

ug教学3个坑避不开?看完整示例秒懂

ug教学3个坑避不开?看完整示例秒懂 复制来的代码跑不通不知道怎么调?别急,这太正常了。网上搜【ug教学】,要么代码残缺,要么版本对不上,直接报错让人头秃。很多兄弟问我,到底该怎么看?其实核心就一点: 完整示例 。…

2026/9/23 18:50:07 阅读更多 →
车道线检测为何必须用VOC格式?标注一致性与模型兼容性详解

车道线检测为何必须用VOC格式?标注一致性与模型兼容性详解

简介:本资源是面向自动驾驶领域初学者与算法工程师的轻量级车道线检测数据集,专为VOC格式目标检测任务设计,可直接用于YOLOv5等主流框架训练与验证,无需额外格式转换或数据清洗。数据集包含50张高质量道路场景图像(48张…

2026/9/23 18:50:07 阅读更多 →

最新新闻

Skywalking与SpringBoot集成实战指南

Skywalking与SpringBoot集成实战指南

1. Skywalking与SpringBoot集成全攻略 作为一名长期奋战在微服务监控一线的开发者,我深知分布式系统链路追踪的重要性。今天我将分享如何将Skywalking这一强大工具与SpringBoot项目深度集成,从基础配置到高级功能实现,带你全面掌握这套监控方…

2026/9/23 19:36:45 阅读更多 →
laravel-admin 1.5 升级迁移全指南:表结构、路由与配置变更对照

laravel-admin 1.5 升级迁移全指南:表结构、路由与配置变更对照

laravel-admin 1.5 升级迁移全指南:表结构、路由与配置变更对照 【免费下载链接】laravel-admin Build a full-featured administrative interface in ten minutes 项目地址: https://gitcode.com/gh_mirrors/la/laravel-admin laravel-admin 1.5 对内置表结…

2026/9/23 19:36:44 阅读更多 →
图解原理:搞定十大经典游戏音乐性能瓶颈

图解原理:搞定十大经典游戏音乐性能瓶颈

图解原理:搞定十大经典游戏音乐性能瓶颈 官方文档翻了三遍还是晕?别慌,这毛病太常见了。 直接看图解原理,把十大经典游戏音乐加载慢的根子挖出来。 咱们不整虚的,直接上代码对比,看怎么把帧率从 30 拉回 60。…

2026/9/23 19:36:44 阅读更多 →
loop-sandbox 实战:用临时 git worktree 为 AI Agent 提供可审查的隔离执行环境

loop-sandbox 实战:用临时 git worktree 为 AI Agent 提供可审查的隔离执行环境

人工智能AI AgentAgent 工作流CLI研发协作AI 技能MCP 服务 【免费下载链接】loop-engineering Practical patterns, starters & CLI tools for loop engineering with AI coding agents. Design systems that prompt and orchestrate agents (inspired by Addy Osmani and …

2026/9/23 19:36:44 阅读更多 →
Terminal.Gui.Editor 渲染管线全解析:从 VisualLineBuilder 到 CellVisualLine 的单元格网格渲染架构

Terminal.Gui.Editor 渲染管线全解析:从 VisualLineBuilder 到 CellVisualLine 的单元格网格渲染架构

UI组件跨平台桌面应用 【免费下载链接】Terminal.Gui Cross Platform Terminal UI toolkit for .NET 项目地址: https://gitcode.com/gh_mirrors/te/Terminal.Gui 点击查看 免费下载 本文深入剖析 Terminal.Gui 生态中可复用文本编辑器 Terminal.Gui.Editor 的渲染…

2026/9/23 19:36:44 阅读更多 →
Win8商店应用隐私声明:从被拒到过审的完整实践

Win8商店应用隐私声明:从被拒到过审的完整实践

从第一版易网新闻阅读器提交到 Windows 8 商店的第三天开始,我的收件箱里躺了一封微软的审核驳回通知,原因一栏写得很直接:application does not provide a privacy statement。当时的我确实有点懵——一个不要求注册、不采集手机号、不做地理…

2026/9/23 19:35:44 阅读更多 →

日新闻

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A…

2026/9/23 0:00:23 阅读更多 →
2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我 刚把开发环境的显示器从1080P换到2K,跑老项目直接报错,版本升级后 API…

2026/9/23 0:01:25 阅读更多 →
3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点 官方文档翻了三遍还是云里雾里?别急,美眉图在实战项目中常被用来做数据可视化,但它的原理比你想的简单。今天咱们直接上手,用一个完整的小项目把美眉图跑通,不再死磕那些冗长的理论说明。…

2026/9/23 0:01:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →