加密算法基础95 条

十六进制编码

把每个字节表示为两个十六进制字符:密钥、散列、随机数与抓包内容普遍以 hex 展示;解析时注意大小写与长度校验。

加密与证书速查安全更新于 2026-10-13

十六进制编码是什么

十六进制编码把每个字节表示成两个十六进制字符,是最常见的二进制可视化方式:密钥、散列、随机数与抓包内容默认都以 hex 展示。它的优点是字符集固定、与字节一一对应、不受显示环境影响;缺点是体积正好翻倍,而且人眼几乎无法直接读出内容。解析时的关键约束很简单:长度必须是偶数,且只能出现十六进制字符。

基本信息

换算1 字节 = 2 个 hex 字符,32 字节密钥等于 64 个字符
大小写解析通常不敏感,展示与存储建议统一小写
常见工具openssl 的 -hex 选项、xxd -p、十六进制编辑器
长度校验奇数长度即非法,解析前先校验
常见场景证书指纹、散列值、AES 密钥、抓包内容

典型使用场景

  • 校验散列与指纹:比对 SHA-256 摘要或证书指纹时用 hex 逐字符对照
  • 生成随机密钥:openssl rand -hex 得到便于复制粘贴的密钥文本
  • 调试二进制协议:抓包内容以 hex 展示,逐字节分析结构
  • 代码中表示常量密钥:配置里以 hex 字符串保存,运行时再解码
  • 排查编码错误:先确认是 hex 还是 base64,避免解码后长度不符

常见操作

常见操作
openssl rand -hex 16          # 输出 32 个字符,即 16 字节
echo -n 'hi' | xxd -p         # 输出 6869
echo 6869 | xxd -r -p         # 还原为 hi
# 在脚本里做合法性校验,避免把奇数长度字符串丢给解码器
python -c "import binascii; binascii.unhexlify('6869')"

长度直觉对照

字节数hex 字符数常见对应
1632MD5 摘要、AES-128 密钥
2040SHA-1 摘要
3264SHA-256 摘要、AES-256 密钥
4896SHA-384 摘要
看到 64 个 hex 字符时应先判断它可能是 32 字节,例如 SHA-256 摘要或 AES-256 密钥;长度本身就是类型线索。
hex 与 base64 是两种不同编码:同样 32 字节的数据,hex 给出 64 个字符、base64 约 44 个字符,长度对不上通常说明用错了编码。
大小写虽被解析器容忍,但用于字符串比较时要统一:AB 与 ab 会被判为不同,导致校验莫名其妙地失败。日志里也不要完整打印密钥的 hex 值。

易错点

  • 奇数长度的 hex 字符串非法,解析前先校验长度与字符合法性
  • 把 hex 字符串误当二进制密钥传入(或反之)会产生长度不符或静默错误的结果
  • 把 hex 与 base64 混用,解码后长度对不上
  • 用字符串比较判断 hex 是否相等时忽略大小写差异,导致校验失败
  • 在日志中完整打印私钥或密钥的 hex 值,等于把敏感信息写进日志系统

数据来源与参考

  • RFC 4648 §8(Base16 / hex)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌