我在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}";
}
}
我正在寻找与弦乐一样简单的东西。它有一个简单的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;
}
}
答案 0 :(得分:4)
这是我使用的代码的修改版本。它依赖于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 :(得分:1)
如果您需要加密数字,我会使用这些简单的函数(将函数_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;
}
答案 2 :(得分:1)
您可以使用标准加密原语(如AES)的各种纯PHP实现,例如this或this one。
RC4算法,尤其是你可以在大约十几行PHP中实现的。
然而,这些实现可能不是非常有效;一般来说,当谈到像PHP这样的高级语言的加密时,你可以拥有“安全”,“快速”和“自包含”中的任何两种。
好的,如果你想要的只是混淆,这里的内容是基于this example的“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 ) );
}
}
这应该是快速且独立的,但它提供的安全性非常低。对于业余密码学家来说,它最好是一个很好的小谜题,其水平可能与报纸填字游戏相媲美。
答案 3 :(得分:0)
查看MCrypt函数。它甚至会比上面的代码更短。也是安全的!
答案 4 :(得分:-1)
我更喜欢使用mcrypt,但如果不想,请尝试在phpclasses.org上找到有用的东西,就像这个http://www.phpclasses.org/package/2995-PHP-Encode-and-decode-text-strings-with-random-keys.html