密码学基础
2019年4月5日 星期五, 发表于 深圳
如果你对本文有任何的建议或者疑问, 可以在 这里给我提 Issues, 谢谢! :)
密码学基础知识 是工作中必须要的技能之一
1. 问题起源
背景:后台需要生成一些ID带给终端,根据这些ID追踪链路;
要求:ID不重复(至少大概率不重复),保证不可伪造,通过ID断定是否是后台生成,以及一些解析出生成的时候携带的一些基本信息;
解决方案:
- 通过对称加密算法加密基本信息的安全性;
- 通过md5的类似的信息摘要算法以及盐生成数字签名,保证ID唯一性,以及不被伪造;
- 通过动态秘钥的算法保证秘钥不被暴力破解秘钥;
消息在传输过程中需要考虑的接个问题: https://www.cnblogs.com/songwenlong/p/5944139.html
- 安全性: 保证消息在传输过程中不被窃取;
- 完整性: 保证消息不被篡改,通常使用数字签名来实现;
- 真实性: 保证数据确实来自于发送方,传输过程中没有被替换,并且发送方不可抵赖;
2. 对称加密算法
对称加密使用同一个秘钥,通常使用密钥对原文做 异或,置换,代换,移位操作,通常有DES,3DES,AES,RC4,TEA算法。
通常使用AES加密算法,不过也了解一下其他基本加密算法原理
2.1 xor加密
xor 异或操作,有一个特点,经过两次异或操作之后可以返回原值,因此可以用来加密;
参考 https://github.com/illx10000/relax/blob/master/algorithm/xor.cpp 其中有convert64函数有展开证明;
2.2 DES加密算法
DES是一种分组算法,每一组分为8个字节64位,其中秘钥与明文等长,其基本处理流程为
参考:DES算法原理完整版
大致步骤为:
- IP交换;
- 秘钥交换;
- 秘钥置换;
- E扩展置换;
- S盒代替;
- P盒置换;
- IP-1末置换;
2.2 AES加密算法
AES加密算法是目前使用的最普遍的对称加密算法:
最近着重了解了一下AES加密的方式; 从整体来说,aes是分块加密,从整理流程上来看:
- 将明文分为与密钥大小相同的块,密钥长度只能是128,192,256 位;
- 每一块与密钥之间,进行多轮加密运算:(为了提高明文的扩散性)
- 初始轮:(1次,1步)
- 加轮密钥(AddRoundKey)
- 普通轮:(N次,4步)
- 字节代替(SubBytes)
- 行移位(ShiftRows)
- 列混淆(MixColumns)
- 加轮密钥(AddRoundKey)
- 最终轮:(1次)
- 字节代替(SubBytes)
- 行移位(ShiftRows)
- 加轮密钥(AddRoundKey)
- 初始轮:(1次,1步)
- 模式(CBC,CFB等)描述了数据块之间的关系,例如加密第二个数据块的时候,是否需要用到第一个数据块;
- 填充(PKCS5,NoPadding等)描述了当加密的明文长度不是密钥长度的整数倍时候,填充的逻辑;
- 初始化向量(IV)为了使得加密更随机,让攻击者难以对同一个密钥的密文解密;
aes相关参考资料:
- https://github.com/kokke/tiny-AES-c
- https://www.sohu.com/a/200488301_478315
- https://blog.csdn.net/qq_28205153/article/details/55798628
- https://github.com/matt-wu/AES
- https://zhuanlan.zhihu.com/p/41716899
- https://blog.csdn.net/bupt073114/article/details/27382533
- https://blog.csdn.net/luotuo44/article/details/41645597
- http://staff.ustc.edu.cn/~huangwc/crypto/4.pdf
虽然上面说的流程,但是理解其真正的原理还是有一定的挑战性的,尤其是其中多轮加密中的列混淆, 伽罗华域上的四则运算尤其比较难理解,不过认证看一下总会有一些收获