RSA Extra Bit 129 вместо 128

Я использую эту функцию для изменения открытого ключа и шифрования данных:

public byte[] EncryptData(byte[] data2Encrypt)
{
    string key = "109120132967399429278860960508995541528237502902798129123468757937266291492576446330739696001110603907230888610072655818825358503429057592827629436413108566029093628212635953836686562675849720620786279431090218017681061521755056710823876476444260558147179707119674283982419152118103759076030616683978566631413";
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024);

    BigInteger intk;
    BigInteger.TryParse(key, out intk);

    RSAParameters privateKey = new RSAParameters();
    byte[] expont = { 1, 0, 1 };
    byte[] modulus = intk.ToByteArray();

    Logger.log(Log_Type.ERROR, "Pierwszy bit: " + modulus[0]);
    privateKey.Exponent = expont;
    privateKey.Modulus = intk.ToByteArray();

    rsa.ImportParameters(privateKey);
    return rsa.Encrypt(data2Encrypt, false);
}

Но он возвращает мне массив с длиной 129 вместо 128 (что, я думаю, должно быть максимальной длиной, используя 1024 бита). В чем может быть причина?

3 ответа

Решение

BigInteger производит числа с порядковыми номерами со знаком, а RSAParameters требует без знака big-endian. Вы все еще можете использовать BigInteger тем не менее, просто преобразовать свой вывод в то, что RSAParameters ожидает.

byte[] modulus = intk.ToByteArray().Reverse().Skip(1).ToArray();

Reverse сделать число старшим, и Skip(1) пропустить знак.

Если вы используете BigInteger, дополнительный бит всегда ставится перед номером. Если ваш ключ имеет 1024 бита, вы получите 1025 бит, поэтому пропустите первый байт, если он равен 0x00 (что означает положительное значение)

Я не уверен, что это должно быть даже преобразовано в BitInteger. Ключ RSA, который я пытаюсь получить, похож на эту функцию в C++

void Crypt::rsaSetPublicKey(const std::string& n, const std::string& e)
{
BN_dec2bn(&m_rsa->n, n.c_str());
BN_dec2bn(&m_rsa->e, e.c_str());

// clear rsa cache
if(m_rsa->_method_mod_n) { BN_MONT_CTX_free(m_rsa->_method_mod_n); m_rsa->_method_mod_n = NULL; }

}

Где 'n' - это ключ ключа, а 'e' - "65537".

Если это не должно быть BigInteger, то что?

Другие вопросы по тегам