2017-06-12 3 views
1

私は暗号化/復号化の目的でトリプルDESを使用していますが、何とか私に例外を与えてくれます。私は立ち往生した。私は暗号化とそれに対応するjavaライブラリに慣れていません。javax.crypto.BadPaddingException:最終ブロックが適切に埋められていないと仮定すると

private static byte[] Key = new byte[] { 
     0x42, 0x45, 0x49, 0x30, 0x12, 0x22, 0x35, 0x48, 0x33, 0x24, 0x28, 0x51, 
     0x48, 0x24, 0x30, 0x21, 0x44, 0x31, 0x14, 0x19, 0x45, 0x34, 0x47, 0x25 }; 

Cipher c; 

public EncryptionHelper() throws Exception { 
    // byte[] key_hash = (Key).toString().getBytes("UTF-8"); 
    // key_hash = Arrays.copyOf(key_hash, 32); 
    SecretKey key = new SecretKeySpec(Key, 0, Key.length, "DESede"); 
    c = Cipher.getInstance("DESede/ECB/PKCS5Padding"); 
    c.init(Cipher.ENCRYPT_MODE, key); 
} 

public String Encrypt(String S) throws Exception { 
    byte[] base64EncryptedText = S.getBytes("UTF-8"); 
    byte EncryptedText[] = c.doFinal(base64EncryptedText, 0, base64EncryptedText.length); 
    return new String(EncryptedText); 
} 

public String Decrypt(String S) throws Exception { 
    Cipher c2 = null; 
    // byte[] key_hash = (Key).toString().getBytes("UTF-8"); 
    // key_hash = Arrays.copyOf(key_hash, 24); 
    SecretKey key = new SecretKeySpec(Key,0, Key.length, "DESede"); 
    c2 = Cipher.getInstance("DESede/ECB/PKCS5Padding"); 
    c2.init(Cipher.DECRYPT_MODE, key); 
    byte[] base64EncryptedText = Base64.getEncoder().encode(S.getBytes()); 
    byte[] textDecrypted = c2.doFinal(base64EncryptedText, 0, base64EncryptedText.length); 
    return new String(textDecrypted, "UTF-8"); 
} 

EDIT:

最後に溶液を通して働いて、私はちょうど成分をなくすし、同様にコア・ロジックを指定。

public class EncryptionHelper { 

private static byte[] Key = new byte[] { 
    0x42, 0x45, 0x49, 0x30, 0x12, 0x22, 0x35, 0x48, 0x33, 0x24, 0x28, 0x51, 
    0x48, 0x24, 0x30, 0x21, 0x44, 0x31, 0x14, 0x19, 0x45, 0x34, 0x47, 0x25 }; 

static Cipher c; 

public EncryptionHelper() throws Exception { 
    // byte[] key_hash = (Key).toString().getBytes("UTF-8"); 
    // key_hash = Arrays.copyOf(key_hash, 32); 
    SecretKey key = new SecretKeySpec(Key, 0, Key.length, "DESede"); 
    c = Cipher.getInstance("DESede/ECB/PKCS5Padding"); 
    c.init(Cipher.ENCRYPT_MODE, key); 
} 

public static String Encrypt(String S) throws Exception { 
    byte[] base64EncryptedText = S.getBytes("UTF-8"); 
    byte EncryptedText[] = c.doFinal(base64EncryptedText, 0, base64EncryptedText.length); 
    return new String(Base64.getEncoder().encode(EncryptedText)); 
} 

// LOGIC: 
// for encryption: string -> utf-8 byte array, 
     // encrypt and return a base 64 encoded string 
// for decryption: String -> base64 -> decode base 64 array, 
     // decrypt and return utf-8 string 

public static String Decrypt(String S) throws Exception { 
    Cipher c2 = null; 
    // byte[] key_hash = (Key).toString().getBytes("UTF-8"); 
    // key_hash = Arrays.copyOf(key_hash, 24); 
    SecretKey key = new SecretKeySpec(Key, "DESede"); 
    c2 = Cipher.getInstance("DESede/ECB/PKCS5Padding"); 
    c2.init(Cipher.DECRYPT_MODE, key); 
    byte[] base64EncryptedText = Base64.getDecoder().decode(S.getBytes()); 
    byte[] textDecrypted = c2.doFinal(base64EncryptedText, 0, base64EncryptedText.length); 
    return new String(textDecrypted, "UTF-8"); 
} 

答えて

1

はあなたの変数の名前にもかかわらず、あなたのEncrypt方法でbase64でエンコードする暗号化の結果を失敗しています。したがって、文字列に変換するとガベージが発生し、メソッドでそのガベージをbase64でデコードすると、ゴミがになります。

0

あなたはbase64をデコードしてから解読しますが、暗号化せずにbase64エンコーディングしています。

+0

これはコメントではありません。 – Yahya

+0

@Yahyaあなたは間違っています。それは答えであり、コメントではありません。 OPコード内の問題を特定します。正確にあなたが正しいと答えた答えと同じことが言います。 – EJP

関連する問題