Decrypt Tokopedia Buyer Info from secret content response

Ahmad Nurkholis
2 min readApr 26, 2021

Halo, kali ini saya akan membagikan contoh salah satu penggunaan class java.crypto.Chiper untuk mendecrypt data yang diperoleh dari response tokopedia seller api.

Contoh response yang didapat dari salah satu endpoint

(kalian bisa mempelajari lebih lanjut di link berikut: https://developer.tokopedia.com/openapi/guide/#/encryption/

Tutorial kali ini hanya fokus pada fungsi decryption, sehingga jika kalian ingin mengintegrasi aplikasi kalian dengan tokopedia, mungkin konten kali ini dapat membantu kalian pada bagian decryprtion.

Sebelumnya kalian harus register public key kalian terlebih dahulu dengan mengikuti langkah-langkah berikut:
1. Download script here
2. Run script generate public_key.pub private_key.pem
3. Upload via API using Postman

POST /v1/fs/:fs_id/register?upload=1

Decryption Process

Decryption process

Step#1
Pada ilustrasi diatas kita perlu mengunduh private_key kita ke dalam aplikasi. Khusus untuk pemrograman menggunakan java kita perlu meng-convert terlebih dahulu private_key.pem menjadi PKCS8 private key (ref).
Bisa menggunakan link berikut: https://decoder.link/rsa_converter
Sebagai contoh program kali ini kita lakukan manual saja dengan meletakkan private_key secara hardcode.

private static PrivateKey readPrivateKey() throws Exception {

String privateKeyPEM = “xxxxx”;
byte[] encoded = Base64.decodeBase64(privateKeyPEM);
KeyFactory keyFactory = KeyFactory.getInstance(“RSA”);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded);

return keyFactory.generatePrivate(keySpec);

Step#2
Selanjutnya kita mendecrypt secret, yaitu mendecode dengan base64 terlebih dahulu lalu menggunakan RSA OAEP 256

private static byte[] decryptSecret(String encryptedSecret) throws Exception{

byte[] secret=null;
PrivateKey rsaPrivateKey = readPrivateKey();
Cipher cipher = Cipher.getInstance(“RSA/ECB/OAEPPadding”);
OAEPParameterSpec oaepParams = new OAEPParameterSpec(“SHA-256”, “MGF1”, new MGF1ParameterSpec(“SHA-256”), PSource.PSpecified.DEFAULT);
cipher.init(Cipher.DECRYPT_MODE, rsaPrivateKey, oaepParams);
secret = cipher.doFinal(Base64.decodeBase64(encryptedSecret));

return secret;
}

Step#3
Langkah akhir kita mendecrypt content dengan menggunakan AES GCM dan secret key yang telah di-decrypt pada langkah sebelumnya

private static String decryptContent(byte[] cipherText, SecretKey key, byte[] IV) throws Exception{

Cipher cipher = Cipher.getInstance(“AES/GCM/NoPadding”);
SecretKeySpec keySpec = new SecretKeySpec(key.getEncoded(), “AES”);
GCMParameterSpec gcmParameterSpec = new GCMParameterSpec(128* 8, IV);
cipher.init(Cipher.DECRYPT_MODE, keySpec, gcmParameterSpec);
byte[] decryptedText = cipher.doFinal(cipherText);

return new String(decryptedText);
}

Selamat, return string dari step#3 merupakan json string yang merupakan data buyer_info. Terimakasih

--

--

Ahmad Nurkholis

Software Engineer having interest in solving problem between technology and business especially in eCommerce