加密/解密字符串(PHP)

3
我需要加密和解密一个字符串。我不能使用哈希,因为解密后的字符串必须是可读的。我知道mcrypt,但我正在寻找一些使用证书文件来加密和解密的东西。
谢谢。
2个回答

4

您可以通过openssl使用公钥/私钥,一旦使用了1-2次,这就非常简单了。

function encryptString($clearText)
{
  $keyFile=fopen("public.pem","r");
  $publicKey=fread($keyFile,8192);
  fclose($keyFile);

  openssl_get_publickey($publicKey);
  openssl_public_encrypt($clearText,$cryptText,$publicKey);
  return(base64_encode($cryptText));
}

function decryptString($cryptText)
{
  $keyFile=fopen("private.pem","r");
  $privateKey=fread($keyFile,8192);
  fclose($keyFile);

  openssl_get_privatekey($privateKey);
  $binText = base64_decode($cryptText);
  openssl_private_decrypt($binText,$clearText,$privateKey);
  return($clearText);
}

生成密钥对需要按照以下简要指南进行操作:http://en.wikibooks.org/wiki/Transwiki:Generate_a_keypair_using_OpenSSL 简而言之,
openssl rsa -pubout -in private.pem -out public.pem

更新

@keepwalking在下面问如何通过命令行实现此操作,@vstm回答并提供了一个很好的链接http://www.devco.net/archives/2006/02/13/public_-_private_key_encryption_using_openssl.php

总结一下这个页面,一旦您创建了密钥,您就可以使用以下命令将文本文件 file.txt 加密并输出到 file.ssl 。

openssl rsautl -encrypt -inkey public.pem -pubin -in file.txt -out file.ssl

如果要将file.ssl解密到另一个文件decrypt.txt,您可以使用以下命令。

openssl rsautl -decrypt -inkey private.pem -in file.ssl -out decrypted.txt

哦,谢谢。看起来很容易 :) 你能把 PHP 函数翻译成命令行函数吗(例如 openssl ....)? - keepwalking
1
@keepwalking:请查看openssl rsautl。还可以查看openssl rsautl -help,了解填充方案等选项。 - vstm
@keepwalking:你是指使用命令行函数来加密和解密字符串吗?如果是,请看一下vtsm的链接。 - Kirk
我已经更新了这篇文章,加入了@vtsm发布的命令行示例。非常棒的链接。 - Kirk

1

如果你想使用非对称加密,你要么必须使用openssl_* 函数,要么使用phpseclib(如果 php 上没有可用的 openssl)。

另一件事是你不能像使用对称密钥那样使用证书。如果你有使用公钥加密的密文(证书包含公钥),则必须使用私钥解密;反之,如果密文是使用私钥加密的,则必须使用公钥解密,否则无法正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接