2011-09-20 137 views
3

我需要加密和解密一个字符串。我不能使用散列,因为解密的字符串必须是可读的。我知道mcrypt,但我正在寻找一些使用证书文件进行加密和解密的东西。加密/解密字符串(PHP)

谢谢。

回答

4

您可以使用公钥/私钥通过OpenSSL和很简单,一旦你使用过一次或两次

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 
+0

哦,谢谢。它看起来很容易:)你可以在命令行函数中翻译php函数(openssl ....)吗? – keepwalking

+1

@keepwalking:check out [openssl rsautl](http://www.devco.net/archives/2006/02/13/public_-_private_key_encryption_using_openssl.php)。还可以查看'openssl rsautl -help'获取像padding-scheme之类的选项。 – vstm

+0

@keepwalking:你的意思是使用命令行函数来加密和解密一个字符串?如果是这样,请看看vtsm的链接。 – Kirk

1

那么,如果你想使用非对称加密你要么必须使用openssl_* -functions或phpseclib如果OpenSSL是不可用在你的PHP。

另一件事是你不能使用证书像对称密钥。如果你有一个使用公钥加密的密文(一个证书包含公钥),那么你必须使用私钥解密,并且如果密文使用私钥加密,那么你必须使用公钥解密,否则它会赢得'工作。