KeyEncryption.php 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. <?php
  2. namespace ACES\Common;
  3. use ACES\Common\Exception\EncryptExceptoin;
  4. use ACES\Common\Exception\DecryptException;
  5. /**
  6. * Key Encryption Class
  7. *
  8. * <P>
  9. *
  10. * @version 1.0
  11. */
  12. class KeyEncryption {
  13. const RANDOM_SIZE = 16;
  14. const ZERO_IV = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
  15. public static function encrypt($mkey, $pt)
  16. {
  17. $rsec = Crypto::secureRandom(self::RANDOM_SIZE);
  18. $iv = str_pad($rsec, Crypto::CIPHER_IV_SIZE, "\x00");
  19. $ct_data = openssl_encrypt($pt, Crypto::CIPHER_METHOD_AES_128_CBC, $mkey->getKey(), OPENSSL_RAW_DATA, $iv);
  20. if ($ct_data === FALSE)
  21. throw new EncryptExceptoin("Key encryption error. Cipher method: " . Crypto::CIPHER_METHOD_AES_128_CBC);
  22. $ct = $rsec . $ct_data;
  23. return $ct;
  24. }
  25. public static function decrypt($mkey, $ct)
  26. {
  27. $rsec = substr($ct, 0, self::RANDOM_SIZE);
  28. $ct_data = substr($ct, self::RANDOM_SIZE, strlen($ct) - self::RANDOM_SIZE);
  29. $iv = str_pad($rsec, Crypto::CIPHER_IV_SIZE, "\x00");
  30. $pt = openssl_decrypt($ct_data, Crypto::CIPHER_METHOD_AES_128_CBC, $mkey->getKey(), OPENSSL_RAW_DATA, $iv);
  31. if ($pt === FALSE)
  32. throw new DecryptException("Key decryption error. Cipher method: " . Crypto::CIPHER_METHOD_AES_128_CBC);
  33. return $pt;
  34. }
  35. public static function wrap($mkey, $dkey)
  36. {
  37. $ct = openssl_encrypt(
  38. $dkey,
  39. Crypto::CIPHER_METHOD_AES_128_CBC,
  40. $mkey->getKey(),
  41. OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING,
  42. self::ZERO_IV);
  43. if($ct === FALSE){
  44. throw new EncryptExceptoin("Key encryption error. Cipher method: " . Crypto::CIPHER_METHOD_AES_128_CBC);
  45. }
  46. return $ct;
  47. }
  48. public static function unwrap($mkey, $ct)
  49. {
  50. $pt = openssl_decrypt(
  51. $ct,
  52. Crypto::CIPHER_METHOD_AES_128_CBC,
  53. $mkey->getKey(),
  54. OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING,
  55. self::ZERO_IV);
  56. if($pt === FALSE){
  57. throw new DecryptException("Key decryption error, Cipher method: " . Crypto::CIPHER_METHOD_AES_128_CBC);
  58. }
  59. return $pt;
  60. }
  61. }