Подпишите строку с помощью SHA1RSA и существующего закрытого ключа rsa c # - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть личный ключ 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));
}

1 Ответ

0 голосов
/ 19 ноября 2018

Я нашел ответ.я использовал библиотеку CSharp_easy_RSA_PEM для чтения секретного ключа.

public static string Sign(string text)
{
    var privateRSAkey = Crypto.DecodeRsaPrivateKey(PermissionKey);
    var rsa = privateRSAkey;

    var hasher = new SHA1CryptoServiceProvider();
    var e = new UTF8Encoding(true);
    var bytesFirmados = rsa.SignData(e.GetBytes(text), hasher);

    return Convert.ToBase64String(bytesFirmados);
}
...