Input length must be multiple of 16 when decrypting with padded cipher

353    Asked by Dadhijaraj in Salesforce , Asked on Jun 4, 2024

 I am currently engaged in a particular task which is related to designing a secure messaging application that uses AFS encryption with PKCS7 padding. How can I handle a situation where a user trying to decrypt a message with a length that is not w multiple of 16 bytes?

Answered by Damini das

 In the context of Salesforce, here are the best approaches given:-

Technical explanation

When you are trying to decrypt a message encrypted with AES and PKC7 padding, the ciphertext’s length should be a multiple of 16 bytes. If the decrypted plaintext doesn’t have valid padding, it would indicate potential tampering or a decryption error.

Coding approach

Here is a basic example given below by using python’s “cryptography” library to handle description with PKCS7 padding:-

From cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
From cryptography.hazmat.primitives.ciphers.aead import AESGCM
From cryptography.hazmat.primitives import padding
From cryptography.hazmat.backends import default_backend

Import base64

Def decrypt_message(key, iv, ciphertext):
    Backend = default_backend()
    Cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=backend)
    Decryptor = cipher.decryptor()
    Decrypted_data = decryptor.update(ciphertext) + decryptor.finalize()
    # PKCS7 unpadding
    Unpadder = padding.PKCS7(128).unpadder()
    Unpadded_data = unpadder.update(decrypted_data) + unpadder.finalize()
    Return unpadded_data
# Example usage
Key = b’Sixteen byte key’
Iv = b’InitializationVe’ # 16 bytes for AES
Encrypted_data = base64.b64decode(‘BASE64_ENCODED_CIPHERTEXT_HERE’)
Decrypted_message = decrypt_message(key, iv, encrypted_data)
Print(decrypted_message.decode(‘utf-8’))

Here is the example given in java programming language:-

Import javax.crypto.Cipher;
Import javax.crypto.spec.IvParameterSpec;
Import javax.crypto.spec.SecretKeySpec;
Import java.util.Base64;
Public class AESDecryptor {
    Public static void main(String[] args) throws Exception {
        String key = “Sixteen byte key”; // 16 bytes key
        String iv = “InitializationVe”; // 16 bytes IV
        // Base64 encoded ciphertext
        String base64Ciphertext = “BASE64_ENCODED_CIPHERTEXT_HERE”;
        Byte[] ciphertext = Base64.getDecoder().decode(base64Ciphertext);
        // Decrypt the ciphertext
        String decryptedMessage = decrypt(key, iv, ciphertext);
        System.out.println(“Decrypted Message: “ + decryptedMessage);
    }
    Public static String decrypt(String key, String iv, byte[] ciphertext) throws Exception {
        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), “AES”);
        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes());
        Cipher cipher = Cipher.getInstance(“AES/CBC/PKCS5Padding”);
        Cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
        Byte[] decryptedBytes = cipher.doFinal(ciphertext);
        // Remove PKCS7 padding
        Int paddingLength = decryptedBytes[decryptedBytes.length – 1];
        Byte[] unpaddedBytes = new byte[decryptedBytes.length – paddingLength];
        System.arraycopy(decryptedBytes, 0, unpaddedBytes, 0, unpaddedBytes.length);
        Return new String(unpaddedBytes);
    }
}

Here is the example given in HTML:-




    AES Decryption

    [removed]

          Function decryptMessage() {
            Var key = “Sixteen byte key”; // 16 bytes key
            Var iv = “InitializationVe”; // 16 bytes IV
            Var base64Ciphertext = document.getElementById(“cipherInput”).value;
            Var ciphertext = atob(base64Ciphertext); // Decode Base64
            Var decryptedMessage = decrypt(key, iv, ciphertext);
            Document.getElementById(“decryptedMessage”).innerText = decryptedMessage;
        }        Function decrypt(key, iv, ciphertext) {
            Var secretKey = crypto.subtle.importKey(
                “raw”,
                New TextEncoder().encode(key),
                { name: “AES-CBC” },
                False,
                [“decrypt”]
            );
            Var ivBuffer = new Uint8Array(new TextEncoder().encode(iv));
            Return crypto.subtle.decrypt(
                { name: “AES-CBC”, iv: ivBuffer },
                secretKey,
                ciphertext
            ).then(function(decrypted) {
                // Convert decrypted ArrayBuffer to string
                Return new TextDecoder().decode(decrypted);
            });
        }

    [removed]



    AES Decryption

    Enter Base64 Encoded Ciphertext:

   

   

   

   





Your Answer

Interviews

Parent Categories