在移动客户端和服务器 PHP 之间使用 public/private 密钥加密

Encryption using public/private keys between mobile client and server PHP

案例1:Encrypted客户端到服务器的数据

需要在提供给 client.The 的 server.Public 密钥中创建一个 public/private 密钥 客户端使用 public 对其进行加密 key.The 服务器使用私钥对其进行解密已生成。

Case2:但是当服务器端的数据发送到 客户端。??

该数据也应该 encrypted.Does 与为案例 1 工作创建的 public/private 相同,或者应该生成新密钥?任何人都可以根据我的要求解释案例 2。

提前致谢。

可以任意方向使用public/私钥加密

所以你的客户端可以用public密钥加密,然后服务器可以用私钥解密。 如果您的服务器使用私钥加密,客户端可以使用 public 密钥解密。

如本 white paper on secure data encryption 及其支持 material 所述:

  1. 使用 HTTPS。
  2. 对于第二层经过身份验证的加密,请使用 libsodium(现代的跨平台加密库)和固定的 public 密钥。

PHP 例子

密钥生成

$bob_box_kp = \Sodium\crypto_box_keypair();
$bob_box_secretkey = \Sodium\crypto_box_secretkey($bob_box_kp);
$bob_box_publickey = \Sodium\crypto_box_publickey($bob_box_kp);

加密

$anonymous_message_to_bob = \Sodium\crypto_box_seal(
    $message,
    $bob_box_publickey
);

解密

$decrypted_message = \Sodium\crypto_box_seal_open(
    $anonymous_message_to_bob,
    $bob_box_kp
);
if ($decrypted_message === false) {
    // You have the wrong keypair or the message was tampered with.
}

Android 示例(使用 Libstodium

密钥生成

byte[] secret_key = new byte[Box.SECRETKEYBYTES];
byte[] public_key = new byte[Box.PUBLICKEYBYTES];
Box.keypair(public_key, secret_key);

加密

Box.seal(
    ciphertextByteArray, // Output goes here
    plaintextByteArray,  // Your message
    public_key
);

解密

Box.sealOpen(
    plaintextOutputByteArray, // Decrypted data goes here
    ciphertextByteArray,      // Encrypted message received over the wire
    public_key,
    secret_key
);