package com.tmobile; import com.apigee.flow.execution.ExecutionContext; import com.apigee.flow.execution.ExecutionResult; import com.apigee.flow.execution.spi.Execution; import com.apigee.flow.message.MessageContext; import java.util.Arrays; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import javax.xml.bind.DatatypeConverter; public class DecryptionDocumentId2 implements Execution { private static final String _varPrefix = "decrypt_"; private static final String varName(String s) { return _varPrefix + s; } @Override public ExecutionResult execute(MessageContext messageContext, ExecutionContext executionContext) { try { // decode the base64 encoded string String decryptionKey1 = messageContext.getVariable("dk1_decryption"); //String decryptionKey2 = messageContext.getVariable("dk2_decryption"); byte[] key1 = decryptionKey1.getBytes("UTF-8"); //byte[] key2 = decryptionKey2.getBytes("UTF-8"); SecretKey secretKey1 = new SecretKeySpec(key1, 0, key1.length, "AES"); // SecretKey secretKey2 = new SecretKeySpec(key2, 0, key2.length, "AES"); String documentId = messageContext.getVariable("documentId"); if (documentId == null) { messageContext.setVariable(varName("reason"), "missing documentId"); return ExecutionResult.ABORT; } String decryptedValue = decrypt(documentId.trim(),secretKey1,messageContext); messageContext.setVariable("decryptedMsisdn", decryptedValue); return ExecutionResult.SUCCESS; } catch (Exception e) { String error = e.toString(); messageContext.setVariable(varName("error"), error); int ch = error.lastIndexOf(':'); if (ch >= 0) { messageContext.setVariable(varName("reason"), error.substring(ch+2)); } else { messageContext.setVariable(varName("reason"), error); } return ExecutionResult.ABORT; } } private String decrypt(String encryptedText, SecretKey secretKey, MessageContext messageContext) throws Exception { Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, secretKey); byte[] decryptedTextBytes = null; try { decryptedTextBytes = cipher.doFinal(DatatypeConverter.parseBase64Binary(encryptedText)); } catch (IllegalBlockSizeException e) { messageContext.setVariable(varName("reason1"), e.toString()); throw e; } catch (BadPaddingException e) { messageContext.setVariable(varName("reason2"), e.toString()); throw e; } return new String(decryptedTextBytes); } }
This is a java code for an Apigee Edge callout. During execution, while trying to decrypt encrypted data in APIGEE , we are getting error of final block not properly padded.
The code we started with is:
http://aesencryption.net/#Java-aes-encryption-example
We generate encrypted data from there and are trying to decrypt it with a key.