Простой обратимый класс шифрования для строк - PullRequest
0 голосов
/ 08 ноября 2011

Я использую следующий класс в своем приложении CakePHP для создания обратимых зашифрованных идентификаторов:

class Tiny
{
    public static $set = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

    public static function toTiny($id)
    {
        $set = self::$set;

        $HexN="";
        $id = floor(abs(intval($id)));
        $radix = strlen($set);
        while (true)
        {
            $R=$id%$radix;
            $HexN = $set{$R}.$HexN;
            $id=($id-$R)/$radix;
            if ($id==0) break;
        }
        return $HexN;
    }

    public static function reverseTiny($str)
    {
        $set = self::$set;
        $radix = strlen($set);
        $strlen = strlen($str);
        $N = 0;
        for($i=0;$i<$strlen;$i++)
        {
            $N += strpos($set,$str{$i})*pow($radix,($strlen-$i-1));
        }
        return "{$N}";
    }
}

Я ищу что-то столь же простое для строк.Где он имеет простую переменную set и всего две функции, одну для шифрования и одну для расшифровки.Все те, что я видел до сих пор, были слишком сложными и слишком основанными на фреймворке.Мне нужен класс, который полностью автономен и не зависит от других файлов и легко интегрируется в CakePHP.

Может кто-нибудь помочь?Кто-нибудь знает об этом или может помочь мне изменить этот скрипт для работы со строками, чтобы я мог создать другой класс.Он должен быть простым в использовании: например, Class::encrypt(string);

Кроме того, безопасность здесь не является главной проблемой, поскольку он не используется для защиты чего-либо, а просто для хеширования строки таким способом, который можно изменить.

Вот что я хочу:

class Encrypt
{
    public static $set = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

    public static function Encrypt($string)
    {
        $set = self::$set;
        return;
    }
    public static function Decrypt($string)
    {
        $set = self::$set;
        return;
    }
}

Ответы [ 5 ]

4 голосов
/ 08 ноября 2011

Вот модифицированная версия кода, который я использую.Он основан на openssl, поэтому он может не подойти, если вам нужно, чтобы он был переносимым.

<?php

class Cipher {                                                                          
   public static function strongRand($num_bytes, $raw = false) {                        
      $rand = openssl_random_pseudo_bytes($num_bytes);                                  
      if (!$raw) {                                                                      
         $rand = base64_encode($rand);                                                  
      }
      return $rand;
   }

   public static function encrypt($data, $password = "default", $type = "aes128") {     
      $iv = Cipher::strongRand(12);                                                     
      $encrypted = openssl_encrypt($data, $type, $password, false, $iv);                
      return $iv . $encrypted;                                                          
   }      

   public static function decrypt($data, $password = "default", $type = "aes128") {     
      $iv = substr($data, 0, 16);
      $data = substr($data, 16);                                                        
      $decrypted = openssl_decrypt($data, $type, $password, false, $iv);                
      return $decrypted;
   }   
}

?>

Пример использования кода:

<?php

include('cipher.php');

$enc = Cipher::encrypt('kachow');
echo $enc . "\n";

$dec = Cipher::decrypt($enc);
echo $dec . "\n";

?>

Выходы:

0fykYiBPJAL/C3fFuX+jApFRdRw7NY8uYmGaaQ==
kachow
1 голос
/ 08 ноября 2011

Существуют различные реализации чистых PHP стандартных криптографических примитивов, таких как AES , которые вы можете использовать, например, this или this .

Алгоритм RC4 , в частности, это то, что вы можете реализовать в дюжине строк PHP, если хотите.

Однако эти реализации вряд ли будут очень эффективными; в общем, когда дело доходит до криптографии на языках высокого уровня, таких как PHP, у вас могут быть любые два: «безопасный», «быстрый» и «автономный».


ОК, если все, что вам нужно, это запутывание, вот что-то основанное на этом примере от "peter at NOSPAM jamit dot com" на php.net:

class Obfuscate
{
    public static function obfuscate($string)
    {
        return str_rot13( base64_encode( $string ) );
    }
    public static function deobfuscate($string)
    {
        return base64_decode( str_rot13( $string ) );
    }
}

Это должно быть быстро и автономно, но обеспечивает очень мало безопасности. В лучшем случае это небольшая головоломка для криптографов-любителей, по уровню, сравнимая с газетным кроссвордом.

1 голос
/ 08 ноября 2011

Если вам нужно зашифровать числа, я использую эти простые функции (измените случайные буквы в функции _map_key на те, которые вы хотите, просто убедитесь, что они уникальны). Если у вас нет чисел, кроме строки, вы можете STR2BIN их, затем используйте эту функцию:

function _map_kid($kid, $umap=false){
    $map = array('M','Y','S','I','M','P','L','E','K');
    $ret = '';
    for($i = 0; $i<strlen($kid); $i++){
        if($umap){
            $ret .= array_search(substr($kid,$i,1),$map);
        } else {
            $ret .= $map[substr($kid,$i,1)];
        }
    }
    return $ret;
}
function cript_customer_id($customer_id, $key=0){
    if($key==0){
        $key = trim(microtime(true));
    }
    $key = intval($key);
    if(strlen($key)<=3)     $key +=999;
    if(substr($key,-1)==0)  $key +=3;
    $key = substr($key,-3);
    $kid = ((($customer_id.substr($key,0,1))+substr($key,1,1))*substr($key,-1)).$key;
    return _map_kid($kid);
}

function _decript_customer_id($kid){
    if(trim($kid)=='') return false;
    $kid = strtoupper($kid);
    $kid = _qsc2_map_kid($kid, true);
    $key = substr($kid, -3);
    $customer_id = substr($kid, 0, -3);
    if(substr($key,-1)>0){
        $customer_id = substr((($customer_id/substr($key,-1))-substr($key,1,1)),0,-1);
    } else {
        $customer_id = 0;
    }
    return $customer_id;
}
0 голосов
/ 08 ноября 2011

Я предпочитаю использовать mcrypt, но если не хочу, попробуйте найти что-то полезное на phpclasses.org, например: http://www.phpclasses.org/package/2995-PHP-Encode-and-decode-text-strings-with-random-keys.html

0 голосов
/ 08 ноября 2011

Просмотр функций MCrypt .Это будет даже короче, чем приведенный выше код.И в безопасности тоже!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...