`

PBEWITHMD5ANDDES 加密

阅读更多

此加密算法为 PBEWITHMD5andDES, 带有salt,生成可变密文 , 性能较好的,使用简单。andorid下,java下测试可用。

package util;

import java.security.Key;
import java.security.SecureRandom;

import javax.crypto.Cipher;
 import javax.crypto.SecretKey;
 import javax.crypto.SecretKeyFactory;
 import javax.crypto.spec.PBEKeySpec;
 import javax.crypto.spec.PBEParameterSpec;
import android.annotation.SuppressLint;
import android.util.Base64;
 
 /**
  * PBE——Password-based encryption(基于密码加密)。<br>
  * 其特点在于口令由用户自己掌管,不借助任何物理媒体;采用随机数(这里我们叫做盐)杂凑多重加密等方法保证数据的安全性。<br>
  * 是一种简便的加密方式。<br>
  * 
  * @author <a href="mailto:hongtenzone@foxmail.com">hongten</a><br>
  * @date 2013-4-3<br>
  * 
  * @see <a href="http://blog.csdn.net/hexingzhi/article/details/7424872">原文</a>
  */
public class CipherPBEMd5Des {
	  
	      /**
	       * JAVA6支持以下任意一种算法 PBEWITHMD5ANDDES PBEWITHMD5ANDTRIPLEDES<测试的时候报错>
	       * PBEWITHSHAANDDESEDE<测试的时候报错> PBEWITHSHA1ANDRC2_40 PBKDF2WITHHMACSHA1<测试的时候报错>
	       * */
	  
	      /**
	       * 本地测试通过:<code>PBEWITHMD5ANDDES</code>,<code>PBEWITHSHA1ANDRC2_40</code>
	       */
	      
	      /**
	       * 定义使用的算法为:PBEWITHMD5andDES算法
	       */
	      public static final String ALGORITHM = "PBEWITHMD5ANDDES";
	  
	      /**
	       * 定义迭代次数为1000次,次数越多,运算越大,越不容易破解之类。
	       */
	      private static final int ITERATIONCOUNT = 190;//origin use 1000 
	      
	      private  String saltStr;
	      /**
	       * 获取加密算法中使用的盐值,解密中使用的盐值必须与加密中使用的相同才能完成操作. 盐长度必须为8字节的倍数
	       * 
	       * @return byte[] 盐值
	       * */
	      @SuppressLint("TrulyRandom")
	      private  byte[] getSalt() throws Exception {
	          // 实例化安全随机数  // 产出盐
	          SecureRandom random = new SecureRandom();
	          return random.generateSeed(32);
	      }
	      /**
	       * 根据PBE密码生成一把密钥
	       * 
	       * @param password
	       *            生成密钥时所使用的密码
	       * @return Key PBE算法密钥
	       * */
	    
		private  Key getPBEKey(String password) throws Exception {
	          // 实例化使用的算法
	          SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
	          // 设置PBE密钥参数
	          PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray());
	          // 生成密钥
	          SecretKey secretKey = keyFactory.generateSecret(keySpec);
	  
	          return secretKey;
	      }
	  
	      /**
	       * 加密明文字符串
	       * 
	       * @param plaintext
	       *            待加密的明文字符串
	       * @param password
	       *            生成密钥时所使用的密码
	       * @param salt
	       *            盐值
	       * @return 加密后的密文字符串
	       * @throws Exception
	       */
	      public  String encrypt(String plaintext, String password)
	              throws Exception {
	  
	          Key key = getPBEKey(password);
	          byte[] salt = getSalt();
	          saltStr = Base64.encodeToString(salt, Base64.DEFAULT);
	          
	          PBEParameterSpec parameterSpec = new PBEParameterSpec(salt,ITERATIONCOUNT);
	  
	          Cipher cipher = Cipher.getInstance(ALGORITHM);
	  
	          cipher.init(Cipher.ENCRYPT_MODE, key, parameterSpec);
	  
	         byte encipheredData[] = cipher.doFinal(plaintext.getBytes("UTF-8"));
	        
	         return Base64.encodeToString(encipheredData, Base64.DEFAULT);
	     }
	      public String getSaltStr(){
	    	  return saltStr;
	      }
	     /**
	      * 解密密文字符串
	      * 
	      * @param ciphertext
	      *            待解密的密文字符串
	      * @param password
	      *            生成密钥时所使用的密码(如需解密,该参数需要与加密时使用的一致)
	      * @param salt
	      *            盐值(如需解密,该参数需要与加密时使用的一致)
	      * @return 解密后的明文字符串
	      * @throws Exception
	      */
	     public  String decrypt(String ciphertext, String password, String saltStr)
	             throws Exception {
	 
	         Key key = getPBEKey(password);
	         byte[] salt = Base64.decode(saltStr,Base64.DEFAULT);
	         
	         PBEParameterSpec parameterSpec = new PBEParameterSpec(salt,
	                 ITERATIONCOUNT);
	 
	         Cipher cipher = Cipher.getInstance(ALGORITHM);
	 
	         cipher.init(Cipher.DECRYPT_MODE, key, parameterSpec);
	 
	         byte[] passDec = cipher.doFinal(Base64.decode(ciphertext, Base64.DEFAULT));
	         return new String(passDec);
	     }
	 
	 }

 

 

 

分享到:
评论

相关推荐

    C#版PBEWithMD5AndDES加解密.rar

    C#版PBEWithMD5AndDES加解密 有示例,可使用,如果需要修改 int md5iterations = 19; int segments = 1; salt

    java jasypt包PBEWithMD5AndDES算法加解密C#版

    Java 使用jasypt包辅助,实现密码加解密。本方法实现了C#版,适用于一方加密另一方解密的情况,根据默认配置改版,可在当前版本基础上自定义更改指定算法、hash迭代次数、salt生成方式等

    java与C#的PBE加密

    例如,在Java中使用PBEWithMD5AndDES加密的代码片段可能如下: ```java import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.PBEKeySpec...

    PBE是一种基于口令的加密算法,使用口令代替其他对称加密算法中的密钥,其特点在于口令由用户自己掌管,不借助任何物理媒体;

    PBE算法是对称加密算法的综合算法,常见算法PBEWithMD5AndDES,使用MD5和DES算法构建了PBE算法。将盐附加在口令上,通过消息摘要算法经过迭代获得构建密钥的基本材料,构建密钥后使用对称加密算法进行加密解密。 ...

    对称加密算法的PHP类.zip

     }常用对称加密算法类支持密钥:64/128/256 bit(字节长度8/16/32)支持算法:DES/AES(根据密钥长度自动匹配使用:DES:64bit AES:128/256bit)支持模式:CBC/ECB/OFB/CFB密文编码:base64字符串/十六进制字符串/二...

    Python 如何使用MD5或SHA1等算法对用户密码进行加密 Python源码

    Python 如何使用MD5或SHA1等算法对用户密码进行加密 Python源码Python 如何...Python源码Python 如何使用MD5或SHA1等算法对用户密码进行加密 Python源码Python 如何使用MD5或SHA1等算法对用户密码进行加密 Python源码

    C# MD5加密调用

    ### C# MD5加密调用 #### 一、概述 在现代软件开发中,数据安全性变得尤为重要。MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希算法,用于生成固定长度(通常为128位)的哈希值。由于其不可逆性,MD5经常...

    js版md5非对称加密算法

    js版md5非对称加密算法js版md5非对称加密算法js版md5非对称加密算法js版md5非对称加密算法js版md5非对称加密算法

    springboot之yml配置文件信息加密.docx

    Jasypt 使用的加密算法是 PBEWithMD5AndDES(对称加密),中文名“基于口令加密”,是一种基于密码的加密算法。该算法的特点是使用口令代替了密钥,而口令由用户自己掌管,采用随机数杂凑多重加密等方法保证数据的...

    DES加解密.rar

    Java des加密解密, 前端加密解密,后端加密解密,前后端可以配合使用。通过base64进行加密算法。

    SpringBoot 集成 Jasypt 对数据库加密以及踩坑

    在上面的配置中,我们设置了加密算法为 PBEWithMD5AndDES,这是 Jasypt 3.0.0 以后默认的加密算法。如果不设置这个算法,可能会导致密码无法正确加密。 在使用 Jasypt 进行加密时,需要注意的是,Jasypt 在 3.0.0 ...

    数据库密码配置加密操作步骤.doc

    java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="root" password=ahtt algorithm=PBEWithMD5AndDES ``` 其中,input 是需要加密的字符串,password 是需要对 input 字符串加密...

    Java加密技术

    在Java中实现PBE时,通常会结合杂凑函数和特定的加密算法,例如例子中的"PBEWITHMD5andDES",它将MD5杂凑函数与DES加密算法结合使用。 以下是一个简单的PBE加密和解密Java代码示例: 1. 在这个示例中,定义了一个...

    Jasypt加解密工具安装包

    基于JDK11 和 Jasypt java类库开发的加解密工具安装包 * 内置jdk11,无JDK环境也可使用 * 支持基于Jasypt的加密 * 支持基于Jasypt的解密 * 支持PBEWITHHMACSHA512ANDAES_256和PBEWithMD5AndDES方式加解密

    Springboot项目对数据库用户名密码实现加密过程解析

    其中,input参数指定要加密的密码,password参数指定加密时采用的秘钥,algorithm参数指定加密算法,默认为PBEWithMD5AndDES。执行命令后,我们将获得加密后的密码密文。 例如,使用上述命令对密码"password"进行...

    java简单加密包(jasypt-1.8-dist.zip)

    基本加密器使用了简单的对称加密算法,如PBEWithMD5AndDES,适合于快速实现基础加密需求。而强大的加密器则提供了更强的安全性,通常使用更高级的算法,如PBEWithHmacSHA256AndAES_128,这提供了更强的哈希和对称...

    基于java的开发源码-加密包 Jasypt.zip

    Strong Encryptor使用强加密算法(如PBEWithMD5AndDES或PBEWithSHA1AndDESede),提供更高的安全性;而Basic Encryptor则使用相对简单的标准加密算法,适合快速实现加密功能。 2. **环境变量和配置文件加密**:...

    SpringBoot项目application.yml文件数据库配置密码加密的方法

    在上述代码中,我们定义了一个`StandardPBEStringEncryptor`对象,并设置了加密算法`PBEWithMD5AndDES`以及一个密钥`test`。然后,我们分别进行了加密和解密操作。 完成加密后,可以将加密后的密码替换到`...

    java 加密

    Java的`javax.crypto.PBEKeySpec`和`PBEWith*`算法(如PBEWithMD5AndDES)提供了PBE的支持。 10. **testdsa.java**:这可能是一个测试类,用于验证DSA算法的功能,通常包括生成密钥对、签名和验证签名的示例代码。 ...

Global site tag (gtag.js) - Google Analytics