Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AES 256 encryption PHP with Padding

I got the following requirements for the encryption for the API i am currently trying to access:

  • PKCS7 padding method
  • CBC encryption mode
  • AES key size 256, block size 128

Everytime i submit to the API with the encryption, there seems to be something wrong with the API (unfortunately no error is produced).

$Data = "GOOD!";
$aesKey = "1234567812345678";

$EncryptedData = encrypt($aesKey,$Data);
$DecryptedData = decrypt($aesKey,$EncryptedData);

echo "Orignal Data : ". $Data;
echo "<br/>";
echo "After encryption = ". $EncryptedData;
echo "<br/>";
echo "After decryption = " .$DecryptedData;

function encrypt($aesKey, $dataToEncrypt) {
    $output = false;
    $iv = '{{{{{{{{{{{{{{{{';
    $output = openssl_encrypt($dataToEncrypt, 'AES-128-CBC', $aesKey,
    OPENSSL_RAW_DATA, $iv);
    $output = base64_encode($output);
    return $output;
}

function decrypt($aesKey, $dataTodecrypt) {
    $output = false;
    $iv = '{{{{{{{{{{{{{{{{';
    $dataTodecrypt = base64_decode ($dataTodecrypt);
    $dataTodecrypt = $output = openssl_decrypt($dataTodecrypt, 'AES-128-CBC',
    $aesKey, OPENSSL_RAW_DATA, $iv);
    return $output;
}

Questions:

  • What exactly is PKCS7 padding method and can be implemented with php?
  • AES 256 is fine but what exactly does block size mean?
  • What exactly does IV do?
like image 697
Sophie Rhodes Avatar asked Oct 28 '15 22:10

Sophie Rhodes


People also ask

Does AES have padding?

The AES Key Wrap with Padding algorithm can be used to wrap a key of any practical size with an AES key. The AES key-encryption key (KEK) must be 128, 192, or 256 bits. The input key data may be as short as one octet, which will result in an output of two 64-bit blocks (or 16 octets).

Can 256-bit AES be cracked?

AES 256 is virtually impenetrable using brute-force methods. While a 56-bit DES key can be cracked in less than a day, AES would take billions of years to break using current computing technology. Hackers would be foolish to even attempt this type of attack. Nevertheless, no encryption system is entirely secure.

How does padding work in AES?

Padding is a way to take data that may or may not be a multiple of the block size for a cipher and extend it out so that it is. This is required for many block cipher modes as they require the data to be encrypted to be an exact multiple of the block size.

Does AES CBC require padding?

The AES uses a block size of sixteen octets (128 bits). Padding is required by the AES to maintain a 16-octet (128-bit) blocksize. Padding MUST be added, as specified in [ESP], such that the data to be encrypted (which includes the ESP Pad Length and Next Header fields) has a length that is a multiple of 16 octets.


1 Answers

AES 256 is fine but what exactly does block size mean?

AES has a fixed block size of 128 bit. A block cipher only works on one block of a specific size. A mode operation extends a block cipher with the ability to work on multiple blocks and a padding enables it to work on plaintexts that are not a multiple of the block size.

AES-128-CBC means AES with key size of 128 bit and the CBC mode of operation. If you want to use AES-256, then you need to tell OpenSSL that: AES-256-CBC. Additionally, you need to use a key that is actually 256 bit long. Your current key is only 128 bit long.

What exactly is PKCS7 padding method and can be implemented with php?

openssl_encrypt() already does PKCS#7 padding for you and openssl_decrypt() removes it for you.

What exactly does IV do?

A random IV randomizes the ciphertext which means that encrypting the same plaintext with the same key, but a different IV produces a different ciphertext which is indistinguishable from random noise or other the same encryption with a different IV. Wikipedia has a good description what this actually does.

Keep in mind that an IV must be randomly generated for each iteration. Otherwise, an attacker who observes only the ciphertext may discover that you encrypted the same plaintext multiple times.


Keep in mind that an AES key is supposed to be quite noisy with high entropy. "12345..." looks more like a password. If you want to use passwords, then you need to derive a key from that password. PBKDF2 is a good idea with a random salt and a lot of iterations.

like image 133
Artjom B. Avatar answered Sep 24 '22 02:09

Artjom B.