3DES加密字符串,参数不变,为什么经过程序后每次加密后的值都不同呢?
问题如题。
代码:
package com.entity;
import java.security.MessageDigest;
/**
* 数字签名SHA-1加密�?
*/
public class SHA1Encrypt {
//加密
public static byte[] encrypt(String str) {
byte[] digesta = null;
try {
java.security.MessageDigest alga=java.security.MessageDigest.getInstance("SHA-1");
alga.update(str.getBytes());
digesta=alga.digest();
}catch (Exception e) {
e.printStackTrace();
}
return digesta;
}
//解密
public static boolean decrypt(String str,byte[] digesta) {
try {
MessageDigest algb=MessageDigest.getInstance("SHA-1");
algb.update(str.getBytes());
if (MessageDigest.isEqual(digesta,algb.digest())) {
return true;
}
else
{
return false;
}
} catch (Exception e){
e.printStackTrace();
}
return false;
}
}
package com.entity;
import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
/**
* 3DES加密解密
*/
public class DES3Encrypt {
private String Algorithm = UDBConstant.ENCRYPT_TYPE;// 定义 加密算法,
//可用 DES,DESede,Blowfish, CBC是运算模式, PKCS7Padding是填充模�?
private SecretKey secretkey; //秘密密钥
private Cipher cipher; //此类提供了针对加密和解密的密�?cipher 功能
private byte[] cipherByte; //加解密后的字节数�?
private IvParameterSpec zeroIv; //向量
private static DES3Encrypt instance;
private static final String fixKey = UDBConstant.FIX_KEY;
private static final byte[] iv = UDBConstant.IV;
/**
* Initial key
*/
private DES3Encrypt() {
init(fixKey, iv);
}
/**
* 初始化该�?
* @param fixKey
* @param iv
*/
private void init(String fixKey, byte[] iv) {
try {
zeroIv = new IvParameterSpec(iv);
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
secretkey = new SecretKeySpec(fixKey.getBytes(), "DESede");
cipher = Cipher.getInstance(Algorithm,"BC");
} catch (NoSuchAlgorithmException ex) {
ex.printStackTrace();
} catch (NoSuchPaddingException ex) {
ex.printStackTrace();
}catch (NoSuchProviderException e) {
e.printStackTrace();
}
}
public static DES3Encrypt getInstance(){
instance = new DES3Encrypt();
return instance;
}
/**
* Enrypt 3DES加密
* @param str
* @return
*/
public byte[] encrypt(String str) {
try {
cipher.init(Cipher.ENCRYPT_MODE, secretkey, zeroIv);
cipherByte = cipher.doFinal(str.getBytes("UTF-8"));
} catch (java.security.InvalidKeyException ex) {
ex.printStackTrace();
} catch (javax.crypto.BadPaddingException ex) {
ex.printStackTrace();
} catch (javax.crypto.IllegalBlockSizeException ex) {
ex.printStackTrace();
}catch (InvalidAlgorithmParameterException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return cipherByte;
}
/**
* decrypt 3DES解密
* @param buff
* @return
*/
public String decrypt(byte[] buff) {
String result = "";
try {
cipher.init(Cipher.DECRYPT_MODE, secretkey, zeroIv);
cipherByte = cipher.doFinal(buff);
result = new String(cipherByte, "UTF-8");
} catch (java.security.InvalidKeyException ex) {
ex.printStackTrace();
} catch (javax.crypto.BadPaddingException ex) {
ex.printStackTrace();
} catch (javax.crypto.IllegalBlockSizeException ex) {
ex.printStackTrace();
} catch (InvalidAlgorithmParameterException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return result;
}
}
package com.entity;
import org.apache.commons.codec.binary.Base64;
import sun.misc.BASE64Decoder;
/**
* Used to encode and decode.
*/
public class Base64Coding {
public static String encode(String str) {
String result = encode(str.getBytes());
return result;
}
public static String encode(byte[] str) {
byte[] temp = Base64.encodeBase64(str);
return new String(temp);
}
public static String decode(String str) {
byte[] temp = Base64.decodeBase64(str.getBytes());
String result = new String(temp);
return result;
}
public static String decodeHex(String str) {
byte[] temp = Base64.decodeBase64(str.getBytes());
String result = HexStrTrans.getHex(temp);
return result;
}
public static byte[] decodeBase64ToByte(String str){
BASE64Decoder decoder = new BASE64Decoder();
try {
return decoder.decodeBuffer(str);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
这是程序中调用以上三个类的加密方法:
public static boolean checkAuthenticator (String authenticator,String str) {
boolean result = false;
if (authenticator != null && authenticator.length() <= UDBConstant.AUTHENTICATOR_LENGTH && str != null) {
System.out.println("str: "+str);
byte[] sha1 = SHA1Encrypt.encrypt(str);
System.out.println("sha1: "+sha1.toString());
byte[] des3 = DES3Encrypt.getInstance().encrypt(sha1.toString());
System.out.println("des3: "+des3.toString());
String strToBase64 =Base64Coding.encode(des3);
System.out.println("strToBase64: "+strToBase64.toString());
if (authenticator.equals(strToBase64)) {
result = true;
}
}
return result;
}
调用该方法需要的参数authenticator就是调用下面的测试方法得到的strToBase64 值,
str="1900000001000101111111011-2-12 11:37:52"
package com.test;
import org.junit.Test;
import com.entity.Base64Coding;
import com.entity.DES3Encrypt;
import com.entity.SHA1Encrypt;
public class DESTest {
@Test
public void getTWOString(){
byte[] sha1 = SHA1Encrypt.encrypt("1900000001000101111111011-2-12 11:37:52");
System.out.println("sha1: "+sha1.toString());
byte[] des3 = DES3Encrypt.getInstance().encrypt(sha1.toString());
System.out.println("des3: "+des3.toString());
String strToBase64 =Base64Coding.encode(des3);
System.out.println("strToBase64: "+strToBase64.toString());
}
}