[英]Simple reversible encrypt class for strings
我在CakePHP應用程序中使用以下類創建可逆的加密ID:
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}";
}
}
我正在尋找對字符串一樣簡單的東西。 它有一個簡單的設置變量,只有兩個函數,一個用於加密,一個用於解密。 到目前為止,我所看到的所有內容都過於復雜且過於基於框架。 我想要一個完全獨立並且不依賴於其他文件並且可以輕松集成到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;
}
}
這是我使用的代碼的修改版本。 它依賴於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
如果您需要加密數字,則可以使用這些簡單的函數(將_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;
}
有標准的加密原語等的各種純PHP實現AES ,你可以使用,像這樣或這樣一個 。
尤其是RC4算法,如果需要,您可以在大約12行PHP中實現。
但是,這些實現不太可能非常有效。 通常,在使用PHP之類的高級語言進行加密時,您可以選擇“安全”,“快速”和“自包含”中的任意兩個。
好的,如果您想要的只是混淆,這是基於此示例的內容, 該示例基於php.net上的“ NOSPAM jamit dot com的彼得”:
class Obfuscate
{
public static function obfuscate($string)
{
return str_rot13( base64_encode( $string ) );
}
public static function deobfuscate($string)
{
return base64_decode( str_rot13( $string ) );
}
}
這應該是快速且自包含的,但是它提供的安全性很小。 充其量,它對業余密碼學家來說是一個不錯的小難題,其水平可以與報紙填字游戲相提並論。
查看MCrypt函數。 它甚至比上面的代碼還要短。 並確保安全!
我更喜歡使用mcrypt,但如果不想,請嘗試在phpclasses.org上找到有用的東西,例如http://www.phpclasses.org/package/2995-PHP-Encode-and-decode-text -strings與-隨機keys.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.