У меня есть личный ключ RSA, и я хотел подписать данные с ним. я написал этот код, но он не работает:
public string Sign(string text)
{
var sha = new SHA1Managed();
var encoding = new UTF8Encoding();
var bytes = encoding.GetBytes(text);
var digest = sha.ComputeHash(bytes);
var cert = new X509Certificate2(Convert.FromBase64String(PermissionKey));
var rsa = (RSACryptoServiceProvider)cert.PrivateKey;
var rsaFormatter = new RSAPKCS1SignatureFormatter(rsa);
rsaFormatter.SetHashAlgorithm("SHA1");
var SignedHashValue = rsa.SignData(digest, sha);
return Convert.ToBase64String(SignedHashValue).Replace("=", "") + "\n";
}
я получаю это исключение:
'Cannot find the requested object.
когда я пытался создать X509Certificate2:
var cert = new X509Certificate2(Convert.FromBase64String(PermissionKey));
PS:
Я устаю имитировать код Android в C #. вот основной андроид:
public static PrivateKey makePrivateKeyFromPermissionKey(String permissionKey)
throws InvalidKeySpecException, NoSuchProviderException, NoSuchAlgorithmException {
KeyFactory keyFactory;
byte[] certificate = decode(
permissionKey
.replaceAll("\\n", "")
.replace("-----BEGIN RSA PRIVATE KEY-----", "")
.replace("-----END RSA PRIVATE KEY-----", "")
);
if (Build.VERSION.SDK_INT < 27) {
keyFactory = KeyFactory.getInstance("RSA", "BC");
} else {
keyFactory = KeyFactory.getInstance("RSA");
}
return keyFactory.generatePrivate(new PKCS8EncodedKeySpec(certificate));
}