EncryptionController.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\Request;
  4. use ErrorException;
  5. use SodiumException;
  6. class EncryptionController extends Controller{
  7. private $public_key = "WrBEGoJnMnMhC/2hiaYypcmPwP9Z4p4/bNex0T/WUWA=";
  8. private $secret_key = "CEIBkv7QG1WoAoBO7Ny5cqzyJ5yCUwBMhnFYUBbCeTk=";
  9. public function encrypt($msg){
  10. $nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES);
  11. $nonceArr = array();
  12. for($i = 0; $i < strlen($nonce); $i++){
  13. $char = $nonce[$i];
  14. $ascii = ord($char);
  15. $nonceArr[] = $ascii;
  16. }
  17. $nonceJson = json_encode($nonceArr);
  18. $nonceStr = base64_encode($nonceJson);
  19. $encryption_key = sodium_crypto_box_keypair_from_secretkey_and_publickey(
  20. base64_decode($this->secret_key),
  21. base64_decode($this->public_key)
  22. );
  23. $encrypted = sodium_crypto_box($msg, $nonce, $encryption_key);
  24. $encryptedArr = array();
  25. for($i = 0; $i < strlen($encrypted); $i++){
  26. $char = $encrypted[$i];
  27. $ascii = ord($char);
  28. $encryptedArr[] = $ascii;
  29. }
  30. $encryptedJson = json_encode($encryptedArr);
  31. $encryptedStr = base64_encode($encryptedJson);
  32. return base64_encode($encryptedStr . "|" . $nonceStr);
  33. }
  34. public function decrypt($enc){
  35. $dec = base64_decode($enc);
  36. $decArr = explode("|", $dec);
  37. if(count($decArr) < 2){
  38. return false;
  39. }
  40. $nonceDec = base64_decode($decArr[1]);
  41. $caddec = base64_decode($decArr[0]);
  42. $nonceArr = json_decode($nonceDec);
  43. $cadArr = json_decode($caddec);
  44. $nonceF = "";
  45. if(is_null($nonceArr)) return false;
  46. foreach($nonceArr as $asciiF){
  47. $nonceF .= chr($asciiF);
  48. }
  49. $cadF = "";
  50. foreach($cadArr as $asciiF){
  51. $cadF .= chr($asciiF);
  52. }
  53. $encryption_key_dec = sodium_crypto_box_keypair_from_secretkey_and_publickey(
  54. base64_decode($this->secret_key),
  55. base64_decode($this->public_key)
  56. );
  57. $decrypted = sodium_crypto_box_open($cadF, $nonceF, $encryption_key_dec);
  58. return $decrypted;
  59. }
  60. public function shortEnc($str){
  61. $nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES);
  62. $encKey = sodium_crypto_box_keypair_from_secretkey_and_publickey(
  63. base64_decode($this->secret_key),
  64. base64_decode($this->public_key)
  65. );
  66. $strEnc = sodium_crypto_box($str, $nonce, $encKey);
  67. return base64_encode($strEnc . "||" . $nonce);
  68. }
  69. public function shortDec($enc){
  70. $enc = str_replace("=P=", "+", $enc);
  71. $enc = str_replace("=S=", "/", $enc);
  72. $strEnc = base64_decode($enc);
  73. $arrEnc = explode("||", $strEnc);
  74. $decKey = sodium_crypto_box_keypair_from_secretkey_and_publickey(
  75. base64_decode($this->secret_key),
  76. base64_decode($this->public_key)
  77. );
  78. try{
  79. return sodium_crypto_box_open($arrEnc[0], $arrEnc[1], $decKey);
  80. }catch(ErrorException $e){
  81. return false;
  82. }catch(SodiumException $e){
  83. return false;
  84. }
  85. }
  86. }