2010-08-22 99 views
0

给定的输入字符串(实际上是一个整数值)和加密密钥,我需要输入字符串以这样的方式加密生成的字符串是:安全加密/解密功能

  1. 网址安全(我允许的URI字符目前:AZ 0-9〜%:_-)
  2. 名安全(意思是,它仅使用有效的目录/文件名字符)
  3. FTP帐户的用户名安全
  4. 电子邮件帐户的用户名安全

然后,给定加密的字符串和相同的加密密钥,将字符串解密为未加密的形式。

这不是一个安全措施。实现需要使用PHP。谢谢。

EDIT 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); 
} 
+1

你挣扎着的部分是什么?或者这是一个更复杂的“给代码”? – Artefacto 2010-08-22 22:53:59

+0

正在寻找已经拥有此功能的人。希望我不是世界上第一个有这样要求的人。如果你有这样的功能(或者甚至有一些功能),如果你不介意分享,那么我很乐意看到它。 – StackOverflowNewbie 2010-08-22 22:58:28

+0

@Stack所以这实际上不是一个编程问题,它是[信息检索](http://en.wikipedia.org/wiki/Information_retrieval)任务。然后投票结束。 – Artefacto 2010-08-22 23:00:30

回答

1

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

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

EDIT 1:

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

+0

这是个好主意。我已经有一个加密/解密功能。我的问题是我收到了不受欢迎的字符。有没有办法确保编码结果的字符串不超过一定的长度? (例如,电子邮件地址的本地部分显然仅限于64个字符:http://en.wikipedia.org/wiki/Email_address#Specification) – StackOverflowNewbie 2010-08-22 23:09:39

+0

我编辑了原始帖子。任何建议如何我可以改善编码? – StackOverflowNewbie 2010-08-22 23:14:10

1

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

一旦你得到它的工作,然后,如果你需要更多的安全性,你可以改变加密功能,因为你的程序的其余部分不会在意。

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

由于您正在加密长度至多为8个字节的int,所以任何长度的密钥都应该没问题,为了获得已知大小的结果,您的密钥需要大于等于8个字节。

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

如果要加密任意长度的字符串,则前一段会出错,因为加密消息的大小将不可知。

+0

只使用mcrypt是不够的。你必须知道如何使用它。我在那里看到的大部分使用mcrypt的代码总是重复使用相同的IV ... – Artefacto 2010-08-23 00:12:37

+0

@Artefacto - 我包括指向手册的链接,因为我发现其他人的评论比原始文档要好,但它需要同时通读。但是,如何使用mcrypt也会是一个不同的问题,因为他可以展示他如何使用它,然后其他人就可以展示如何更安全地使用它。 – 2010-08-23 00:44:36