· 7 years ago · Dec 06, 2018, 10:18 PM
1import java.security.spec.KeySpec;
2import java.util.Base64;
3
4import javax.crypto.Cipher;
5import javax.crypto.SecretKey;
6import javax.crypto.SecretKeyFactory;
7import javax.crypto.spec.GCMParameterSpec;
8import javax.crypto.spec.PBEKeySpec;
9import javax.crypto.spec.SecretKeySpec;
10
11import org.bouncycastle.util.encoders.Hex;
12
13public class Decrypt
14{
15 public static void main( String[] args ) throws Exception
16 {
17 String ivDelimiter = "fA==";
18 String input = "pxjG+3ygfIDLf0yZGMrzp06B0ULRZHt92kDPGSu8uZFe/dFAbNUoMTWLQUItSZhcxUlEKbs2tEZE+DeV7cFbIIt9F6D04fWhe1qXFpMH4XvceFpEPXvG4fV4shjhDnenygEi8nl/YFLGMzwUhFLYVWnZcFhz2w/WLyNuaLf7LdteZ9Yxur36dfdLg1fCnGnLMLhgXgKbB9w56H1JxaBMiHf9UzBVr2p96C1jIjUTrCTux9BR+AX8cejDK02jGFHv16bLEyjWQJ+DuJozGapzfbxg7y7qL5s9SGg5wJuZ2YuKEzQoTdnjv2AfegJFT88YxAUmhXUnn9JW2m/88UC7qV1iDaLyIwGRBEDtmn4vtfjVhS2y6v2KtLFpFBhkjxFve+UHgU8T2aGeY69uVBRs/jmOhw0WwaU0RZ9ElAFYU0tMxMEYQqCvkY+MXoFi+JS0RBp3UT3jvRmKat+K7iKex7MgmywMASq0CPcgsNXXGWKF3xJrC/nb7cqVw0Z/RRZA+Pnk5HossjBBnPZSKLquGhI+FFxvCfDZ42ZpgcBoSwB3IE8L0iMU7am3Nxoe/4xGcS8a0hzK1epM0u74qs32pIoIZrFXowo357x3xubcdm5GFMRcr9JSOTNpjgCelbXlr4Nd1aEe5XCr9qI9CkmA8En9NFM95RZgr9eh6pFsx+hXIGBF2bYZfeqbS6oBLKEEYYx2e7kDNN7T7Pjzebga/g5Lq3imvMP29SVHpBumB0TQbCft8XOZssAt68wvfR4fm0qtAE54GciAz3ikxbDHCds/X/chzZiv7topPAocamk6oN/9WjyxprW56djnfiGkkEXveN7UCWlXpDmvO3xrjA+k6nN7SBtgd3SdJ7fV0Xx1blP1d/tF35JOTH3+aExDuYmNjD42ds05kvD1PFSugMFUP4h9APssYXlC8YBowIS76h7Kognl/xg0pi0JLgEoCykSjtsrhFExE6AS5atrFta5hjTpz4fS0mhyGuxfKLd6VWDMfz1KT6zaT2NxHTUcMHcBukBWgIodHJJBBdZ8tUkNtlJEjMMlX00Chfmw+htR1IZ1LC8pS4mRyVLAB1tTZCD/GYnLfAz7rznJYg0cKA8kbaCe4/pSMt0bce+9L4N5j0YV0uG09CkDerxUX431PRt2IubbP/4aEnCSA8pGcoviKWaGuQy8b00yzyW4Qi7N6V1S98qpvLvM40cKaU+mdyv/D1swLaAu4w35QM7Gs82CLe4cSky8IzE+4pU2c86zZuQwYB9W86HxUvdmDuptNOiBHN0yvdceSiF5OEKiqMV3Z4ETOOyGCvrrL50Jz7bKRUqGOdlQslF0r8mpFE1mz3ZQHuyByrsCp7GmLlNpCP8ZHrQm9Qebwg6HGPmFvFoj3+OAodG4RD0wliq8O9hJuPxJT3PyWrbEESELSiAM8lkYYAtEuonPMo/GW7XbOi+vTGLeZKBvWE/Bj2vjrj+U8vj6dB4PzvOj8b+lxxKQKGh7FfhdlYgKnElzG01R3vSP2V/05LiqC4lKOk/nzlPWUDNbLfnuPbnsLvIC+QlZqJicDwNjhJiOS+4XnTKaUFFB8/C1T8Uz99i3B0p9UYQUP3QVRVK7mMalK+iQtBzwzFQ5I6jzJ22XgmzeQCdz6Eqqc585kZxjui0jqrIJZDfwuN55GULm8jAfCZ7Z52zAwxdSsIbmGC6I7L/VGubEmisIW7YGRbiYUZ72Z44qEL/oSCm4kgjCe3EfKEB/y6KDxvwCa2LjJn8AL0lJ92CKVV34UeFasfdu197ACBzJ16C8+zR9dA4Fb7U+gp9xbf/sGW2XI0IDcNZa1Mq58z1Cnf5ywX3a4GybAipHc4pO6eqxjbpO6BaXV1tZ0z0rpOokqX7tKnJiUXCnWOJS4GHbJ5LcYX+4g3l661MTIvfOuKwJucUTb+74PIEaaSLWDVc6M6l6V6+SFNx5WESGgaUcSbznds7AzS0NbKmDS0rW9g3oFz5R/DTl6m6wG2X6MRSQeSa+mDf9uOcGyuJ+0jdspWvphpV3Ky1cS8ldbFINJNLapH7Lz4nlf4tLcmntx9WdiO2PNJxQ5f2zP7Y4ogEk4aVT2hqsr5kKN1HfgAGKMoaWe8QSF/nJ3HHnX4Rx1UxkZmSBNRGGdh+Z03BVKELp9ucMXY4AVV8TE4uFZ07ISYORule4Xu9rmQKZPOik7WebGu3NAkNbCA/ErPX2AnsUfJuOLhn1BVc7kAC+1770AT6DAY4f5UqCsOgX15B1UtUh9gWNZYquU619dzLZ+/wiouKnQvqoRl9ud0urFntyohUzyIFmnuBNEhcneDIs6UbZvWOFe9jw87W6axBJVvqvKK53w9pbZAXOO5nBJITv0SwTV8RivJLvK427TK1bQo0uJIL2hRciSrvBJb+q0rczu/T6himHTQ3kwCvpqnyRekGIs8oDqMfbKVLlYfzljo4B/QMiuO4FkXE3fMXoKdpdgLUJCd1FlT6cFx54yW2sfQWOMIzmnGPxm7oCBZ5YTmhRXNtjuqodR2hHI3JIA/Hvt3R8c2/9Mva8GmW64KTCiPVio2pJQK7k66NNGRAW3Qs4T7roC9iEtQmBQdt1Ju0pPCp2a+tyVljL26/XHz2pS2yGMGc4DKtkbap7c58+HPuN2Dxu3rFlpXs+6TJxI6obr/eDWIh7TwLYJsPGtpSL2p1mKqGNE9QfafUUs4hkv08Pp5H67uGpadkMtCDXp/Btx6rws5NHs5xueL9gQ6gCipnVIhJg/J5lN3pe+7KUl0TwyDRFhq/VbIGpY0QNLd2tfr/JSbbkAr5iCKIV/47VB59LVgP1ovkxLhTP2cp8WY6LbR8GszXWBag26LVuMYV8rnEKyyrmkWhK4rrUmJRwhqI+DYxr1PkvlT296IXX5vOC80JsiNFjYUBit+C0NbRTtzEt5odUHFp8iRDcUmejWsd4aiSwZTZErJGPOee+YUezknAKKHILXxDohb8dR7fZoWhbOFhPTrH5jSIMKG4M0ZNmx7zzh9acJd0ACLu6Am7d0zpW2Z5vofw2ihSDQWvunrI=fA==NHvyca/sCKYTzPTWfA==j9IwREDLykWaFNLrBqp3LpCl+9ayXAennTHdwDgMwIvaCv1R+wsgHw==";
19 char[] passphrase = "broom split skin club fluid sister animal liberty later affair online clerk".toCharArray();
20
21 String[] strings = input.split( ivDelimiter );
22 String realPrivateKey = strings[0];
23 byte[] iv = Base64.getDecoder().decode( strings[1] );
24 byte[] salt = Base64.getDecoder().decode( strings[2] );
25
26 System.out.println( "IV: " + Hex.toHexString( iv ) );
27 System.out.println( "salt: " + Hex.toHexString( salt ) );
28
29 SecretKeyFactory factory = SecretKeyFactory.getInstance( "PBKDF2WithHmacSHA1" );
30 KeySpec spec = new PBEKeySpec( passphrase, salt, 1024, 256 );
31 SecretKey tmp = factory.generateSecret( spec );
32 SecretKeySpec key = new SecretKeySpec( tmp.getEncoded(), "AES" );
33
34 System.out.println( "derived key: " + Hex.toHexString( key.getEncoded() ) );
35
36 Cipher cipher = Cipher.getInstance( "AES/GCM/NoPadding" );
37
38 int tagLength = 128;
39 cipher.init( Cipher.DECRYPT_MODE, key, new GCMParameterSpec( tagLength, iv ) );
40
41 byte[] bytes = Base64.getDecoder().decode( realPrivateKey );
42 System.out.println( "plaintext length (including tag): " + bytes.length );
43
44 byte[] decrypted = cipher.doFinal( bytes ); // fails with javax.crypto.AEADBadTagException: Tag mismatch!
45
46 System.out.println( decrypted );
47 }
48}
49
50// IV: 347bf271afec08a613ccf4d6
51// salt: 8fd2304440cbca459a14d2eb06aa772e90a5fbd6b25c07a79d31ddc0380cc08bda0afd51fb0b201f
52// derived key: 4b0da0e858736f4cadbef48250892f8ef7e2f641f81ef57ab915154e55fc65f6
53// plaintext length (including tag): 2288
54// Exception in thread "main" javax.crypto.AEADBadTagException: Tag mismatch!
55// at java.base/com.sun.crypto.provider.GaloisCounterMode.decryptFinal(GaloisCounterMode.java:573)
56// at java.base/com.sun.crypto.provider.CipherCore.finalNoPadding(CipherCore.java:1049)
57// at java.base/com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:985)
58// at java.base/com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:847)
59// at java.base/com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:446)
60// at java.base/javax.crypto.Cipher.doFinal(Cipher.java:2191)
61// at Decrypt.main(Scribble.java:46)