101 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
namespace nur\passwd;
 | 
						|
 | 
						|
use nur\b\IllegalAccessException;
 | 
						|
 | 
						|
/**
 | 
						|
 * Class passwords; outils pour gérer les mots de passe
 | 
						|
 */
 | 
						|
class passwords {
 | 
						|
  /** obtenir le salt d'un mot de passe hashé en CRYPT */
 | 
						|
  static function get_des_crypt_salt(string $crypt): string {
 | 
						|
    return substr($crypt, 0, 2);
 | 
						|
  }
 | 
						|
 | 
						|
  static function des_crypt(string $clear, ?string $salt=null): string {
 | 
						|
    if ($salt === null) $salt = "AA";
 | 
						|
    return crypt($clear, $salt);
 | 
						|
  }
 | 
						|
 | 
						|
  static function sha(string $clear): string {
 | 
						|
    return base64_encode(sha1($clear, true));
 | 
						|
  }
 | 
						|
 | 
						|
  static function xsha(string $clear): string {
 | 
						|
    return strtoupper(sha1($clear));
 | 
						|
  }
 | 
						|
 | 
						|
  /** obtenir le salt d'un mot de passe hashé en SSHA */
 | 
						|
  static function get_ssha_salt(string $ssha): string {
 | 
						|
    return substr(base64_decode($ssha), 20);
 | 
						|
  }
 | 
						|
 | 
						|
  static function ssha(string $clear, ?string $salt=null): string {
 | 
						|
    if ($salt === null) $salt = random_bytes(20);
 | 
						|
    return base64_encode(sha1("$clear$salt", true).$salt);
 | 
						|
  }
 | 
						|
 | 
						|
  static function ntlm(string $clear): string {
 | 
						|
    $string = iconv("UTF-8", "UTF-16LE", $clear);
 | 
						|
    return strtoupper(bin2hex(hash("md4", $string, true)));
 | 
						|
  }
 | 
						|
 | 
						|
  private static function lm_des_encrypt(string $string) {
 | 
						|
    $len = strlen($string);
 | 
						|
    $tmp = [];
 | 
						|
    for ($i = 0; $i < 7; $i++) {
 | 
						|
      $tmp[] = $i < $len? ord($string[$i]): 0;
 | 
						|
    }
 | 
						|
    $key = [];
 | 
						|
    $key[] = $tmp[0] & 254;
 | 
						|
    $key[] = ($tmp[0] << 7) | ($tmp[1] >> 1);
 | 
						|
    $key[] = ($tmp[1] << 6) | ($tmp[2] >> 2);
 | 
						|
    $key[] = ($tmp[2] << 5) | ($tmp[3] >> 3);
 | 
						|
    $key[] = ($tmp[3] << 4) | ($tmp[4] >> 4);
 | 
						|
    $key[] = ($tmp[4] << 3) | ($tmp[5] >> 5);
 | 
						|
    $key[] = ($tmp[5] << 2) | ($tmp[6] >> 6);
 | 
						|
    $key[] = $tmp[6] << 1;
 | 
						|
 | 
						|
    $key0 = "";
 | 
						|
    foreach ($key as $k) {
 | 
						|
      $key0 .= chr($k);
 | 
						|
    }
 | 
						|
    $crypt = openssl_encrypt("KGS!@#$%", "des-ecb", $key0
 | 
						|
      , OPENSSL_RAW_DATA + OPENSSL_ZERO_PADDING);
 | 
						|
 | 
						|
    return bin2hex($crypt);
 | 
						|
  }
 | 
						|
 | 
						|
  static function lm(string $clear): string {
 | 
						|
    $string = strtoupper(substr($clear,0,14));
 | 
						|
    $part1 = self::lm_des_encrypt(substr($string, 0, 7));
 | 
						|
    $part2 = self::lm_des_encrypt(substr($string, 7, 7));
 | 
						|
    return strtoupper($part1.$part2);
 | 
						|
  }
 | 
						|
 | 
						|
  private static $lsc_key;
 | 
						|
 | 
						|
  static function init_lsc(string $key): void {
 | 
						|
    self::$lsc_key = hex2bin($key);
 | 
						|
  }
 | 
						|
  private static function lsc_key(): string {
 | 
						|
    $lsc_key = self::$lsc_key;
 | 
						|
    if ($lsc_key === null) {
 | 
						|
      throw IllegalAccessException::unexpected_state("init_lsc");
 | 
						|
    }
 | 
						|
    return $lsc_key;
 | 
						|
  }
 | 
						|
 | 
						|
  static function is_lsc_available(): bool {
 | 
						|
    return self::$lsc_key !== null;
 | 
						|
  }
 | 
						|
 | 
						|
  static function decrypt_lsc(string $lsc): string {
 | 
						|
    return openssl_decrypt($lsc, "aes-128-ecb", self::lsc_key());
 | 
						|
  }
 | 
						|
 | 
						|
  static function encrypt_lsc(string $clear): string {
 | 
						|
    return openssl_encrypt($clear, "aes-128-ecb", self::lsc_key());
 | 
						|
  }
 | 
						|
}
 |