Java Проверка подписи C# эквивалент - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь найти эквивалент этого Java кода:

public String signData(String data, String privateKey) {
    try {
        byte[] bytes = data.getBytes("UTF8");
        PKCS8EncodedKeySpec prKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey));
        PrivateKey prKey = KeyFactory.getInstance("RSA").generatePrivate(prKeySpec);

        Signature sig = Signature.getInstance("SHA512withRSA");
        sig.initSign(prKey);
        sig.update(bytes);
        byte[] signatureBytes = sig.sign();
        return new String(Base64.encodeBase64(signatureBytes));
    } catch (Exception ex) {
    }
    return null;
}

И

public boolean validateSignature(String data, String publicKey, String signature) {
    try {
        byte[] bytes = data.getBytes("UTF8");
        X509EncodedKeySpec pbKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKey));
        PublicKey pbKey = KeyFactory.getInstance("RSA").generatePublic(pbKeySpec);

        Signature sig = Signature.getInstance("SHA512withRSA");
        sig.initVerify(pbKey);
        sig.update(bytes);

        return sig.verify(Base64.decodeBase64(signature));
    } catch (Exception ex) {
    }

    return false;
}

Этот код не работает. Возможно, я что-то пропустил. Я нашел несколько похожих постов, но не нашел ответа.

    public String signData(String data, String privateKey)
    {
        byte[] bytes = Encoding.UTF8.GetBytes(data);
        var rsa = RSA.Create();
        rsa.ImportPkcs8PrivateKey(Convert.FromBase64String(privateKey), out _);
        byte[] signedData = rsa.SignData(bytes, HashAlgorithmName.SHA512, RSASignaturePadding.Pkcs1);

        return Convert.ToBase64String(signedData);
    }

    public bool validateSignature(String data, String publicKey, String signature)
    {
        var bytes = Convert.FromBase64String(publicKey);
        var rsa = RSA.Create();
        rsa.ImportSubjectPublicKeyInfo(bytes, out _);
        var rsaParams = rsa.ExportParameters(false);

        return rsa.VerifyHash(Encoding.UTF8.GetBytes(data), Convert.FromBase64String(signature), HashAlgorithmName.SHA512, RSASignaturePadding.Pkcs1);
    }

У меня все в уме) Надеюсь, у кого-то есть ответ) Спасибо

1 Ответ

1 голос
/ 03 мая 2020

Проблема в методе validateSignature, где вы вызываете VerifyHash() для проверки подписи. Имя первого параметра - rgbHash, а документация для него гласит:

Параметры rgbHa sh Байт [] Значение ha sh подписанных данных .

Этот метод предназначен для проверки подписи для уже рассчитанного га sh, но вы пытаетесь проверить подпись, предоставив сами данные, поэтому изменив вызов VerifyHa sh () на VerifyData () должна сделать трюк:

public static bool validateSignature(String data, String publicKey, String signature)
{
    var bytes = Convert.FromBase64String(publicKey);
    var rsa = RSA.Create();
    rsa.ImportSubjectPublicKeyInfo(bytes, out _);

    // Not used in the provided code.
    // var rsaParams = rsa.ExportParameters(false);

    return rsa.VerifyData(Encoding.UTF8.GetBytes(data), Convert.FromBase64String(signature), HashAlgorithmName.SHA512, RSASignaturePadding.Pkcs1);
}
...