2015-04-30 2 views
2

Я использовал следующий код для преобразования открытого ключа 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)); 
+0

Почему вы используете 'modulus = новый байт [65];' в случае с 512 бит? 65 байтов == 520 бит. – Iridium

+0

@ Иридиум, ты прав! Благодаря! Я действительно не понимал формат 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

ответ

0

Благодаря @ коррекции Иридиум, конечно, 512 битов модуль должен быть 512 бит. Я меняю код таким образом, и verify возвращает true.

case 94: 
    modulus = new byte[64]; 
    Array.Copy(keyBytes, 25, modulus, 0, modulus.Length); 
    break; 

В двоичном открытом ключе, строка 24 описано модуль был после 65 бит, но 0 в строке 25 только флаг.

24 01000001 LEN(short format, 65 bits) 
25 00000000 
Смежные вопросы