2015-02-11 84 views
1

我需要发送一个RSA使用公钥加密的密码(以及其他一些数据)。下面是从密码的文档的精确操作的指令:PHP RSA加密逻辑

  • 编码密码Base64和确保UTF-8编码
  • 加密的口令与RSA与提供的公共密钥,没有块模式,和PKCS1Padding
  • 编码导致加密的Base64中以可靠的UTF-8编码

下面是我使用我的代码似乎是正确的:

function encryptPassword($pass) { 

    $pass = base64_encode($pass); 

    $fp = fopen("./cert.crt", "r"); 
    $publicKey = fread($fp, 8192); 
    fclose($fp); 
    openssl_get_publickey($publicKey); 

    openssl_public_encrypt($pass, $cryptedText, $publicKey, OPENSSL_PKCS1_PADDING); 

    return base64_encode(utf8_encode($cryptedText)); 
} 

我在对方说错误,说密码无法解码。除了错误信息之外,他们的支持基本上是不存在的,他们说一切都是正确的。我的问题是,我是否根据文档发送了他们要求的内容?

在此先感谢!

回答

1

不,你已经采取了Base64以确保UTF-8编码太字面意思。 utf8_encode将一个文本编码转换为另一个,但$cryptedText不是文本。它是一个二进制字符串,所以在编码时会丢失一些字符。简单地将其删除,因为Base64编码给你已经是二进制数据的文本表示:

return base64_encode($cryptedText); 

此外,你可能想公钥资源传递到加密功能:

$key_resource = openssl_get_publickey($publicKey); 
openssl_public_encrypt($pass, $cryptedText, $key_resource, OPENSSL_PKCS1_PADDING); 
+0

感谢您的答复。当它不起作用时,我把那个utf8_encode作为一个绝望尝试扔进去。我已经拿出来了,现在也在传递公共密钥资源,但是我仍然从服务器收到相同的错误。 – rchamberlin 2015-02-11 20:38:53

+0

你可以试试'$ pass = base64_encode(utf8_encode($ pass));',但除此之外,我认为这符合描述。 – 2015-02-11 20:44:31