给定一个输入字符串(实际上是一个整数值)和一个加密密钥,我需要加密输入字符串,使结果字符串为:
然后,给定加密字符串和相同的加密密钥,将字符串解密为未加密的形式。
这不是一种安全措施。实现需要在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);
}
答案 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个字节。
我建议您不要编写自己的加密算法,因为它不安全,并且有很多可以满足您的需求,具体取决于您拥有的其他任何要求。如前所述,您可以返回并确定您希望编码字符串的大小,这将告诉您加密结果可以有多少字节。然后,您可以计算出密钥的大小,以获得加密消息的大小。
如果要加密任意长度的字符串,那么前一段将是错误的,因为加密消息的大小将不知道。