我有一个C#服务器,它将生成一个RSA KeyValue对.公钥将被发送到PHP客户端,然后将加密一些数据并发送到服务器.然后,服务器将使用它拥有的私钥进行解密.
我在C#中使用以下代码执行此操作 -
CspParameters cspParams = new CspParameters { ProviderType = 1 };
RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(1024, cspParams);
string publicKey = Convert.ToBase64String(rsaProvider.ExportCspBlob(false));
string privateKey = Convert.ToBase64String(rsaProvider.ExportCspBlob(true));
Run Code Online (Sandbox Code Playgroud)
现在我需要将生成的公钥传递给PHP客户端.但问题是,当我在下面的函数中使用它时,PHP无法识别在C#中生成的Key String -
public function encrypt($data)
{
$pubkey = 'BgIAAACkAABSU0ExAAIAAAEAAQBdZ3klDbVjH8oiBtGzHIMixo/TKPlv492kuau9chnARvkpxaRd8Qa82kIF2AvrEllhzjD07UHkVxoVZA2aYN+t'
$pubKey4 = openssl_get_publickey( $pubkey );
openssl_public_encrypt($data, $encrypted, $pubKey4 )
}
Run Code Online (Sandbox Code Playgroud)
openssl_public_encrypt() 功能显示这样的警告:
警告:openssl_public_encrypt():key参数不是C:\ wamp\www\rsa\index.php中的有效公钥
请建议,PHP应识别的公钥格式是什么.
X509证书不是一个选项.
根据3v4l,openssl_get_publickey()正在返回false。您需要给它一个PEM 格式的公钥。
如果您想要一个更简单的界面,这样您就不太可能犯下破坏应用程序安全性的错误,请查看libsodium。
Libsodium 是NaCl的一个分支,是由 Daniel J. Bernstein、Tanja Lange 和 Peter Schwabe(三位世界级密码学专家)编写的一个易于使用的高速软件库,用于网络通信、加密、解密、签名等以对椭圆曲线密码学和侧通道密码分析的研究而闻名)。
Libsodium 是 NaCl 的便携式分支,它更易于使用并且具有许多有价值的功能(例如使用 scrypt 进行密码散列)。
using Sodium;
// snip
var keypair = PublicKeyBox.GenerateKeyPair();
string secretKey = Convert.ToBase64String(keypair.PrivateKey);
string publicKey = Convert.ToBase64String(keypair.PublicKey);
Run Code Online (Sandbox Code Playgroud)
请务必阅读相关的 libsodium .NET 文档以了解如何使用它。
<?php
$decoded = base64_decode($encoded_publickey);
define('YOUR_RAW_BINARY_CSHARP_PUBLIC_KEY', $decoded);
$php_keypair = \Sodium\crypto_box_keypair();
$php_public = \Sodium\crypto_box_publickey($php_keypair);
$php_secret = \Sodium\crypto_box_secretkey($php_keypair);
$nonce = \Sodium\randombytes_buf(\Sodium\CRYPTO_BOX_NONCEBYTES);
$message_keypair = \Sodium\crypto_box_keypair_from_secretkey_and_publickey(
$php_secret,
YOUR_RAW_BINARY_CSHARP_PUBLIC_KEY
);
$encrypted = \Sodium\crypto_box(
$message,
$nonce,
$message_keypair
);
Run Code Online (Sandbox Code Playgroud)
$encrypted将是原始二进制文件;C# 应用程序需要$nonce、$encrypted、 和$php_public(除了它自己的密钥)来解密$encrypted以查看$message包含的内容。
请务必阅读相关的 PHP libsodium 文档以了解如何使用它。
<?php
$anon_msg = \Sodium\crypto_box_seal($message, YOUR_RAW_BINARY_CSHARP_PUBLIC_KEY);
Run Code Online (Sandbox Code Playgroud)
该crypto_box_seal文档是必读的。