加密算法用以解决数据传输的安全问题,本工程收集整理开源资料并根据个人的理解和应用需要进行更改加工组合。
HASH是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值,散列值的空间通常远小于输入的空间,所以是一种压缩映射,但是不同的输入可能会散列成相同的输出,所以不能从散列值来确定唯一的输入值。
HASH算法的正向快速且不可逆,即加密后是很难解密出明文的,经常用于数据加密和数据校验。
HASH算法也可以检验信息是否是相同的,这样的优势可以节省重复文件传送的时间。
对称加密在加密和解密过程中用到的密钥是相同的,这种加密方式加密速度非常快,适合经常发送数据的场合,其缺点是密钥的传输比较麻烦。
AES:Advanced Encryption Standard,又称Rijndael加密法,旨在取代DES成为广泛使用的标准,微信小程序加密传输采用该加密算法。
AES为分组密码,分组密码也就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文。在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节(每个字节8位)。密钥的长度可以使用128位、192位或256位。密钥的长度不同,加密轮数也不同。
AES加密函数E,密文C = E(K, P),其中P为明文,K为密钥。 AES解密函数D,明文P = D(K, C),其中C为密文,K为密钥。
实际应用一般是通过RSA加密AES的密钥,传输到接收方,接收方解密得到AES密钥,然后发送方和接收方用AES密钥来通信。
RSA是第一个比较完善的公开密钥算法,既能用于加密也能用于数字签名,RSA以它的三个发明者Ron Rivest, Adi Shamir, Leonard Adleman首字母命名
RSA的安全基于大数分解的难度。其公钥和私钥是一对大素数(100到200位十进制数或更大)的函数。从一个公钥和密文恢复出明文的难度,等价于分解两个大素数之积。
虽然RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何。
在实际应用中,RSA密钥一般是1024位或2048位。
RSA缺点还有:
-
产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。
-
为保证安全性运算代价很高,速度较对称密码算法慢几个数量级,随着大数分解能力提高这个长度还在增加,不利于数据格式标准化。
Diffie-Hellman密钥协商算法解决在公网通道上如何进行安全的秘钥分派,本身并非用来加密用的,目的是在通讯双方在完全没有对方任何预先信息的条件下通过不安全信道创建起一个密钥。
Curve25519是目前最高水平的Diffie-Hellman函数,Curve25519的设计过程完全公开,相比广泛使用的椭圆曲线NIST系列没有任何来历不明的参数,性能远远超过NIST系列。
Curve25519/Ed25519/X25519 是著名密码学家 Daniel J. Bernstein 设计的椭圆曲线加密/签名/密钥交换算法,独立于现有的任何椭圆曲线算法。
25519系列曲线自2006年发表以来除了学术界无人问津,2013年斯诺登曝光棱镜计划后该算法大火,OpenSSH增加了对25519系列的支持,25519已是大趋势
Ed25519是一个数字签名算法,签名和验证的性能都极高,签名过程不依赖随机数生成器,不依赖hash函数的防碰撞性,没有时间通道攻击的问题,并且签名很小,只有64字节,公钥也很小,只有32字节。
25519系列曲线是目前最快的椭圆曲线加密算法,具有比P-256更高的安全性。