安全加密/解密功能

时间:2010-08-22 22:52:28

标签: php encryption

给定一个输入字符串(实际上是一个整数值)和一个加密密钥,我需要加密输入字符串,使结果字符串为:

  1. URL安全(我允许的URI字符当前为:a-z 0-9~%。:_-)
  2. 文件名安全(意思是,它只使用有效的目录/文件名字符)
  3. FTP帐户用户名安全
  4. 电子邮件帐户用户名安全
  5. 然后,给定加密字符串和相同的加密密钥,将字符串解密为未加密的形式。

    这不是一种安全措施。实现需要在PHP中。感谢。

    编辑1(解码仍包含不需要的字符;此外,无法确保生成的加密字符串在一定长度内):

    function decrypt($string, $encryption_key)
    {
        assert(isset($string) === TRUE);
        assert(isset($encryption_key) === TRUE);
    
        $result = '';
        $string = base64_decode($string);
    
        for ($i = 0; $i < strlen($string); $i++)
        {
            $char    = substr($string, $i, 1);
            $keychar = substr($encryption_key, ($i % strlen($encryption_key)) - 1, 1);
            $char    = chr(ord($char) - ord($keychar));
            $result .= $char;
        }
    
        return $result;
    }
    
    
    function encrypt($string, $encryption_key)
    {
        assert(isset($string) === TRUE);
        assert(isset($encryption_key) === TRUE);
    
        $string = (string) $string;
        $result = '';
    
        for ($i = 0; $i < strlen($string); $i++)
        {
            $char    = substr($string, $i, 1);
            $keychar = substr($encryption_key, ($i % strlen($encryption_key)) - 1, 1);
            $char    = chr(ord($char) + ord($keychar));
            $result .= $char;
        }
    
        return base64_encode($result);
    }
    

2 个答案:

答案 0 :(得分:1)

将加密和编码视为两个不同的无关步骤。在一个方向上,您加密明文字节以获取密码字节,然后对字节进行编码以获取字符串。你解码字符串的另一个方向是获取密文字节,然后解密密文字节以获得明文字节。

使用简单的十六进制或基数为16的编码器可以最简单地满足您的要求,该编码器将一个字节转换为两个十六进制字符。如果编码空间效率绝对至关重要,您可以实现自己的base-62编码器,该编码器仅使用大写和小写字母和数字。它会比十六进制编码更慢,也可能更丑。

编辑1:

如果base-64编码产生可接受的字符串则更好。 Base-64使用4个字符来编码3个字节。因此,如果您限制为64个字符,那么您的编码不能超过(64/4)* 3 = 48个字节。

答案 1 :(得分:1)

对于加密,根据您的安全需求,mcrypt_encrypt(http://us2.php.net/manual/en/function.mcrypt-encrypt.php)函数可能很简单。

一旦你开始工作,那么,如果你需要更多的安全性,你可以改变加密功能,因为你的程序的其他部分都不会关心。

加密后,您可以使用base-64编码(http://us2.php.net/manual/en/function.base64-encode.php),这是一种经过充分测试的已知模式。

由于您正在加密一个长度最多为8个字节的int,因此任何长度的密钥应该没问题,以便具有已知大小的结果,您的密钥需要> = 8个字节。

我建议您不要编写自己的加密算法,因为它不安全,并且有很多可以满足您的需求,具体取决于您拥有的其他任何要求。如前所述,您可以返回并确定您希望编码字符串的大小,这将告诉您加密结果可以有多少字节。然后,您可以计算出密钥的大小,以获得加密消息的大小。

如果要加密任意长度的字符串,那么前一段将是错误的,因为加密消息的大小将不知道。