好的,所以我试图弄清楚如何从十六进制加密到字符串和返回,但由于某种原因,当我加密时,我没有得到传入的相同密码,但它的关闭。 ..怪不对?我确定我的语法在某处错了。帮助
这是测试一个随机密码的链接。我将'pw'设置为十六进制版本并将其传递给:view demo
$encoded = (string)$_GET['pw'];
$literals = explode(' ', wordwrap($encoded, 2, ' ', 2));
$password = '';
for ($i = 0; $i < count($literals); $i++) {
$password .= chr(hexdec($literals[$i]) - $i);
}
echo $password . '<br />';
print_r($literals) . '<br />';
$passarray = str_split($password);
echo '<pre>';
print_r($passarray);
echo '</pre>';
for($i = 0; $i < count($passarray); $i++) {
$newpassword .= bin2hex($passarray[$i]);
}
echo $newpassword;
更新:
。我实际上并没有尝试“加密”安全性本身...我实际上是在尝试自动创建Dreamweaver站点定义文件,这是他们用来半隐藏密码的“加密” 。我可以通过复制文件和插入不同的用户名来实现这一点,但我也想每次都发出新密码。仅供参考
答案 0 :(得分:3)
仔细观察这一行:
$password .= chr(hexdec($literals[$i]) - $i);
您将值减少$i
。因此,每增加一个值,该值将为$literals[$i] - $i
。
这与上述相反:
$newpassword .= dechex(ord($passarray[$i]) + $i);
答案 1 :(得分:1)
感谢Lekensteyn的上述反转代码。在我的测试中,似乎Dreamweaver也期待大写字母,所以我添加了一个strtoupper,如下所示。我使用此代码从域列表和ftp凭据动态生成Dreamweaver站点定义文件(.ste)。
function dw_encode_pw($pw='') {
$password = '';
$passarray = str_split($pw);
for($i = 0; $i < count($passarray); $i++) {
$password .= strtoupper(dechex(ord($passarray[$i]) + $i));
}
return $password;
}
function dw_decode_pw($pw='') {
if (empty($pw)) {
return false;
}
$encoded = (string) $pw;
$literals = explode(' ', wordwrap($encoded, 2, ' ', 2));
$password = '';
for ($i = 0; $i < count($literals); $i++) {
$password .= chr(hexdec($literals[$i]) - $i);
}
return $password;
}
还要感谢http://blog.affirmix.com/2008/08/28/encoded-passwords-in-ste-site-definition-files/和http://www.matthewratzloff.com/blog/2007/04/18/decrypting-a-dreamweaver-site-definition-password/,它们也会探讨这个话题......
希望这可以帮助其他人寻找这个解决方案!
答案 2 :(得分:0)
十六进制不是加密,而是编码(实际上它主要是一个数字基础)。看起来你正在混合基本转换和字符编码本身的十六进制编码。
hexdec
将分别将0,1,9,A,F,10分别变为0,1,9,10,15,16。chr
会将十进制数转换为字符(使用ASCII字符编码)$i
。bin2hex
有效地为您提供二进制数据序列的十六进制表示(至少可以打印出来)。它不一定与chr(hexdec(...))
相反。总的来说,目前还不清楚你在这里想要实现什么样的密码保护,因为它只是编码。