1

我在 WAS 7、Windows XP 和 Java 6 上。解密时出现以下异常:

javax.crypto.BadPaddingException: Given final block not properly padded
[12/27/12 17:50:48:832 PKT] 00000013 SystemErr     R    at com.ibm.crypto.provider.DESCipher.engineDoFinal(Unknown Source)
[12/27/12 17:50:48:832 PKT] 00000013 SystemErr     R    at com.ibm.crypto.provider.DESCipher.engineDoFinal(Unknown Source)
[12/27/12 17:50:48:832 PKT] 00000013 SystemErr     R    at javax.crypto.Cipher.doFinal(Unknown Source)
[12/27/12 17:50:48:832 PKT] 00000013 SystemErr     R    at com.test.util.encrypt.StringEncrypter.decrypt(StringEncrypter.java:170)

这是我的java代码:

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import org.apache.log4j.Logger;
import com.test.exceptions.EncryptionException;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public final class StringEncrypter {

  private KeySpec keySpec;
  private SecretKeyFactory keyFactory;
  private Cipher cipher;

  private static final Logger LOGGER = Logger.getLogger("com.test.util.StringEncrypter");


  public StringEncrypter(String anEncryptionKey) throws EncryptionException {

    if (anEncryptionKey == null) {
      throw new EncryptionException(new InvalidKeyException("encryption key was null"));
    }
    else if (anEncryptionKey.trim().length() < 24) {
      throw new EncryptionException(new InvalidKeyException("encryption key was less than 24 characters"));
    }
    else {

      try {

        byte[] keyAsBytes = anEncryptionKey.getBytes("UTF-8");

        keySpec = new DESKeySpec(keyAsBytes);

        keyFactory = SecretKeyFactory.getInstance("DES");

        cipher = Cipher.getInstance("DES");

      }
      catch (InvalidKeyException ike) {
        throw new EncryptionException(ike);
      }
      catch (UnsupportedEncodingException uee) {
        throw new EncryptionException(uee);
      }
      catch (NoSuchAlgorithmException nsae) {
        throw new EncryptionException(nsae);
      }
      catch (NoSuchPaddingException nspee) {
        throw new EncryptionException(nspee);
      }
    }
  }


  public String encrypt(String anUnencryptedString) throws EncryptionException {
    if (anUnencryptedString == null || anUnencryptedString.trim().length() == 0) {
      throw new EncryptionException(new InvalidKeyException("unencrypted string was null or empty"));
    }
    else {
      try {
        SecretKey secretKey = keyFactory.generateSecret(keySpec);
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] cleartext = anUnencryptedString.getBytes("UTF-8");


        byte[] ciphertext = cipher.doFinal(cleartext);

        BASE64Encoder base64encoder = new BASE64Encoder();
        return base64encoder.encode(ciphertext);
      }
      catch (InvalidKeySpecException ikse) {
        throw new EncryptionException(ikse);
      }
      catch (InvalidKeyException ike) {
        throw new EncryptionException(ike);
      }
      catch (UnsupportedEncodingException uee) {
        throw new EncryptionException(uee);
      }
      catch (IllegalBlockSizeException ibse) {
        throw new EncryptionException(ibse);
      }
      catch (BadPaddingException bpee) {
        throw new EncryptionException(bpee);
      }
    }
  }


  public String decrypt(String anEncryptedString) throws EncryptionException {
    if (anEncryptedString == null || anEncryptedString.trim().length() <= 0) {
      throw new EncryptionException(new InvalidKeyException("encrypted string was null or empty"));
    }
    else {
      try {
        SecretKey secretKey = keyFactory.generateSecret(keySpec);

        cipher.init(Cipher.DECRYPT_MODE, secretKey);

        BASE64Decoder base64decoder = new BASE64Decoder();

        byte[] cleartext = base64decoder.decodeBuffer(anEncryptedString);

        byte[] ciphertext = cipher.doFinal(cleartext);

        return bytesToString(ciphertext);
      }
      catch (InvalidKeySpecException ikse) {
        throw new EncryptionException(ikse);
      }
      catch (InvalidKeyException ike) {
        throw new EncryptionException(ike);
      }
      catch (IllegalBlockSizeException ibse) {
        throw new EncryptionException(ibse);
      }
      catch (BadPaddingException bpee) {
          bpee.printStackTrace();
        throw new EncryptionException(bpee);
      }
      catch (IOException ioe) {
        throw new EncryptionException(ioe);
      }
    }
  }

  private static String bytesToString(byte[] someBytes) {
    StringBuffer stringBuffer = new StringBuffer();
    for (int i = 0; i < someBytes.length; i++) {
      stringBuffer.append((char) someBytes[i]);
    }
    return stringBuffer.toString();
  }
}
4

0 回答 0