在函数中需要密钥来加密字符串而不使用php中的mcrypt库
function encrypt($str, $pass){
$str_arr = str_split($str);
$pass_arr = str_split($pass);
$add = 0;
$div = strlen($str) / strlen($pass);
while ($add <= $div) {
$newpass .= $pass;
$add++;
}
$pass_arr = str_split($newpass);
foreach($str_arr as $key =>$asc) {
$pass_int = ord($pass_arr[$key]);
$str_int = ord($asc);
$int_add = $str_int + $pass_int;
$ascii .= chr($int_add);
}
return $ascii;
}
function decrypt($enc, $pass){
$enc_arr = str_split($enc);
$pass_arr = str_split($pass);
$add = 0;
$div = strlen($enc) / strlen($pass);
while ($add <= $div) {
$newpass .= $pass;
$add++;
}
$pass_arr = str_split($newpass);
foreach($enc_arr as $key =>$asc) {
$pass_int = ord($pass_arr[$key]);
$enc_int = ord($asc);
$str_int = $enc_int - $pass_int;
$ascii .= chr($str_int);
}
return $ascii;
}
这对我的角色不起作用我测试它
答案 0 :(得分:7)
这是另一种方法:
$key = 'the quick brown fox jumps over the lazy ';
$string = 'Hey we are testing encryption';
echo enc_encrypt($string, $key)."\n";
echo enc_decrypt(enc_encrypt($string, $key), $key)."\n";
function enc_encrypt($string, $key) {
$result = '';
for($i = 0; $i < strlen($string); $i++) {
$char = substr($string, $i, 1);
$keychar = substr($key, ($i % strlen($key))-1, 1);
$char = chr(ord($char) + ord($keychar));
$result .= $char;
}
return base64_encode($result);
}
function enc_decrypt($string, $key) {
$result = '';
$string = base64_decode($string);
for($i = 0; $i < strlen($string); $i++) {
$char = substr($string, $i, 1);
$keychar = substr($key, ($i % strlen($key))-1, 1);
$char = chr(ord($char) - ord($keychar));
$result .= $char;
}
return $result;
}
同样,不要指望这是非常安全的。
答案 1 :(得分:5)
这段代码效率很低,我并不惊讶它没有给出预期的结果。
echo RotEncrypt('cheese', 'pie') . "\n<br>\n"
.RotDecrypt(RotEncrypt('cheese', 'pie'), 'pie');
// ÓÑÊÕÜÊ
// cheese
function RotEncrypt($str, $pass){
$pass = str_split(str_pad('', strlen($str), $pass, STR_PAD_RIGHT));
$stra = str_split($str);
foreach($stra as $k=>$v){
$tmp = ord($v)+ord($pass[$k]);
$stra[$k] = chr( $tmp > 255 ?($tmp-256):$tmp);
}
return join('', $stra);
}
function RotDecrypt($str, $pass){
$pass = str_split(str_pad('', strlen($str), $pass, STR_PAD_RIGHT));
$stra = str_split($str);
foreach($stra as $k=>$v){
$tmp = ord($v)-ord($pass[$k]);
$stra[$k] = chr( $tmp < 0 ?($tmp+256):$tmp);
}
return join('', $stra);
}
经测试,似乎对我来说很好。
无论哪种方式,我觉得我应该警告你,这是一种非常不安全的加密形式,大多数密码使用相同的字符集和相当小的长度范围,这使得该系统非常容易受到人们的影响密码具有相当高的准确度。
答案 2 :(得分:4)
你也可以试试这个:
或者这个:
甚至是这样:
答案 3 :(得分:1)
我在prestashop 1.4.4.1中使用了jlogsdon enc_encrypt
和enc_decrypt
来包装来自Rijndael类的encrypt
和decrypt
方法,使用mcrypt。
我没有检查enc_encrypt
和enc_decrypt
是否与mcrypt_encrypt
和mcrypt_decrypt
表现出相同的结果,但它们似乎在prestashop 1.4.4.1中有效。非常感谢。
答案 4 :(得分:0)
这个问题很旧,但是由于PHP 7没有mcrypt,所以我遇到了同样的问题。我发现最好的解决方案是使用OpenSSL。它内置在PHP中,您不需要任何外部库。
要加密:
function encrypt($key, $payload) {
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
$encrypted = openssl_encrypt($payload, 'aes-256-cbc', $key, 0, $iv);
return base64_encode($encrypted . '::' . $iv);
}
要解密:
function decrypt($key, $garble) {
list($encrypted_data, $iv) = explode('::', base64_decode($garble), 2);
return openssl_decrypt($encrypted_data, 'aes-256-cbc', $key, 0, $iv);
}
参考链接:https://www.shift8web.ca/2017/04/how-to-encrypt-and-execute-your-php-code-with-mcrypt/