【安全加密技术】 对称加密

    转载请注明出处:http://blog.csdn.net/sk719887916/article/details/46822663

      上篇了解了《非对称加密》后 今天我来继续了解下加密技术中对称加密。


  对称加密

      对称加密是最传统的加密方式,比上非对称加密,缺少安全性,可是它依然是用的比較多的加密方法。

      对称加密採用单密钥加密方式,不论是加密还是解密都是用同一个密钥,即“一把钥匙开一把锁”。

对称加密的优点在于操作简单、管理方便、速度快。它的缺点在于密钥在

网络传输中easy被窃听,每一个密钥仅仅能应用一次,对密钥管理造成了困难。

对称加密的实现形式和加密算法的公开性使它依赖于密钥的安全性,而不是算法的安全性。


  对称加密原理以及对称加密算法 



     对称加密的核心——通信两方共享一个密钥 通信过程:  A有明文m,使用加密算法E,密钥key。生成密文c=E(key,m); B收到密文c,使用解密算法D,密钥key,得到明文

m=D(key,c);    比喻:  对称加密是最直观,也是历史最久远的加密手段,类似于加锁和解锁,仅仅只是钥匙的个数许多(~~2^100),一个人穷其一生也试不全然部可能的钥匙

因此加密密钥可以从解密密钥中推算出来,同一时候解密密钥也可以从加密密钥中推算出来。而在大多数的对称算法中,加密密钥和解密密钥是同样的,所以也称这样的加密算法为秘

密密钥算法或单密钥算法。它要求发送方和接收方在安全通信之前。商定一个密钥。对称算法的安全性依赖于密钥。泄漏密钥就意味着不论什么人都能够对他们发送或接收的消息解

密。所以密钥的保密性对通信性至关重要。

    主要加密算法

    上篇文章中就列举了几种关于对称加密算法,主要有DES算法,3DES算法,TDEA算法,Blowfish算法,RC5算法,IDEA算法。

      DES算法

      des算法把64位的明文输入块变为数据长度为64位的密文输出块,当中8位为奇偶校验位,另外56位作为password的长度。

首先。DES把输入的64位数据块按位又一次组合。并把输出分为L0、R0两部分,每部分各长32位,并进行前后置换,终于由L0输出左32位。R0输出右32位,依据这个法则经过16次迭代运算后。得到L16、R16,将此作为输入,进行与初始置换相反的逆置换,即得到密文输出。DES算法具有极高的安全性,到眼下为止。除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法。而56位长密钥的穷举空间为256。这意味着假设一台计算机的速度是每秒种检測100万个密钥,那么它搜索完所有密钥就须要将近2285年的时间。因此DES算法是一种非常可靠的加密方法。


    RC4算法

    RC4算法的原理是“搅乱”,它包含初始化算法和伪随机子password生成算法两大部分,在初始化的过程中,密钥的主要功能是将一个256字节的初始数簇进行随机搅乱,不同的数簇在经过伪随机子password生成算法的处理后能够得到不同的子密钥序列。将得到的子密钥序列和明文进行异或运算(XOR)后,得到密文。
因为RC4算法加密採用的是异或方式。所以。一旦子密钥序列出现了反复。密文就有可能被破解。可是眼下还没有发现密钥长度达到128位的RC4有反复的可能性,所以,RC4也是眼下最安全的加密算法之中的一个。



 既然说到对称加密 那么这里也略微提及一下向加密算法


     主要的单向加密算法: 


    MD5(Message Digest algorithm 5,信息摘要算法


    BASE64 严格地说,属于编码格式,而非加密算法

   SHA(Secure Hash Algorithm,安全散列算法)


   HMAC(Hash Message Authentication Code。散列消息鉴别码


  代码示列:


  1. public abstract class Coder {  
  2.     public static final String KEY_SHA = "SHA";  
  3.     public static final String KEY_MD5 = "MD5";  
  4.   
  5.     /** 
  6.      * MAC算法可选下面多种算法 .
  7.      *  
  8.      * <pre> 
  9.      * HmacMD5  
  10.      * HmacSHA1  
  11.      * HmacSHA256  
  12.      * HmacSHA384  
  13.      * HmacSHA512 
  14.      * </pre> 
  15.      */  
  16.     public static final String KEY_MAC = "HmacMD5";  
  17.   
  18.     /** 
  19.      * BASE64解密 .
  20.      *  
  21.      * @param key 
  22.      * @return 
  23.      * @throws Exception 
  24.      */  
  25.     public static byte[] decryptBASE64(String key) throws Exception {  
  26.         return (new BASE64Decoder()).decodeBuffer(key);  
  27.     }  
  28.   
  29.     /** 
  30.      * BASE64加密 .
  31.      *  
  32.      * @param key 
  33.      * @return 
  34.      * @throws Exception 
  35.      */  
  36.     public static String encryptBASE64(byte[] key) throws Exception {  
  37.         return (new BASE64Encoder()).encodeBuffer(key);  
  38.     }  
  39.   
  40.     /** 
  41.      * MD5加密 .
  42.      *  
  43.      * @param data 
  44.      * @return 
  45.      * @throws Exception 
  46.      */  
  47.     public static byte[] encryptMD5(byte[] data) throws Exception {  
  48.   
  49.         MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);  
  50.         md5.update(data);  
  51.   
  52.         return md5.digest();  
  53.   
  54.     }  
  55.   
  56.     /** 
  57.      * SHA加密 .
  58.      *  
  59.      * @param data 
  60.      * @return 
  61.      * @throws Exception 
  62.      */  
  63.     public static byte[] encryptSHA(byte[] data) throws Exception {  
  64.   
  65.         MessageDigest sha = MessageDigest.getInstance(KEY_SHA);  
  66.         sha.update(data);  
  67.   
  68.         return sha.digest();  
  69.   
  70.     }  
  71.   
  72.     /** 
  73.      * 初始化HMAC密钥 
  74.      *  
  75.      * @return.
  76.      * @throws Exception 
  77.      */  
  78.     public static String initMacKey() throws Exception {  
  79.         KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);  
  80.   
  81.         SecretKey secretKey = keyGenerator.generateKey();  
  82.         return encryptBASE64(secretKey.getEncoded());  
  83.     }  
  84.   
  85.     /** 
  86.      * HMAC加密 .
  87.      *  
  88.      * @param data 
  89.      * @param key 
  90.      * @return 
  91.      * @throws Exception 
  92.      */  
  93.     public static byte[] encryptHMAC(byte[] data, String key) throws Exception {  
  94.   
  95.         SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);  
  96.         Mac mac = Mac.getInstance(secretKey.getAlgorithm());  
  97.         mac.init(secretKey);  
  98.   
  99.         return mac.doFinal(data);  
  100.   
  101.     }  
  102. }  


加密模式

 

  ECB:最主要的加密模式。也就是通常理解的加密,同样的明文将永远加密成同样的密文。无初始向量,easy受到password本重放攻击。普通情况下非常少用。


  CBC:明文被加密前要与前面的密文进行异或运算后再加密,因此仅仅要选择不同的初始向量,同样的密文加密后会形成不同的密文,这是眼下应用最广泛的模式。

CBC加密后的密文是上下文相关的,但明文的错误不会传递到兴许分组,但假设一个分组丢失。后面的分组将所有作废(同步错误)。


  CFB:类似于自同步序列password,分组加密后。按8位分组将密文和明文进行移位异或后得到输出同一时候反馈回移位寄存器。长处最小能够按字节进行加解密,也能够是n位的,CFB也是上下文相关的。CFB模式下,明文的一个错误会影响后面的密文(错误扩散)。


   OFB:将分组password作为同步序列password执行。和CFB相似。只是OFB用的是前一个n位密文输出分组反馈回移位寄存器,OFB没有错误扩散问题。


   对称加密和非对称加密差别


      非对称加密与对称加密相比,其安全性大大提高好:对称加密的通信两方使用同样的秘钥,假设一方的秘钥遭泄露,那么整个通信就会被破解。

而非对称加密使用一对秘钥,一个用来加密。一个用来解密。并且公钥是公开的,秘钥是自己保存的,不须要像对称加密那样在通信之前要先同步秘钥。

可是非对称加密的缺点是加密和解密花费时间长、速度慢,仅仅适合对少量数据进行加密。因此实际项目开发中我们须要依据需求场景合理选取加密方式。一般的对称加密足已满足我们的须要。


原文地址:https://www.cnblogs.com/lytwajue/p/6805325.html