Java加密技术——对称加密算法一览

Java加密技术(二)——对称加密算法

   Java对称加密算法,最常用的莫过于DES数据加密算法。 
DES 
Data Encryption Standard,即数据加密算法。是IBM公司于1975年研究成功并公开发表的。DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密[Java代码就是2个常量]。 
  DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位。 

DES算法是这样工作的:如Mode为加密时,则用Key 去把数据Data进行加密, 生成Data的密码形式(64位)作为DES的输出结果;如Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果。在通信网络的两端,双方约定一致的Key,在通信的源点用Key对核心数据进行DES加密,然后以密码形式在公共通信网(如电话网)中传输到通信网络的终点,数据到达目的地后,用同样的Key对密码数据进行解密,便再现了明码形式的核心数据。这样,便保证了核心数据(如PIN、MAC等)在公共通信网中传输的安全性和可靠性。 
  通过定期在通信网络的源端和目的端同时改用新的Key,便能更进一步提高数据的保密性,这正是现在金融交易网络的流行做法。

 DES基本原则

DES设计中使用了分组密码设计的两个原则:混淆(confusion)和扩散(diffusion),其目的是抗击敌手对密码系统的统计分析。混淆是使密文的统计特性与密钥的取值之间的关系尽可能复杂化,以使密钥和明文以及密文之间的依赖性对密码分析者来说是无法利用的。扩散的作用就是将每一位明文的影响尽可能迅速地作用到较多的输出密文位中,以便在大量的密文中消除明文的统计结构,并且使每一位密钥的影响尽可能迅速地扩展到较多的密文位中,以防对密钥进行逐段破译。

 

DES安全编码组件 

支持 DES、DESede(TripleDES,就是3DES)、AES、Blowfish、RC2、RC4(ARCFOUR) 

1、DES ----key size must be equal to 56 

2、DESede(TripleDES) ----key size must be equal to 112 or 168 

3、AES---- key size must be equal to 128, 192 or 256,but 192 and 256 bits may not be available 

4、Blowfish---key size must be multiple of 8,andcan only range from 32 to 448 (inclusive) 

5、RC2----key size must be between 40 and 1024 bits 

6、RC4(ARCFOUR)---key size must be between 40 and 1024 bits 

 

Java代码实现---实例

package com.ljh.password;

 

import java.security.InvalidKeyException;

import java.security.NoSuchAlgorithmException;

import java.security.SecureRandom;

 

import javax.crypto.BadPaddingException;

import javax.crypto.Cipher;

import javax.crypto.IllegalBlockSizeException;

import javax.crypto.KeyGenerator;

import javax.crypto.NoSuchPaddingException;

import javax.crypto.SecretKey;

 

/**

 * DES[数据加密标准]--对称加密

 * 只有一个密钥

 * @author ljheee

 *

 */

public class DESencrypt extendsEncryptDecorator{

    static String ALGORITHM = “DES”;//此处指定不同算法,可替换上面6种不同参数

    static SecretKey secretKey = null;

    static Cipher cipher = null;//Cipher类为加密和解密提供密码功能

   

    public DESencrypt() {//空构造方法

    }

 

    static{//静态代码块--生成密钥

        try {

            KeyGenerator keyGenerator =KeyGenerator.getInstance(ALGORITHM);

            keyGenerator.init(new SecureRandom());

            secretKey =keyGenerator.generateKey();//生成密钥

           

            cipher = Cipher.getInstance(ALGORITHM);//获得一个Cipher 实例,后面加密 、解密 需要用到 它提供的方法

           

        } catch(NoSuchAlgorithmException e) {

            e.printStackTrace();

        } catch(NoSuchPaddingException e) {

            e.printStackTrace();

        }

    }

   

    /**

     * DES--加密

     * @param data    源数据[待加密]

     * @return 加密后的byte[]数组

     */

    public byte[] desEncrypt(byte[] data){

        byte[] result= null;

        try {

            cipher.init(Cipher.ENCRYPT_MODE, secretKey);//Cipher 初始化--指定处理模式 和完成处理所用的密钥

            result = cipher.doFinal(data);

        } catch(InvalidKeyException e) {

            e.printStackTrace();

        } catch(IllegalBlockSizeException e) {

            e.printStackTrace();

        } catch(BadPaddingException e) {

            e.printStackTrace();

        }

        return result;

       

    }

   

    /**

     * DES--解密

     * @param data    源数据[待解密]

     * @return

     */

    public byte[] desDeEncrypt(byte[] data){

        byte[] result= null;

        try {

            cipher.init(Cipher.DECRYPT_MODE, secretKey);

            result = cipher.doFinal(data);

        } catch(InvalidKeyException e) {

            e.printStackTrace();

        } catch(IllegalBlockSizeException e) {

            e.printStackTrace();

        } catch(BadPaddingException e) {

            e.printStackTrace();

        }

        return result;

    }

   

    public static void main(String[] args) {

        DESencrypt des = new DESencrypt();

       

        byte[] str = null;

        str = des.desEncrypt("123456".getBytes());

        System.out.println(str);//输出加密后的   数据

   

        System.out.println(new String(des.desDeEncrypt(str)));//输出解密后的数据

    }

}

输出结果:

加密后的 数据:[B@1faba46

123456

由控制台得到的输出,我们能够比对加密、解密后结果一致,都是原始123456。这是一种简单的加密解密方式,只有一个密钥。 
 其实DES有很多同胞兄弟,如DESede(TripleDES)、AES、Blowfish、RC2、RC4(ARCFOUR)。使用方式大同小异,只要换掉ALGORITHM换成对应的值;此外就是他们的不同之处--密钥长度不同了。 

       DES算法具有极高安全性,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法。而56位长的密钥的穷举空间为256,这意味着如果一台计算机的速度是每一秒种检测一百万个密钥,则它搜索完全部密钥就需要将近2285年的时间,可见,这是难以实现的,当然,随着科学技术的发展,当出现超高速计算机后,我们可考虑把DES密钥的长度再增长一些,以此来达到更高的保密程度。 

 

 

 

你可能感兴趣的:(Java加密技术,Java加密技术)