illx10000

青春不是年华,而是心境

密码学基础

2019年4月5日 星期五, 发表于 深圳

如果你对本文有任何的建议或者疑问, 可以在 这里给我提 Issues, 谢谢! :)

密码学基础知识 是工作中必须要的技能之一

1. 问题起源

背景:后台需要生成一些ID带给终端,根据这些ID追踪链路;
要求:ID不重复(至少大概率不重复),保证不可伪造,通过ID断定是否是后台生成,以及一些解析出生成的时候携带的一些基本信息;
解决方案:

  1. 通过对称加密算法加密基本信息的安全性;
  2. 通过md5的类似的信息摘要算法以及盐生成数字签名,保证ID唯一性,以及不被伪造;
  3. 通过动态秘钥的算法保证秘钥不被暴力破解秘钥;

消息在传输过程中需要考虑的接个问题: https://www.cnblogs.com/songwenlong/p/5944139.html

  1. 安全性: 保证消息在传输过程中不被窃取;
  2. 完整性: 保证消息不被篡改,通常使用数字签名来实现;
  3. 真实性: 保证数据确实来自于发送方,传输过程中没有被替换,并且发送方不可抵赖;

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算法原理完整版 大致步骤为:

  1. IP交换;
  2. 秘钥交换;
  3. 秘钥置换;
  4. E扩展置换;
  5. S盒代替;
  6. P盒置换;
  7. IP-1末置换;

2.2 AES加密算法

AES加密算法是目前使用的最普遍的对称加密算法:

最近着重了解了一下AES加密的方式; 从整体来说,aes是分块加密,从整理流程上来看:

  1. 将明文分为与密钥大小相同的块,密钥长度只能是128,192,256 位;
  2. 每一块与密钥之间,进行多轮加密运算:(为了提高明文的扩散性)
    • 初始轮:(1次,1步)
      • 加轮密钥(AddRoundKey)
    • 普通轮:(N次,4步)
      • 字节代替(SubBytes)
      • 行移位(ShiftRows)
      • 列混淆(MixColumns)
      • 加轮密钥(AddRoundKey)
    • 最终轮:(1次)
      • 字节代替(SubBytes)
      • 行移位(ShiftRows)
      • 加轮密钥(AddRoundKey)
  3. 模式(CBC,CFB等)描述了数据块之间的关系,例如加密第二个数据块的时候,是否需要用到第一个数据块;
  4. 填充(PKCS5,NoPadding等)描述了当加密的明文长度不是密钥长度的整数倍时候,填充的逻辑;
  5. 初始化向量(IV)为了使得加密更随机,让攻击者难以对同一个密钥的密文解密;

aes相关参考资料:

虽然上面说的流程,但是理解其真正的原理还是有一定的挑战性的,尤其是其中多轮加密中的列混淆, 伽罗华域上的四则运算尤其比较难理解,不过认证看一下总会有一些收获