我正在使用此功能更改公钥并加密数据:
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位)。可能是什么原因?
答案 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)
跳过该符号。