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

原创 2015年07月09日 22:28:36

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

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


  对称加密

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

      对称加密采用单密钥加密方式,不论是加密还是解密都是用同一个密钥,即“一把钥匙开一把锁”。对称加密的好处在于操作简单、管理方便、速度快。它的缺点在于密钥在

网络传输中容易被窃听,每个密钥只能应用一次,对密钥管理造成了困难。对称加密的实现形式和加密算法的公开性使它依赖于密钥的安全性,而不是算法的安全性。


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



     对称加密的核心——通信双方共享一个密钥 通信过程:  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位作为密码的长度。首先,DES把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,并进行前后置换,最终由L0输出左32位,R0输出右32位,根据这个法则经过16次迭代运算后,得到L16、R16,将此作为输入,进行与初始置换相反的逆置换,即得到密文输出。DES算法具有极高的安全性,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法,而56位长密钥的穷举空间为256,这意味着如果一台计算机的速度是每秒种检测100万个密钥,那么它搜索完全部密钥就需要将近2285年的时间,因此DES算法是一种很可靠的加密方法。


    RC4算法

    RC4算法的原理是“搅乱”,它包括初始化算法和伪随机子密码生成算法两大部分,在初始化的过程中,密钥的主要功能是将一个256字节的初始数簇进行随机搅乱,不同的数簇在经过伪随机子密码生成算法的处理后可以得到不同的子密钥序列,将得到的子密钥序列和明文进行异或运算(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:最基本的加密模式,也就是通常理解的加密,相同的明文将永远加密成相同的密文,无初始向量,容易受到密码本重放攻击,一般情况下很少用。


  CBC:明文被加密前要与前面的密文进行异或运算后再加密,因此只要选择不同的初始向量,相同的密文加密后会形成不同的密文,这是目前应用最广泛的模式。CBC加密后的密文是上下文相关的,但明文的错误不会传递到后续分组,但如果一个分组丢失,后面的分组将全部作废(同步错误)。


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


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


   对称加密和非对称加密区别


      非对称加密与对称加密相比,其安全性大大提高好:对称加密的通信双方使用相同的秘钥,如果一方的秘钥遭泄露,那么整个通信就会被破解。而非对称加密使用一对秘钥,一个用来加密,一个用来解密,而且公钥是公开的,秘钥是自己保存的,不需要像对称加密那样在通信之前要先同步秘钥。但是非对称加密的缺点是加密和解密花费时间长、速度慢,只适合对少量数据进行加密。因此实际项目开发中我们需要根据需求场景合理选取加密方式,一般的对称加密足已满足我们的需要。


版权声明:本文为博主原创文章,请尊重原创,转载请标明地址。有问题请关注 [开发者技术前线] 咨询

各种加解密算法分类及其各自的安全性能对比

常用的加解密算法分三大类:非对称密钥加密算法
  • hqw19881118
  • hqw19881118
  • 2014年08月17日 16:08
  • 10037

17.app后端如何保证通讯安全--aes对称加密

在上文《16.app后端如何保证通讯安全--url签名》提到,url签名有两个缺点,这两个缺点,如果使用对称加密方法的话,则完全可以避免这两个缺点。在本文中,会介绍对称加密的具体原理,和详细的方案,使...
  • newjueqi
  • newjueqi
  • 2015年03月10日 18:09
  • 28524

密码学——对称加密&加密模式

加密机制,分为对称加密跟非对称加密,前者也叫做私钥加密,后者也叫做公钥加密。这篇文章单独来谈谈对称加密,可能有些地方说的不好或者不对,还望朋友们指正,共同探讨共同学习。         对称加密...
  • llovzy
  • llovzy
  • 2013年11月15日 14:19
  • 1632

Java安全(加密、摘要、签名、证书、SSL、HTTPS)

对于一般的开发人员来说,很少需要对安全领域内的基础技术进行深入的研究,但是鉴于日常系统开发中遇到的各种安全相关的问题,熟悉和了解这些安全技术的基本原理和使用场景还是非常必要的。本文将对非对称加密、数字...
  • shimiso
  • shimiso
  • 2013年01月06日 12:31
  • 10591

对称加密和非对称加密介绍和区别

转自:http://blog.sina.com.cn/s/blog_56d8ea900100bzpr.html 什么是对称加密技术?   对称加密采用了对称密码编码技术,它的特...
  • csCrazybing
  • csCrazybing
  • 2015年07月28日 20:48
  • 6374

Android安全-对称加密和非对称加密

秘钥:分为加密秘钥和解密秘钥 明文:没有进行加密,能够直接代表原文含义的信息 密文:经过加密处理之后,隐藏原文含义的信息 加密:将明文转换为密文的过程 解密:将密文转换为明文的过程 AES:更快,兼容...
  • namehybin
  • namehybin
  • 2016年01月07日 19:31
  • 2900

软考——加密与认证技术

一、加密技术1、对称加密:文件加密和解密使用相同的密钥2、非对称加密:有两个密钥,公开密钥和私有密钥。如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有...
  • u013036404
  • u013036404
  • 2015年10月20日 20:12
  • 1460

Android安全加密:非对称加密

介绍与对称加密算法不同,非对称加密算法需要两个密钥:公钥(publickey)和私钥(privatekey)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行...
  • axi295309066
  • axi295309066
  • 2016年09月10日 13:48
  • 4320

java安全之加密技术

加密方式对称加密算法只有一个密钥key进行加密解密,可以逆向加解密。1.凯撒密码古代有名的加密算法,将加密的数据进行一定的以为,属于对称加密,密钥key = 2(int 值)。这种加密非常简单,只需要...
  • itheimach
  • itheimach
  • 2016年08月02日 18:02
  • 1081

APP接口安全设计

[x] 下面是接口安全设计的一点心得,有不妥之处或者更好的建议欢迎一起讨论方案一 (客户端token方式)客户端生成token传给服务端校验,一致就通过用户验证。 通过时间戳+用户唯一标识+MD5...
  • Jhone_csdn
  • Jhone_csdn
  • 2016年07月14日 18:50
  • 3047
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【安全加密技术】 对称加密
举报原因:
原因补充:

(最多只允许输入30个字)