0

特定のトークンを暗号化および復号化する次の2つのメソッドを作成しました。

private static final String ALGORITHM_TYPE = "AES";
private static final String CIPHER_TRANSFORMATION = "AES/CBC/PKCS5Padding";
private static byte[] INITIALIZATION_VECTOR = new byte[] {
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
public String encrypt(String token) {
    Cipher cipher = null;
    SecretKey key = null;
    String tokenAsHex = null;
    byte[] encryptedToken = null;
    byte[] sksKey = getKeyAsByteArray(KEY); // SecretKeySpec key.

    try {
        key = new SecretKeySpec(sksKey, ALGORITHM_TYPE);
        AlgorithmParameterSpec paramSpec = new IvParameterSpec(INITIALIZATION_VECTOR);
        cipher = Cipher.getInstance(CIPHER_TRANSFORMATION);
        cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
        encryptedToken = cipher.doFinal(Base64.encodeBase64(token.getBytes("UTF-8")));
    } catch (Exception e) {
        throw new EncryptionException(e);
    }
    return Base64.encodeBase64String(encryptedToken).toLowerCase();
}

public String decrypt(String token) throws EncryptionException {
    Cipher cipher = null;
    SecretKey key = null;
    byte[] decryptedToken = null;
    byte[] sksKey = getKeyAsByteArray(KEY); // SecretKeySpec key.
    try {
        key = new SecretKeySpec(sksKey, ALGORITHM_TYPE);            
        AlgorithmParameterSpec paramSpec = new IvParameterSpec(INITIALIZATION_VECTOR);
        cipher = Cipher.getInstance(CIPHER_TRANSFORMATION);
        cipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
        decryptedToken = cipher.doFinal(Base64.decodeBase64(token));
    } catch(Exception e){
        throw new EncryptionException(e);    
    }
    if (decryptedToken == null) {
         throw new EncryptionException("Unable to decrypt the following token: " + token);
    }
    return Base64.encodeBase64String(decryptedToken);
}

ただし、encryptメソッドで暗号化された文字列を正常に復号化できません。私は同様の問題を検索しましたが、最も近いものはここにあります:AESおよびBase64エンコーディングを使用した暗号化と復号化。同様の戦略を使用した後でも、暗号化された文字列を復号化できません。問題が何であるかを診断するための助けをいただければ幸いです。

また、新しい文字列を作成する代わりに、Base64を使用して暗号化/復号化されたバイト配列をエンコードしています。後者の場合、URL文字列が安全ではなくなります。

4

1 に答える 1

1

あなたはbase64-encodingを暗号化し、次にそれをre-base64-encodingし、base64-decodingを復号化し、そして何らかの理由でそれをbase64-encodingしています。それは意味がありません。あなたは次のようになります:

  1. base64-暗号化のエンコード、つまり本質的にreturn Base64.encode(cipher.doFinal(...))
  2. (1)のbase64デコードの復号化、つまり本質的にreturn cipher.doFinal(Base64.decode(...))
于 2013-03-26T22:16:56.853 に答える