对称密码体制

对称密码:要求加密与解密使用同一个共享密钥。故要求通信双方必须在通信前商定密钥并妥善保存。

对称密码体制分两种:

一、流密码:对明文的单个位(或字节)进行运算,明文加密后密文基本保持和明文同样长度。常用流密码算法有RC4、SEAL等。

          同步流密码发送方和接收方在传递信息时同步进行加解密操作,密文内容如果在传输过程中被篡改删除或者插入,会导致同步失效,解密失败。必须重新同步来实现解密,恢复密文。如果传输过程中一个加密位改变,则只影响该位的恢复,对后续密文不影响。但是,主动攻击者可以选择性的对密文字符进行改动,并准确知道这些改动对明文的影响。因此,同步流密码具有同步性,无错误传递性、主动攻击性三种特性。适用于为音频或视频数据提供版权保护。

        自同步流密码与同步流密码相比,是一种有记忆变换的密码。每一个密钥与已产生的固定数量的密文位有关,密钥由已生成的密文决定。在密文传输过程中如果一个密文位发生改变,该位的变化会影响到后续有限位(如n位)的密文正确解密。

 

 

二、分组密码:将明文信息划分成不同的组(或块),分别对每个组(或块)进行运算。多用于网络加密。分组长度越长,密码分析越困难,越不利于操作和运算,分组长度应权衡安全性与实用性。常用的有DES、AES等

 

DES算法

        DES算法将明文分组的大小为64比特的加密区块,再以加密区块为单位进行加密处理,DES使用的密钥长度为64比特,但由于每隔7个比特设置一个奇偶校验位,因此其密钥长度实际为56比特。奇偶校验为最简单的错误检测码,即根据一组二进制代码中1的个数是奇数或偶数来检测错误。最后剩下的不足一块的大小称为短块,处理方法有填充法、流密码加密法、密文挪用技术。

        根据数据加密时每个加密区块的关联方式不同,可分为四种工作模式:电子密码本模式(Electronic Code Book,ECB)、密文链接模式(Cipher Book Chaining,CBC)、密文反馈模式(Cipher Feed Back, CFB) 、输出反馈模式(Output Feed Back, OFB)。AES标准除了以上四种工作模外还推荐了一种:计数器模式(Counter,CTR)

       1、 ECB:每次加密产生独立密文分组,每组加密结果不对别组产生影响,相同明文加密产生相同密文,无初始化向量。

              优点:简单易行,没有误差传递的问题

              缺点:不能隐藏明文的模式,明文重复密文也会重复,对明文进行主动攻击的可能性较高

              用途:适合加密密钥、随机数等短数据,例如安全传递DES密钥,ECB是最适合的模式

       2、CBC: 明文加密前先与前面的密文进行异或后再加密,因此只要选择不同的初始向量,就会产生不同的密文。

              优点:加密后的密文上下文关联,即使明文相同密文也不同;密文内容如果被替换、删除或在网络传输中发生错误,后                              续密文即被破坏,无法解密还原。

              缺点:不利于计算,误差传递,如果在加密的过程中发生错误,错误将会被无限放大,导致加密失败,需要初始化向量

              用途:可加密任意长度的数据,适用于计算产生监测数据完整性的消息认证码MAC

对称密码体制_第1张图片

       3、CFB: 类似于自同步流密码,分组加密后将密文和明文进行移位异或狗得到输出。

                        优点:隐藏了明文的模式,分组密码转换为流模式,可产生密钥流,可及时加密传送小于分组的数据。

                        缺点:与CBC相似,不利于并行计算,误差传送,需要初始化向量。

                        用途:引错误传播无界,可用于检查发现明文密文的篡改

对称密码体制_第2张图片

             4、OFB: 将分组密码作为同步流密码运行,没有错误扩散的问题。与明文分组进行异或的输入部分是反复加密后得到的

                             优点:隐藏明文模式;分组密码转换为流模式;无误差传送问题;可及时加密传送小于分组的数据。

                             缺点:不利于进行计算,对明文的主动攻击是可能的;安全性低于CFB

                             用途:适用于加密冗余性较大的数据,比如语音,图像数据;

对称密码体制_第3张图片

          5、CTR: 通过将逐次累加的计数器进行加密来生成密钥流的流密码,在CTR模式中,每个分组对应一个逐次累加的计数器,并通过对计数器进行加密来生成密钥流。最终的密文分组是通过将计数器加密得到的比特序列与明文分组进行XOR而得到的。

               优点:可并行计算,安全性至少与CBC一样;加密解密仅涉及密码算法的加密;

               缺点:没有错误传播,不易确保数据完整性

               用途:各种加密应用

对称密码体制_第4张图片

 

3DES算法

3DES是DES加密算法的一种模式,它使用3条64位的密钥对数据进行三次加密。

3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准),是DES的一个更安全的变形,可以理解为DES的升级版。它以DES为基本模块,通过组合分组方法设计出分组加密算法。

设Ek()和Dk()代表DES算法的加密和解密过程,Kn代表DES算法使用的密钥,P代表明文,C代表密表,这样,

  3DES加密过程为:C=Ek3(Dk2(Ek1(P)))

  3DES解密过程为:P=Dk1((EK2(Dk3(C)))

K1、K2、K3决定了算法的安全性,若三个密钥互不相同,本质上就相当于用一个长为168位的密钥进行加密。多年来,它在对付强力攻击时是比较安全的。若数据对安全性要求不那么高,K1可以等于K3。在这种情况下,密钥的有效长度为112位

 

”DESede“是3DES的标签

SecretKey secretKey = new SecretKeySpec(keys, "DESede");
Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS7Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
cipher.doFinal(srcs);

AES 

高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥。

AES为分组密码,分组密码也就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文。在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节(每个字节8位)。密钥的长度可以使用128位、192位或256位。密钥的长度不同,推荐加密轮数也不同,如下表所示:

AES 密钥长度(32位比特字) 分组长度(32位比特字) 加密轮数
AES-128 4 4 10
AES-192 6 4 12
AES-256 8 4 14

jce中提供了加解密的api: 

AES支持五种模式:CBC,CFB,ECB,OFB,PCBC

private void AES(String src) {
    try {
        //生成安全密钥
        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
        keyGenerator.init(128);
        SecretKey secretKey = keyGenerator.generateKey();
        byte[] key = secretKey.getEncoded();
        SecretKey key1 = new SecretKeySpec(key, "AES");

        //加密
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, key1);
        byte[] content = src.getBytes("utf-8");
        byte[] encodeResult = cipher.doFinal(content);
        Log.i("AES", "AESEncode:" + Convert.toHexString(encodeResult));

        // 解密
        cipher.init(Cipher.DECRYPT_MODE, key1);
        byte[] decodeResult = cipher.doFinal(encodeResult);
        Log.i("AES", "AESDecode:" + new String(decodeResult));
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (NoSuchPaddingException e) {
        e.printStackTrace();
    } catch (InvalidKeyException e) {
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (BadPaddingException e) {
        e.printStackTrace();
    } catch (IllegalBlockSizeException e) {
        e.printStackTrace();
    }
}

 

你可能感兴趣的:(密码,密码)