常见编码及加解密
计算机中的数据都是按字节存储。一个字节(Byte)由 8 个二进制位(bit)组成,因此共有 2^8 = 256 种状态,从 00000000 到 11111111。
位、字节与表示方式
- bit 只有两种状态:0 或 1
- Byte = 8 bit,因此最多能表示 256 种状态
- 如果按无符号整数理解,范围是 0~255
- 如果按有符号整数(补码)理解,范围是 -128~127
- 同一串比特可以有不同含义,比如 01000001 可以表示数字 65,也可以表示字符 A
常见编码(Encoding)
编码的目标是让数据更易表示、传输或兼容。编码是可逆的,但不提供保密性。
- ASCII:早期英文字符编码,使用 7 bit,可表示 128 个字符
- Unicode:字符集标准,规定“字符是什么”,编码方案由 UTF-8/UTF-16/UTF-32 实现
- UTF-8:可变长度编码(1~4 字节),ASCII 兼容,Web 最常见
- UTF-16:2 或 4 字节,Windows/Java 生态常见
- UTF-32:固定 4 字节,简单但占空间
- GBK/GB2312:中文旧编码,兼容性强但国际化不足
- Hex(十六进制表示):1 字节用 2 个十六进制字符表示,常用于调试与展示
- Base64:把二进制转文本,3 字节变 4 字符,体积约增加 33%,常用于邮件、JSON 或传输二进制
- URL 编码:把非安全字符转成
%XX形式,保证 URL 传输安全 - JSON/HTML 转义:用
\\uXXXX或&等方式表示特殊字符
字节序(Endian)
端序只在“多字节数写入内存”时才有意义。
- 小端(Little Endian):低位字节放在低地址,主流 x86/x64 系统(含 Windows)使用
- 大端(Big Endian):高位字节放在低地址,一些网络协议或硬件常见
例子:数值 0x1234 写入内存
小端:34 12
大端:12 34
常见加解密与摘要
加密的目标是保密,需要密钥;解密用密钥还原数据。
哈希值(Hash)
哈希值(Hash Value),也叫哈希码、摘要、指纹,是把任意长度的数据映射为固定长度输出的结果。哈希是不可逆的,但“不可逆”不等于“不会碰撞”,只是碰撞概率足够小。
常见哈希长度(十六进制字符数):
- MD5:128 bit = 32 个十六进制字符(已不再安全)
- SHA-1:160 bit = 40 个十六进制字符(已不再安全)
- SHA-256:256 bit = 64 个十六进制字符(常用)
核心特性:
- 固定长度:输入再长,输出长度固定
- 不可逆:无法从哈希值反推原文
- 碰撞概率低:但并非绝对唯一,MD5/SHA-1 已有公开碰撞案例
应用场景:
- 密码存储:保存“加盐后的密码哈希”,不保存明文
- 数据校验:对比官方哈希值判断文件是否被篡改
- 数字签名:先哈希再签名,提高效率
- 区块链/内容寻址:通过哈希确保数据完整性
提示:校验完整性可用 SHA-256;密码存储应使用 bcrypt、scrypt 或 Argon2 这类专用密码哈希。
- 对称加密:AES、ChaCha20,同一把密钥加解密,速度快,适合大量数据
- 非对称加密:RSA、ECC,公钥加密/私钥解密,也可用于数字签名
- 哈希/摘要:MD5、SHA-1、SHA-256,不可逆,用于完整性校验
- 密码哈希:bcrypt、scrypt、Argon2,抗暴力破解,适合存储密码
- 数字签名:私钥签名、公钥验证,证明来源与完整性
编码 vs 加密 vs 哈希
- 编码:可逆,不需要密钥,目的在于表示或传输
- 加密:可逆,需要密钥,目的在于保密
- 哈希:不可逆(一般不需密钥),目的在于完整性与指纹
- 签名:证明来源与完整性,不等同于加密
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 琉璃幻彩的博客!
评论

