对称加密和非对称加密

加密技术

本文只是自我记录,不做任何技术参考。

数据加密,大体分为两类:对称加密和非对称加密。对称加密根据密码,大体可以分成:分组密码和流密码。
对称的分组密码主要有:DES和AES.非对称主要是RSA和椭圆。流密码暂时没看明白,后续补充

非对称加密并不比对称加密安全。加密的破解只取决于密钥的长度。

对称加密

对称加密,就是加密和解密使用的是相同的密码。主要是置换和混淆变更。
1.DES
DES历史不介绍,DES是标准的Feistel 密码结构。
Feistel 密码结构密码大概结构如下:
加密流程:
令F 为轮函数;令K1,K2,……,Kn 分别为第1,2,……,n 轮的子密钥。那么基本构造过程如下:
(1)将明文信息均分为两块:(L0,R0);
(2)在每一轮中,进行如下运算(i 为当前轮数):
Li+1 = Ri;
Ri+1 = Li ⊕F (Ri,Ki)。(其中⊕为异或操作)
所得的结果即为:(Ri+1,Li+1)。

数据要求:明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位, 使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。

因为涉及分组和置换,所以数据长度不对,必须填充。填充算法必须指定的原因是解密的时候好去掉填充,不然没法区分真实数据。

双倍长和三倍长,其实就是把des做几遍。第一遍是加密,第二遍是解谜,第三遍是加密。其中第二遍是解谜,不是安全的考虑,只是为了兼容单倍长而已。目前双倍长基本不用,都是单倍长和三倍长。
所以3des加密,密钥不能是64位重复的,重复的话就是单倍长,没有实际意义。

2.AES
AES不是Feistel 密码结构。
AES执行顺序。
对称加密和非对称加密_第1张图片

AES 同样是需要填充的。

对称密码,都有自己的置换规则:明文的置换,密钥的置换扩展。如果要做白盒密码,就是需要在置换过程中,隐藏自己的密码。

非对称密码

非对称是数学运算。
RSA根本就是数据运算。所以加密明文大小必须小于私钥长度,不然会溢出。
所以涉及大数据,必须拆分。实现是自己需要注意。
RSA的填充,其实只是为了增加数据的随机性。主要是用OEAP的模式,pkcs11的填充太固定。OEAP的填充参加本博客其他文章,里面有关于实现的部分。
使用OEAP填充时,注意下跨平台实现的不同。不同语言对于这部分稍微有些区别。

其实可以自定义填充规则,加解密的时候传入无填充的模式,自己去填充。

椭圆算法的数学知识太复杂,没看懂。目前没有看到太多关于椭圆算法的解析和攻击描述,所以椭圆的安全性,目前没有找到确切的官方表述。这点需要注意,使用的时候,尽量考虑RSA,而且因为椭圆对于数学要求太高,对于用户真的不友好,跨平台的时候这点最明显。

综述

加密算法,不管是哪种,都是对数据长度有要求的。使用的时候注意一下。特别是对称加密,涉及的加密模式,ECB,CBC。。。这样的自己实现时候注意上下文的关联。

再强调下:非对称加密不一定比对称加密安全,只是非对称的密钥好管理点。选用加密的时候,需要根据自己的实际情况。非对称可以做基础时期的密钥交换和数据签名。数据交互,推荐还是使用对称密钥,因为计算快。非对称因为长度原因,涉及的计算量太大,不适合大数据传输和实时性要求。

如果需要明确加密算法的每一步,推荐看下 openSSL的源码,有所有的加解密算法的实现。

你可能感兴趣的:(自我记录有意思的事情)