Aplus Framework Docs

Crypto

Aplus Framework Crypto Library

Aplus Framework Crypto Library.

Installation

The installation of this library can be done with Composer:

composer require aplus/crypto

Getting Started

The Crypto library is built on top of Sodium, providing tools that simplify its use.

Box

The Box class allows communication with encrypted messages between two entities.

For this, both must have a public and a private key, generated by their own key pair.

Below we generate the key pair and keys for a user:

use Framework\Crypto\Box;

$user1KeyPair = Box::makeKeyPair(); // string
$user1PublicKey = Box::makePublicKey($user1KeyPair); // string
$user1SecretKey = Box::makeSecretKey($user1KeyPair); // string

Then we generate the key pair and another user's keys:

$user2KeyPair = Box::makeKeyPair(); // string
$user2PublicKey = Box::makePublicKey($user2KeyPair); // string
$user2SecretKey = Box::makeSecretKey($user2KeyPair); // string

Once that's done, let's create a box to encrypt messages from user 1 to user 2.

First, we create a nonce:

$nonce = Box::makeNonce(); // string

Next, we create the Box for user 1, using the secret key for user 1 and the public key for user 2:

$user1Box = new Box($user1SecretKey, $user2PublicKey, $nonce);

So we can encrypt a message with the encrypt method:

$messageFromUser1 = 'What is your name?';
$ciphertext1 = $user1Box->encrypt($messageFromUser1); // string

And it can already be decrypted by user 1, using the decrypt method:

$messageFromUser1 = $user1Box->decrypt($ciphertext1); // What is your name?

For the second user to be able to decrypt the message, it is necessary for him to create an instance of Box using his secret key, the public key of user 1 and the same nonce used in the message:

$user2Box = new Box($user2SecretKey, $user1PublicKey, $nonce);

With this, user 2 will be able to decrypt the ciphertext:

$messageFromUser1 = $user2Box->decrypt($ciphertext1); // What is your name?

To respond, user 2 can create an instance of Box, using user 1's public key:

$user2Box = new Box($user2SecretKey, $user1PublicKey, $nonce);

And then encrypt the message:

$messageFromUser2 = 'John';
$ciphertext2 = $user2Box->encrypt($messageFromUser2); // string

Then the ciphertext can be decrypted by user 1:

$messageFromUser2 = $user1Box->decrypt($ciphertext2); // John

And by user 2 himself:

$messageFromUser2 = $user2Box->decrypt($ciphertext2); // John

BoxSeal

BoxSeal allows you to encrypt a message so that only the recipient can decrypt it.

First of all, the recipient needs to have a keypair that can be generated by the makeKeyPair method:

use Framework\Crypto\BoxSeal;

$keyPair = BoxSeal::makeKeyPair(); // string

Then it generates a public key with the makePublicKey method:

$publicKey = BoxSeal::makePublicKey($keyPair); // string

And this public key will be given to whoever will encrypt the messages.

Below is a message being encrypted:

$message = 'Expect Us!';
$ciphertext = BoxSeal::encrypt($message, $publicKey); // string

Then, when the ciphertext is delivered to the recipient, he can decrypt the message using the $keyPair with the decrypt method:

$message = BoxSeal::decrypt($ciphertext, $keyPair); // Expect Us!

GenericHash

The GenericHash class allows verifying messages through signatures.

First, you must generate a key with the makeKey method:

use Framework\Crypto\GenericHash;

$key = GenericHash::makeKey(); // string

Once this is done, it is possible to generate signatures for messages. Let's look at the following example:

$genericHash = new GenericHash($key);

$message = 'Hello, friend';
$signature = $genericHash->signature($message); // string

And then you can perform the verification:

if ($genericHash->verify($message, $signature)) {
    echo 'Message is verified.';
} else {
    echo 'Error: Message is not verified.';
}

Password

With the Password class it is possible to generate hashes and verify passwords.

Let's see how to generate a hash:

use Framework\Crypto\Password;

$password = 'iloveyou';
$hash = Password::hash($password); // string

The hash can be saved for future verification with the user's password, it is 97 characters long.

To verify that the password is valid, comparing it with the saved hash, you can use the verify method:

Password::verify($password, $hash); // bool

If it returns true, the password is correct.

The hash method has two parameters for setting Limits:

$opslimit = Password::LIMIT_INTERACTIVE;
$memlimit = Password::LIMIT_MODERATE;
$hash = Password::hash($password, $opslimit, $memlimit); // string

When limits change, it may be necessary to recreate a valid hash to store.

To find out if you need to create a new hash, use the needsRehash method:

Password::needsRehash($hash); // bool

It also has parameters to pass the limits of operations and memory:

if (Password::needsRehash($hash, Password::LIMIT_MODERATE)) {
    $hash = Password::hash($password, Password::LIMIT_MODERATE);
}

Limits

The Password class has three constants that must be used to set the number of CPU operations or memory usage.

These values can be set in the methods of the class at each call or set in properties by the setOpsLimit and setMemLimit methods:

Password::setOpsLimit(Password::LIMIT_SENSITIVE); // void
Password::setMemLimit(Password::LIMIT_MODERATE); // void

LIMIT_INTERACTIVE

Used to set operations or memory limit as interactive.

It enables the use of 2 CPU operations or 64 MB RAM.

LIMIT_MODERATE

Used to set operations or memory limit as moderate.

It enables the use of 3 CPU operations or 256 MB RAM.

LIMIT_SENSITIVE

Used to set operations or memory limit as sensitive.

It enables the use of 4 CPU operations or 1 GB RAM.

SecretBox

The SecretBox class allows you to encrypt and decrypt messages through a key and a nonce.

First, you must have a key and a nonce. Which can be generated as in the example below:

use Framework\Crypto\SecretBox;

$key = SecretBox::makeKey(); // string
$nonce = SecretBox::makeNonce(); // string

With these two strings it will be possible to encrypt messages and decrypt ciphertexts.

To do this, create an instance of the SecretBox class passing the key and nonce in the constructor:

$secretBox = new SecretBox($key, $nonce);

Once this is done, it is possible to encrypt messages:

$message = 'Hello, Sodium!';
$ciphertext = $secretBox->encrypt($message); // string

And also decrypt:

$message = $secretBox->decrypt($ciphertext); // string or false

Note that the decrypt method will return false if it fails to decrypt.

Sign

The Sign class allows you to create message signatures using secret keys and verify message authenticity using public keys.

First, you must have a key pair to generate the secret and public keys:

use Framework\Crypto\Sign;

$keyPair = Sign::makeKeyPair(); // string

Then, the secret key that will be used to create the message signature is generated:

$secretKey = Sign::makeSecretKey($keyPair); // string

Then the public key is generated. It is with it that the signature will be verified:

$publicKey = Sign::makePublicKey($keyPair); // string

Below, we have a message and we generate a signature for it, using the same message and also the secret key:

$message = 'Ai, aiaiai quiri qui uai';
$signature = Sign::signature($message, $secretKey); // string

The message, signature and public key can be sent to the verifier, which will use them to verify that the signature is valid:

if (Sign::verify($message, $signature, $publicKey)) {
    echo 'Signature is verified!';
} else {
    echo 'Error: Signature is not verified!';
}

Note that for this type of communication the secret key and the key pair should be stored secretly.

Utils

The Utils class has conversion methods resistant to side-channel attacks for Hexadecimal and Base64.

Hexadecimal

It is possible to convert a binary string to hexadecimal:

use Framework\Crypto\Utils;

$string = 'foo';
$hex = Utils::bin2hex($string); // string

And also convert from hexadecimal to binary:

$string = Utils::hex2bin($hex); // string

Base64

It is possible to convert a binary string to base64:

use Framework\Crypto\Utils;

$string = 'foo';
$base64 = Utils::bin2base64($string); // string

And also convert from base64 to binary:

$string = Utils::base642bin($base64); // string

Conclusion

Aplus Crypto Library is an easy-to-use tool for, beginners and experienced, PHP developers.
It is perfect for communicating with encrypted data and creating secure hashes.
The more you use it, the more you will learn.

Did you find something wrong?
Be sure to let us know about it with an issue.
Thank you!

Search results