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

news/2024/7/1 2:49:27

    转载请注明出处: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没有错误扩散问题。


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


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

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

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



http://lihuaxi.xjx100.cn/news/242217.html

相关文章

ui设计的文字怎样提高设计感呢?

相信很多做UI设计师的小伙伴们&#xff0c;在工作的时候经常会遇到一些瓶颈&#xff0c;例如设计的构思&#xff0c;文字的改动都是让人头疼的事情&#xff0c;下面小编本期就为大家分享一个ui设计的文字怎样提高设计感。 UI设计培训分享&#xff1a;ui设计的文字怎样提高设计感…

楼主考南师计算机学硕,南京师范大学考研详解:据说这所学校不太好考?嗯,是真的!...

学校&#xff1a;南京师范大学地区&#xff1a;江苏省属性&#xff1a;“211工程”院校、“双一流”世界一流学科建设高校关于南师大南京师范大学&#xff0c;地处江苏南京&#xff0c;拥有绝佳的地理位置。在全国第四轮学科评估中&#xff0c;2个学科获得A&#xff0c;4个学科…

人工神经网络是如何实现存算一体的

摘要 本文内容如题。 下图是一个神经元模型 可以将其抽象为一个数学函数yf(w1x1w2x2…wn*xnb)。也就是这个模型同时涵盖输入输出和进行计算。

sun.misc.BASE64Encoder找不到jar包的解决方法

1.右键项目-》属性-》java bulid path-》jre System Library-》access rules-》resolution选择accessible&#xff0c;下面填上** 点击确定即可&#xff01;&#xff01;&#xff01;2.在MyEclipse中编写Java代码时&#xff0c;用到了BASE64Decoder&#xff0c;import sun.misc…

平板电脑有没计算机功能,平板电脑的用途与功能

平板电脑是现在越来越流行的电子设备&#xff0c;虽然在生活里很常见&#xff0c;但许多人对它的用途其实并不了解&#xff0c;最后盲目跟风的购买后只能放在家里吃灰&#xff0c;平板电脑真的只能用来看视频追剧吗?其实远远不止这些&#xff0c;下面就让我们一起来看看详细的…

Python培训基础教程都教哪些

根据相关数据统计&#xff0c;目前学习Python技术的同学大多数是零基础&#xff0c;都是从其他行业转型来学习的&#xff0c;那么Python培训基础教程都教哪些呢?好不好学呢?来看看下面的详细介绍。 Python培训基础教程都教哪些? 1、面向对象 类和对象、类的定义格式、添加和…

通用软件测试的6个角度

之后的课程都会围绕此展开 以QQ邮箱为例 外观界面测试 页面外观背景颜色、字体、字体格式、页面图案、动画、窗体布局功能测试 输入正确的用户名和密码可以登录&#xff0c;其他都不可性能测试 输入完邮箱的用户名和密码并单击登录按钮后&#xff0c;用户等待多长时间可以登录…

外部样式表声明的样式并不会进入style对象

在网页设计当中&#xff0c;我们注重网页的行为&#xff08;js&#xff09;、结构&#xff08;HTLM&#xff09;、样式&#xff08;css&#xff09;分离开 内联样式表或者内部样式表声明的样式信息都会进入style对象。 我们可以测试一下&#xff1a; 但是我们的外部样式表&…