C # Зашифровать строку с открытым шестнадцатеричным ключом RSA-1280 - PullRequest
1 голос
/ 09 сентября 2011

Я пытался зашифровать пароль с помощью открытого ключа RSA, отправленного мне сервером.

var csp = new CspParameters(1, "Microsoft Strong Cryptographic Provider");
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(1280, csp);
byte[] key = ByteUtils.HexToBytes(client.RSAKey);
RSA.ImportCspBlob(key);
byte[] encrypted = RSA.Encrypt(Encoding.ASCII.GetBytes(password), true);

Шестнадцатеричный ключ предоставляется в таком формате:

string key = "30819D300D06092A864886F70D010101050003818B0030818702818100C7BD672D8C634D443840AD809790852770D3A2E99F456D6516329E0205D0645C23FD001D4D070CEE368A20526FEB2402358C915D7E86102B1659AA8651C449C344599F72BE904B8E338E7002E9978453C5BBCCA51AC165AA265069E0EAB1411D11A2FFDD35E5A8296A6A2AF238945874E8206979B0A16E2E4260A161CAB5C905020111";

Поскольку строка имеет длину 320 байт в шестнадцатеричном формате, я предполагаю, что ключ имеет длину 160 байт (RSA 1280). Используя этот метод, поставщик продолжает говорить «Неверная версия поставщика. \ R \ n».Я пробовал несколько методов, преобразовать его в Base64, просто импортировать как ASCII / Unicode.Пока ничего не получалось.

РЕДАКТИРОВАТЬ: Моя функция HexToBytes (которая работает afaik, она возвращает мне правильный массив 160-b):

public static byte[] HexToBytes(string pValue)
        {
            // FIRST. Use StringBuilder.
            StringBuilder builder = new StringBuilder();

            // SECOND... USE STRINGBUILDER!... and LINQ.
            foreach (char c in pValue.Where(IsHexDigit).Select(Char.ToUpper))
            {
                builder.Append(c);
            }

            // THIRD. If you have an odd number of characters, something is very wrong.
            string hexString = builder.ToString();
            if (hexString.Length % 2 == 1)
            {
                //throw new InvalidOperationException("There is an odd number of hexadecimal digits in this string.");
                // I will just add a zero to the end, who cares (0 padding)
                Log.WriteLine(LogLevel.Debug, "Hexstring had an odd number of hexadecimal digits.");
                hexString += '0';
            }

            byte[] bytes = new byte[hexString.Length / 2];
            // FOURTH. Use the for-loop like a pro :D
            for (int i = 0, j = 0; i < bytes.Length; i++, j += 2)
            {
                string byteString = String.Concat(hexString[j], hexString[j + 1]);
                bytes[i] = HexToByte(byteString);
            }
            return bytes;
        }

1 Ответ

3 голосов
/ 10 сентября 2011

Ваш открытый ключ не в правильном формате. Это не капля CSP. Это структура SubjectPublicKeyInfo в кодировке DER. Вы можете найти исходный код для его анализа или написать свой собственный. Здесь - один из примеров такого кода.

...