/**
  * Encrypt a message using public key encryption.
  *
  * @param string $message The message to be encrypted.
  * @param string $sender_private The senders private key.
  * @param string $receiver_public The receivers public key.
  * @return string The JSON string for the encrypted message.
  * @throws InvalidTypeException
  */
 public static function encrypt($message, $sender_private, $receiver_public)
 {
     # Test to make sure all the required variables are strings.
     Helpers::isString($message, 'PublicKeyEncryption', 'encrypt');
     Helpers::isString($sender_private, 'PublicKeyEncryption', 'encrypt');
     Helpers::isString($receiver_public, 'PublicKeyEncryption', 'encrypt');
     # Generate a keypair for the message to be sent.
     $messageKeyPair = \Sodium\crypto_box_keypair_from_secretkey_and_publickey(Helpers::hex2bin($sender_private), Helpers::hex2bin($receiver_public));
     # Generate the nonce for usage.
     $nonce = Entropy::generateNonce();
     # Encrypt the message and return it.
     return base64_encode(json_encode(['msg' => Helpers::bin2hex(\Sodium\crypto_box($message, $nonce, $messageKeyPair)), 'nonce' => Helpers::bin2hex($nonce)]));
 }
 /**
  * @requires extension libsodium
  */
 public function test16BitInteger()
 {
     $this->assertTrue(is_integer(Entropy::integer16()));
 }