Во-первых, я все еще новичок в криптовалюте / подписании, поэтому, пожалуйста, терпите любые злоупотребления терминами.
Мне нужно создать подпись на C #, которая проверяется библиотекой Python. В Python это простой фрагмент кода для декодирования / проверки подписи:
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
public_key.verify(signature, payload_contents,
padding.PSS(mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH,
), hashes.SHA256(), )
Мой текущий код на C # выглядит так:
private static string CreateSignature(byte[] data, string privateKeyFileLocation)
{
var cert = new X509Certificate2(privateKeyFileLocation);
byte[] signedBytes;
using (var rsa = cert.GetRSAPrivateKey())
{
signedBytes = rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pss);
}
var finalString = Convert.ToBase64String(signedBytes);
return finalString;
}
Однако подпись не проходит проверку в коде Python. Похоже, что заполнение PSS в библиотеках .Net по умолчанию использует MGF1. Однако я считаю, что у меня проблемы из-за функции генерации маски (MGF1), использующей 256-битный хэш в коде Python, но по умолчанию SHA1 в C #. Я пробежался по документации .Net C #, и похоже, что нет способа отменить это. Я заглянул в документацию Bouncy Castle по C #, и мне просто трудно найти какой-либо аналогичный пример того, как установить отступы с помощью пользовательских параметров. Кто-нибудь имеет опыт в этой области и может дать несколько советов?