Sample code for 30+ languages & platforms
Lua

Duplicate PHP's openssl_encrypt and openssl_random_pseudo_bytes

See more OpenSSL Examples

Demonstrates how to duplicate PHP's openssl_encrypt function. (https://www.php.net/manual/en/function.openssl-encrypt.php)

Chilkat Lua Downloads

Lua
local chilkat = require("chilkat")

-- This example requires the Chilkat API to have been previously unlocked.
-- See Global Unlock Sample for sample code.

-- Duplicates thw following PHP script:

-- $text = "This is a test";
-- $passphrase = "my password";
-- $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length("AES-256-CBC"));
-- $crypted = base64_encode($iv.openssl_encrypt($text, "AES-256-CBC", $passphrase, OPENSSL_RAW_DATA, $iv));
-- echo $crypted;

local crypt = chilkat.Crypt2.new()

local text = "This is a test"
local passphrase = "my password"

-- AES is a block cipher.  The IV size for any block cipher is the size of the block, which is defined by the encryption algorithm.
-- For AES, the block size is always 16 bytes, regardless of key size (i.e. 128-bits, 192-bits, or 256-bits).
-- Therefore, generate 16 random bytes for the IV.
crypt.encoding_mode = "base64"
local ivBase64 = crypt:gen_random_bytes_enc(16)

print("Generated IV = " .. ivBase64)

-- Because we're doing AES-256-CBC, the key length must be 256-bits (i.e. 32 bytes).
-- Given that our passphrase is a us-ascii string that can be shorter or longer than 32-bytes, we need to
-- somehow transform the passphrase to a 32-byte secret key.  We need to know what openssl_encrypt does.
-- Here's the answer from the openssl_encrypt documentation:
--
-- "If the passphrase is shorter than expected, it is silently padded with NUL characters;
-- if the passphrase is longer than expected, it is silently truncated."

-- OK.... so let's pad or shorten to get a 32-byte key.
local bdKey = chilkat.BinData.new()
bdKey:append_string(passphrase, "utf-8")

local sz = bdKey.num_bytes
if sz > 32 then
    bdKey:remove_chunk(32, sz - 32)
else
    bdKey:clear()
    bdKey:append_padded(passphrase, "utf-8", false, 32)
end

-- Setup for encryption.
crypt.crypt_algorithm = "aes"
crypt.key_length = 256
crypt:set_encoded_iv(ivBase64, "base64")
crypt:set_encoded_key(bdKey:get_encoded("base64"), "base64")

-- Encrypt and base64 encode.
local cipherText64 = crypt:encrypt_string_enc(text)

-- The PHP code fragment above returns the base64 encoded bytes of the IV and the encrypted text.
-- So let's do that..
local bd = chilkat.BinData.new()
bd:append_encoded(ivBase64, "base64")
bd:append_encoded(cipherText64, "base64")
local result = bd:get_encoded("base64")

print("result = " .. result)

-- Sample output:
-- dN0vS1O0cWi5BbLAAY+NTf7bs3S27xzPf11RkG47sjs=

-- Now let's decrypt from the output...

-- Setup for decryption.
crypt.crypt_algorithm = "aes"
crypt.key_length = 256
crypt:set_encoded_key(bdKey:get_encoded("base64"), "base64")

local bdResult = chilkat.BinData.new()
bdResult:append_encoded(result, "base64")
crypt:set_encoded_iv(bdResult:get_encoded_chunk(0, 16, "base64"), "base64")

-- Remove the IV (first 16 bytes) from the result.
bdResult:remove_chunk(0, 16)
local success = crypt:decrypt_bd(bdResult)
local originalText = bdResult:get_string("utf-8")

print("original text = " .. originalText)