JAVA加密解密之对称加密

写的一个JAVA对称加密的工具类,支持DES、DESede、AES、Blowfish、RC2、RC4的加密解密。

DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1976年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),随后在国际上广泛流传开来。

DESede是由DES对称加密算法改进后的一种对称加密算法。使用 168 位的密钥对资料进行三次加密的一种机制;它通常(但非始终)提供极其强大的安全性。如果三个 56 位的子元素都相同,则三重 DES 向后兼容 DES。

AES,高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

Blowfish算法是一个64位分组及可变密钥长度的对称密钥分组密码算法,可用来加密64比特长度的字符串。32位处理器诞生后,Blowfish算法因其在加密速度上超越了DES而引起人们的关注。Blowfish算法具有加密速度快、紧凑、密钥长度可变、可免费使用等特点,已被广泛使用于众多加密软件。

RC2是由著名密码学家Ron Rivest设计的一种传统对称分组加密算法,它可作为DES算法的建议替代算法。它的输入和输出都是64比特。密钥的长度是从1字节到128字节可变,但目前的实现是8字节(1998年)。

RC4加密算法是大名鼎鼎的RSA三人组中的头号人物Ronald Rivest在1987年设计的密钥长度可变的流加密算法簇。之所以称其为簇,是由于其核心部分的S-box长度可为任意,但一般为256字节。该算法的速度可以达到DES加密的10倍左右,且具有很高级别的非线性。RC4起初是用于保护商业机密的。但是在1994年9月,它的算法被发布在互联网上,也就不再有什么商业机密了。RC4也被叫做ARC4(Alleged RC4——所谓的RC4),因为RSA从来就没有正式发布过这个算法。

import java.security.GeneralSecurityException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.SecretKeySpec;

/**
 * 对称加密
 *
 * @author jianggujin
 *
 */
public class SymmetricalCoder
{
   public static final String ALGORITHM_DES = "DES";
   public static final String ALGORITHM_DESede = "DESede";
   public static final String ALGORITHM_AES = "AES";
   public static final String ALGORITHM_Blowfish = "Blowfish";
   public static final String ALGORITHM_RC2 = "RC2";
   public static final String ALGORITHM_RC4 = "RC4";

   private Key toKey(String algorithm, byte[] key) throws InvalidKeyException,
         InvalidKeySpecException, NoSuchAlgorithmException
   {
      if (ALGORITHM_DES.equals(algorithm))
      {
         DESKeySpec dks = new DESKeySpec(key);
         SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(algorithm);
         SecretKey secretKey = keyFactory.generateSecret(dks);
         return secretKey;
      }

      return new SecretKeySpec(key, algorithm);
   }

   /**
    * 解密
    *
    * @param algorithm
    * @param data
    * @param key
    * @return
    * @throws InvalidKeyException
    * @throws InvalidKeySpecException
    * @throws NoSuchAlgorithmException
    * @throws NoSuchPaddingException
    * @throws IllegalBlockSizeException
    * @throws BadPaddingException
    */
   public byte[] decrypt(String algorithm, byte[] data, byte[] key)
         throws InvalidKeyException, InvalidKeySpecException,
         NoSuchAlgorithmException, NoSuchPaddingException,
         IllegalBlockSizeException, BadPaddingException
   {
      Key k = toKey(algorithm, key);

      Cipher cipher = Cipher.getInstance(algorithm.toString());
      cipher.init(2, k);

      return cipher.doFinal(data);
   }

   /**
    * 加密
    *
    * @param algorithm
    * @param data
    * @param key
    * @return
    * @throws InvalidKeyException
    * @throws InvalidKeySpecException
    * @throws NoSuchAlgorithmException
    * @throws NoSuchPaddingException
    * @throws IllegalBlockSizeException
    * @throws GeneralSecurityException
    */
   public byte[] encrypt(String algorithm, byte[] data, byte[] key)
         throws InvalidKeyException, InvalidKeySpecException,
         NoSuchAlgorithmException, NoSuchPaddingException,
         IllegalBlockSizeException, GeneralSecurityException
   {
      Key k = toKey(algorithm, key);
      Cipher cipher = Cipher.getInstance(algorithm.toString());
      cipher.init(1, k);

      return cipher.doFinal(data);
   }

   /**
    * 初始化密钥
    *
    * @param algorithm
    * @return
    * @throws NoSuchAlgorithmException
    */
   public byte[] initKey(String algorithm) throws NoSuchAlgorithmException
   {
      return initKey(algorithm, null);
   }

   /**
    * 初始化密钥
    *
    * @param algorithm
    * @param seed
    * @return
    * @throws NoSuchAlgorithmException
    */
   public byte[] initKey(String algorithm, byte[] seed)
         throws NoSuchAlgorithmException
   {
      SecureRandom secureRandom = null;

      if (seed != null)
      {
         secureRandom = new SecureRandom(seed);
      }
      else
      {
         secureRandom = new SecureRandom();
      }

      KeyGenerator kg = KeyGenerator.getInstance(algorithm.toString());
      kg.init(secureRandom);

      return kg.generateKey().getEncoded();
   }

   public static void main(String[] args) throws Exception
   {
      String algorithm = ALGORITHM_RC4;
      byte[] data = "jianggujin".getBytes();
      SymmetricalCoder coder = new SymmetricalCoder();
      byte[] key = coder.initKey(algorithm);
      byte[] result = coder.encrypt(algorithm, data, key);
      System.out.println(new String(coder.decrypt(algorithm, result, key)));
   }
}
时间: 2024-12-02 22:21:41

JAVA加密解密之对称加密的相关文章

php中des加密解密 匹配C#des加密解密 对称加密

原文:php中des加密解密 匹配C#des加密解密 对称加密 网上找来的 php des加密解密 完全匹配上一篇C# 字符串加密解密函数  可以用于C#和php通信 对数据进行加密,其中$key 是加密密钥,$iv 是偏移量,默认偏移量和加密密匙是一样的, <?php class DES {     var $key;     var $iv; //偏移量          function DES( $key, $iv=0) {     //key长度8例如:1234abcd       

java加密算法分享(rsa解密、对称加密、md5加密)_java

复制代码 代码如下: import java.io.UnsupportedEncodingException;import java.security.InvalidKeyException;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.security.PrivateKey;import java.security.PublicKey;import jav

各种加密解密函数(URL加密解密、sha1加密解密、des加密解密)

原文:各种加密解密函数(URL加密解密.sha1加密解密.des加密解密) 普通hash函数如md5.sha1.base64等都是不可逆函数.虽然我们利用php可以利用这些函数写出可逆函数来.但是跨语言时这类可逆函数非常难搞定.所以这时尽量使用AES DES RC4 Rabbit TripleDes这些方法. 包含超时的加密解密函数 1 /** 2 * 加密 3 * @param string $string 要加密或解密的字符串 4 * @param string $operation 加密

对称加密(3) NET对称加密体系

本节介绍System.Security.Cryptography名称空间中的对称加密类. 1. SymmetricAlgorithm类 SymmetricAlgorithm是抽象类,是所有对称加密算法的基类,该类定义的成员在其子类AES类中做介绍. 当使用派生类时,从安全的角度考虑,仅在使用完对象后强制垃圾回收是不够的.必须对该对象显式调用Clear方法,以便在释放对象之前将对象中所包含的所有敏感数据清零.注意,垃圾回收并不会将回收对象的内容清零,只是将内存标记为可用于重新分配.因而,垃圾回收对

对称加密(4) .NET对称加密实践

在使用.NET框架提供的加密算法实现类来执行加密任务时,需要准备加密密钥和初始化向量(Initialization Vector,IV).基于对称加密的特点,在加密数据之后一定要保存好密钥和初始化向量,因为解密要用到它们.但是对于不同的数据加密,要使用不同的密钥和初始化向量,理论上每次新的加密过程都应该使用全新的密钥和初始化向量. 通常需要将加密密钥和初始化向量传递给另一个人,这时候需要使用非对称加密算法来加密密钥和初始化向量,然后在网络上传输.本节主要演示如何使用加密实践类,更多的应用内容会在

.NET中的加密类(对称加密)

 对象层次结构     .NET Framework 安全系统实现可扩展模式的派生类继承.层次结构如下所示:      算法类型类,例如 SymmetricAlgorithm 或 HashAlgorithm.该级别为抽象.      从算法类型类继承的算法类,例如 RC2 或 SHA1.该级别为抽象.      从算法类继承的算法类的实现,例如 RC2CryptoServiceProvider 或 SHA1Managed.该级别是完全实现的.      使用这种模式的派生类,很容易添加新算法或现

Oracle定义DES加密解密及MD5加密函数示例_oracle

(1)DES加密函数 create or replace function encrypt_des(p_text varchar2, p_key varchar2) return varchar2 is v_text varchar2(4000); v_enc varchar2(4000); raw_input RAW(128) ; key_input RAW(128) ; decrypted_raw RAW(2048); begin v_text := rpad( p_text, (trunc

js加密解密:js 代码加密解密

<script>a=62;function encode() {var code = document.getElementById('code').value;code = code.replace(/[\r\n]+/g, '');code = code.replace(/'/g, "\\'");var tmp = code.match(/\b(\w+)\b/g);tmp.sort();var dict = [];var i, t = '';for(var i=0; i&

一个简单的php加密解密函数(动态加密)_php技巧

复制代码 代码如下: function encode_pass($tex,$key,$type="encode"){    $chrArr=array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',                  'A','B','C','D','E','F','G','H','I','J','K','L'