Как проверить подпись ответа с помощью открытого ключа с RSAwithSHA256 в C#?

У меня проблема с проверкой подписи с использованием процедуры RSAwithSHA256 в C#. Проблема в том, что функция VerifyHash всегда возвращает false, хотя я считаю, что использую правильную процедуру. Я знаю, что RSACryptoServiceProvider по умолчанию использует SHA1 для подписи, но здесь я хочу только проверить подпись. Что могло пойти не так?

    #region // public //
    public bool Verify(SMBillsAuthResponse response) {
        RSACryptoServiceProvider csp = retrieveCryptoServiceProvider();
        string verificationMessage = getVerificationMessage(response);
        byte[] hash = getSha256Hash(verificationMessage);
        byte[] signature = HexStringToByteArray(response.auth.signature);
        return csp.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA256"), signature);
    }
    #endregion

    #region // auxiliary //
    private RSACryptoServiceProvider retrieveCryptoServiceProvider() {
        X509Certificate2 cert = new X509Certificate2(this.publicKeyFile);
        RSACryptoServiceProvider csp = (RSACryptoServiceProvider)cert.PublicKey.Key;
        return csp;
    }

    private string getVerificationMessage(SMBillsAuthResponse response) {
        return this.apiKey + response.auth.nonce + response.auth.timestamp + response.transactionId;
    }

    private byte[] getSha256Hash(string message) {
        SHA256Managed sha256 = new SHA256Managed();
        byte[] data = Encoding.Unicode.GetBytes(message);
        byte[] hash = sha256.ComputeHash(data);
        return hash;
    }
    #endregion

person Kristijan Mirčeta    schedule 10.04.2018    source источник


Ответы (1)


Кажется, единственная проблема, с которой я столкнулся, была неправильная кодировка данных. Вместо Encoding.Unicode.GetBytes(сообщение) я использовал Encoding.UTF8.GetBytes(сообщение), и это сработало.

person Kristijan Mirčeta    schedule 10.04.2018