php open ssl publi c эквивалент шифрования в c# - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть этот php код

$pwd = 'test';
$enc_pubkey = 'LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUE0ZmszSFFidFJmTzh5dFJIa09PWApOU0lyKzlsY0paY0dWV3Y1N0tkQU5CRndxVkxuSFRtekJnWTJtWmJIVVZGVGk5TlRIN1ovSmZFbk1oMmhSQUNCCkRFRFRYaHlnc3RuRnJrUTNhMWZXZnM1S0o4eXhqY0RVVm1HUDNBNUs0TzFxNHJ0SXRWVFFaZEliLzV0VEQxMHYKMm9uOFZZNTNsN0N4NjVZUWJ5MTZrRWZTZVFRNEhTOG9nU1JQQ2FFSHNnb3NQaStGSzEwekYreEhCQ1V5TUNnTgpPK1pCQmY0Q0s5UzZOWC9TVFVqUktadExVRzY1RnhKYW1zV1JsVWJWTWFWNjZxK1FEUHZ3KzM4L1k2Sy9LaHZ6Ck9pZS9vTGxCTkQzTjdVMG43d2NGczZsbzFUVk1IbVlqRjc3WFM4elZtbUlzSXdFakJaMGg1UGtNUUdBRWxUbkQKb1FJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg==';
$enc_key_id = '153';

$randKey = openssl_random_pseudo_bytes(32);
$iv = openssl_random_pseudo_bytes(12);

openssl_public_encrypt($randKey, $encryptedAesKey, base64_decode($enc_pubkey));

$time = time();

$cipher = 'aes-256-gcm';
$raw = OPENSSL_RAW_DATA;
$aesEncrypted = openssl_encrypt($pwd, $cipher, $randKey, $raw, $iv, $tag, strval($time));

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

echo $time .":" .$payload;

и я хочу перевести его в C# вот так

var enc_pubkey = "LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUE5NC8yU244UjQvR3JjYklKU1l5RApRZUg1SlNvVTJNdUpDSzN1ekVudVUxZS96dnNIYUNwYU9XM2lua1lxOVlKOGhSZEtHUzlIbGdLRWh1am9lT2F4ClpLMmoySU50T2pPQi9YOVpqanR4eU1ONFpLOTA3RW80ZVl1RnlvRk9jaUpDd01EZUVoenBWQng3VUpMYlJCb2UKTDZmODFQYmNoWlJVZElYNWVsZ2ViL2dGU1BiMktoZHQvSTJiUU5lOHdvNnVaQW1kYUxkclV6K1JhSHFYd3dyMgpPb0JJbGNodGtKMUQxWHE3YVd2YXNnWHJCRVNRcjN2WkdreXM1djhCSHpqTlMwOWJzYk92K3JROHZFTTR5eXMxCjhWYlFvQjZDNTR1NHN1NWVleDVHaktFclZSNHFyVkJwTUpqalRLQ3BwTE9QNC9lLzRZN3U3QVAzSWV0T2M2WkMKb3dJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg==";
var pwd = "test";
int enc_key_id = 244;

byte[] randkey = new byte[32];
byte[] iv = new byte[12];

var rngGenerator = RandomNumberGenerator.Create();
rngGenerator.GetBytes(iv);
rngGenerator.GetBytes(randkey);

var publicKey = "<RSAKeyValue><Modulus>" + enc_pubkey + "</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";

byte[] rsaEncrypted;
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
   rsa.FromXmlString(publicKey.ToString());
   rsaEncrypted = rsa.Encrypt(randkey, false);
}

DateTime utc = new DateTime(1970, 1, 1);
var ms = (DateTime.UtcNow - utc).TotalMilliseconds;
long time = (long)ms / 1000;

byte[] tag = new byte[16];

byte[] cipherText = new byte[pwd.Length];

using (var cipher = new AesGcm(randkey))
{
   cipher.Encrypt(iv, Encoding.Default.GetBytes(pwd), cipherText, tag, Encoding.Default.GetBytes(Convert.ToString(time)));
}

var x = "\x01";

List<byte> allDta = new List<byte>();
allDta.AddRange(Encoding.Default.GetBytes(x));
allDta.AddRange(Encoding.Default.GetBytes(Convert.ToString(enc_key_id)));
allDta.AddRange(iv);
allDta.AddRange(Encoding.Default.GetBytes(Convert.ToString(rsaEncrypted.Length)));
allDta.AddRange(rsaEncrypted);
allDta.AddRange(tag);
allDta.AddRange(cipherText);
string outputString = Convert.ToBase64String(allDta.ToArray());

Console.WriteLine($"{time}:{outputString}");

Что я заметил, что вывод rsa в * Код 1010 * имеет длину 451 и php 256. Может быть, я неправильно импортирую enc_pubkey в c#? Похоже, что RSA doesent подходит как openssl publi c encrypt?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...