问题如题。   代码:
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());

}
}

解决方案 »

  1.   

       我的密钥是一个常量啊。
       配置文件中:#3DES公钥
    fix_key=AAAAAAAABBBBBBBB
      

  2.   

    UDBConstant.ENCRYPT_TYPE
    UDBConstant.FIX_KEY
    UDBConstant.IV这三个值你是怎么定义的!你给我一组数据我帮你测测
      

  3.   

    //3DES
    //公钥
    public static final String FIX_KEY = SystemMessage.getString("fix_key");
    //向量
    public static final byte[] IV = {'1','2','3','4','5','6','7','8'}; 
    //加密算法
    public static final String ENCRYPT_TYPE = SystemMessage.getString("encrypt_type");#加密算法
    encrypt_type=DESede/CBC/PKCS7Padding
    #3DES公钥
    fix_key=AAAAAAAABBBBBBBB
      

  4.   

    SystemMessage.getString()方法?