Портирование PHP на C# Шифрование - PullRequest
0 голосов
/ 12 января 2020

Я c # программист, но я новичок в PHP. вот мой вопрос: я пытаюсь портировать этот PHP метод шифрования:

public static function encryptPassword($password, $publicKeyId, $publicKey)
{
    $key = openssl_random_pseudo_bytes(32);
    $iv = openssl_random_pseudo_bytes(12);
    $time = time();

    openssl_public_encrypt($key, $encryptedAesKey, base64_decode($publicKey));
    $encrypted = openssl_encrypt($password, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag, strval($time));

    $payload = base64_encode("\x01" | pack('n', intval($publicKeyId)).$iv.pack('s', strlen($encryptedAesKey)).$encryptedAesKey.$tag.$encrypted);

    return sprintf('#PWD:4:%s:%s', $time, $payload);
}
  1. Я использовал RNGCryptoServiceProvider для генерации случайных байтов (для $ key & $ iv ).
  2. Я использовал следующий C# код для openssl_public_encrypt () . Это правильно?
 byte[] ThePublicKey_Bytes = Convert.FromBase64String(ThePublicKey);
 X509Certificate2 cert = new X509Certificate2();
 cert.Import(ThePublicKey_Bytes);
 RSACryptoServiceProvider TheRsaService = (RSACryptoServiceProvider)cert.PublicKey.Key;
 byte[] encryptedAesKey = TheRsaService.Encrypt(TheKey, false);
 return encryptedAesKey;
Основная проблема - метод openssl_encrypt () . Я исследовал это в течение 2 дней. Я не нашел C# эквивалента (или любой связанной информации) для аргументов 'OPENSSL_RAW_DATA' или 'tag'. что такое C# эквивалент для аргумента AAD (Дополнительные аутентифицированные данные или Дополнительные связанные данные)? Это NonSecretPayload?
...