The OpenSSL is using the AES-NI where available.
openssl speed -evp aes-128-cbc and outputs
The 'numbers' are in 1000s of bytes per second processed. type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes 16384 bytes aes-128-cbc 531549.19k 969335.21k 1045437.10k 1066826.75k 1054665.39k 1052120.41k Since you are not using the AES-NI you need to compare it with the software version
OPENSSL_ia32cap=”~0x200000200000000″ openssl speed -elapsed -evp aes-128-cbc The 'numbers' are in 1000s of bytes per second processed. type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes 16384 bytes aes-128-cbc 143802.75k 161369.51k 165049.17k 166054.57k 166262.10k 166461.44k if we compare the last column, you will see that AES-NI is ~6.3 times faster than the software version of the OpenSSL. This means that you are around 4 times slower than the software version.
In many cases, the compiler optimization parameters can also affect the speed, too. Look into the manual of your compiler, if you are using GCC then they are -O[0..3]
About the code;
If you look at the AES code of OpenSSL you will see that they use pre-computed tables and this is a very common technique.
The Subytes, Shiftrows and MixColums are turned into table lookup. The speed difference is these. And notnote that the table lookup is vulnerable to cache-timing attacks.