Я использовал следующий код для преобразования открытого ключа X.509 в C# RSAParameters
, который работает хорошо с 1024 бит ключа. Но для 512-битного ключа rsa.VerifyData(data, new SHA1CryptoServiceProvider(), sign)
возвращает false.Проверьте знак RSA с открытым 512-битным ключом в C#
Я проверил знак, данные с открытым ключом на Java это правильно.
byte[] keyBytes = Convert.FromBase64String(publicKeyString);
byte[] modulus;
switch (keyBytes.Length)
{
case 94: // 512 bits
modulus = new byte[65];
Array.Copy(keyBytes, 24, modulus, 0, modulus.Length);
break;
case 162: // 1024 bits
modulus = new byte[128];
Array.Copy(keyBytes, 29, modulus, 0, modulus.Length);
break;
default:
throw new NotSupportedException();
}
byte[] publicExponent = new byte[3];
Array.Copy(keyBytes, keyBytes.Length - 3, publicExponent, 0, 3);
var para = new RSAParameters();
para.Modulus = modulus;
para.Exponent = publicExponent;
...
А также прошел этот тест блок:
byte[] modulus = new byte[65];
Array.Copy(keyBytes, 24, modulus, 0, modulus.Length);
Array.Reverse(modulus); // big-endian
if ((modulus[modulus.Length - 1] & 0x80) > 0) // make sure positive
{
var temp = new byte[modulus.Length];
Array.Copy(modulus, temp, modulus.Length);
modulus = new byte[temp.Length + 1];
Array.Copy(temp, modulus, temp.Length);
}
var mFromByte = new BigInteger(modulus);
var mFromStr = BigInteger.Parse("10446137350258867541972982874422299386188841602828508348451210482770166585987014109048441013963536226102851240621532747362919294772011580690442657343607779"); // <- modulus output by java
Assert.AreEqual(0, mFromByte.CompareTo(mFromStr));
Почему вы используете 'modulus = новый байт [65];' в случае с 512 бит? 65 байтов == 520 бит. – Iridium
@ Иридиум, ты прав! Благодаря! Я действительно не понимал формат X509, это [открытый ключ] (https://www.dropbox.com/s/8sow021frt5mp31/%E5%85%AC%E9%92%A5%E6%A0%BC% E5% BC% 8F% E5% 88% 86% E6% 9E% 90.txt? Dl = 0), я думал, что LEN «01000001» в строке 24 означает, что все потребности в 65 байтах. (К сожалению для китайца этого файла – joyjy