2016-10-01 14 views
0

私は暗号が初めてで、単純なAES暗号化プログラムとベース64エンコーディングを作成しようとしています。プログラムは私のメッセージ文字列を暗号化して解読するはずですが何らかの理由で例外が表示されますjava.lang.IllegalArgumentException:解読の不正なbase64文字の文字列ですが、多分暗号化と関係があります..AES暗号化コードで例外を解決するには

しばらく検索したところ、この理由が見つかりませんでした。誰かがこのエラーにつながる可能性のある私のコードの間違いを指摘できたら、私は感謝しています!あなたがメッセージではない暗号化されたメッセージを解読するため

public class AES_encryption { 
private static SecretKey skey; 
public static Cipher cipher; 

public static void main(String[] args) throws Exception{ 
    String init_vector = "RndInitVecforCBC"; 
    String message = "Encrypt this?!()"; 
    String ciphertext = null; 

    //Generate Key 
    skey = generateKey(); 

    //Create IV necessary for CBC 
    IvParameterSpec iv = new IvParameterSpec(init_vector.getBytes()); 

    //Set cipher to AES/CBC/ 
    cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 

    try{ 
     ciphertext = encrypt(skey, iv, message); 
    } 
    catch(Exception ex){ 
     System.err.println("Exception caught at encrypt method!" + ex); 
    } 
    System.out.println("Original Message: " + message + "\nCipher Text: " + ciphertext); 

    try{ 
     message = decrypt(skey, iv, message); 
    } 
    catch(Exception ex){ 
     System.err.println("Exception caught at decrypt method! " + ex); 
    } 

    System.out.println("Original Decrypted Message: " + message); 


} 

private static SecretKey generateKey(){ 
    try { 
     KeyGenerator keygen = KeyGenerator.getInstance("AES"); 
     keygen.init(128); 
     skey = keygen.generateKey(); 
    } 
    catch(NoSuchAlgorithmException ex){ 
     System.err.println(ex); 
    } 
    return skey; 
} 

private static String encrypt(SecretKey skey, IvParameterSpec iv, String plaintext) throws Exception{ 
    //Encodes plaintext into a sequence of bytes using the given charset 
    byte[] ptbytes = plaintext.getBytes(StandardCharsets.UTF_8); 

    //Init cipher for AES/CBC encryption 
    cipher.init(Cipher.ENCRYPT_MODE, skey, iv); 

    //Encryption of plaintext and enconding to Base64 String so it can be printed out 
    byte[] ctbytes = cipher.doFinal(ptbytes); 
    Base64.Encoder encoder64 = Base64.getEncoder(); 
    String ciphertext = new String(encoder64.encode(ctbytes), "UTF-8"); 

    return ciphertext; 
} 

private static String decrypt(SecretKey skey, IvParameterSpec iv, String ciphertext) throws Exception{ 
    //Decoding ciphertext from Base64 to bytes[] 
    Base64.Decoder decoder64 = Base64.getDecoder(); 
    byte[] ctbytes = decoder64.decode(ciphertext); 

    //Init cipher for AES/CBC decryption 
    cipher.init(Cipher.DECRYPT_MODE, skey, iv); 

    //Decryption of ciphertext 
    byte[] ptbytes = cipher.doFinal(ctbytes); 
    String plaintext = new String(ptbytes); 

    return plaintext; 
} 

}

+0

でなければなりません。 [mcve]が必要です。「完了」に注意してください。キーと 'ctbytes'を16進数で入力します。 – zaph

+0

最小限のデバッグ(デバッガまたはプリントステートメントの値を調べる)を行った場合、解読時には 'ctbytes'が必要でないことがわかります。 – zaph

答えて

1

問題があります!あなたは、テストデータが答えを期待していない提供していない場合は

decrypt(skey, iv, message)はおそらくdecrypt(skey, iv, ciphertext)

+0

ありがとう、それは簡単でした!私の部分からの愚かな気晴らし.. –