RSA Extra Bit 129改为128

时间:2014-07-30 13:03:49

标签: c# rsa biginteger

我正在使用此功能更改公钥并加密数据:

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 个答案:

答案 0 :(得分:1)

如果使用BigInteger,则总是在前面放置一个额外的位 数。如果你的密钥有1024位,你得到1025位,所以跳过 第一个字节,如果它是0x00(表示正值)

答案 1 :(得分:0)

我不确定,它甚至应该转换为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'是这个关键srting而'e'是:“65537”

如果它不应该是BigInteger,那么呢?

答案 2 :(得分:0)

BigInteger生成有符号的小端数字,而RSAParameters则需要无符号的大端数。您仍然可以使用BigInteger,只需将其输出转换为RSAParameters所期望的内容。

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

Reverse将数字设为big-endian,Skip(1)跳过该符号。