Ошибка System.Runtime при компиляции кода С#

btc22

Client
Регистрация
22.11.2015
Сообщения
9
Благодарностей
8
Баллы
3
Нужно было закриптовать пароль по алгоритму RSA с экпонентой и модулем. Собственно нашел рабочий вариант на гитхабе, перенес в студии, там благополучно заработало, попытался перенести в PM, на что выдало кучу ошибок таких как "Ошибка при компиляции общего кода CS0012. Тип System.ValueType определен в сборке, ссылка на которую отсутствует. Следует добавить ссылку на сборку System.Runtime, Version=4.0.20.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a". Таких ошибок несколько с разными переменными вместе System.ValueType, скриншот прилагается. Далее я попытался запустить код в Code Creator, собственно там выяснилось более подробно в чем причина, скриншот тоже прилагаю. Собственно сам код тоже.


Код:
using System;
using System.Text;
using System.Numerics;
using System.Globalization;
namespace ConsoleApp6
{
internal static class PasswordEncrypter
        {
            private const string Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
            private const string Hex = "0123456789abcdef";

            internal static string EncryptPassword(string publicKeyMod, string publicKeyExp, string password)
            {
                // Convert the public keys to BigIntegers
                var modulus = CreateBigInteger(publicKeyMod);
                var exponent = CreateBigInteger(publicKeyExp);

                // Original: $data = this.pkcs1pad2($data,($pubkey.modulus.bitLength()+7)>>3);
                // I'm going to hardcode the bitlength, I can't figure that out right now.
                var encryptedNumber = Pkcs1Pad2(password, (2048 + 7) >> 3);

                // And now, the RSA encryption
                encryptedNumber = BigInteger.ModPow(encryptedNumber, exponent, modulus);

                // Finally we convert the encrypted string back to Base16
                var encryptedString = encryptedNumber.ToString("x");

                // And then we decode it back
                // And we put it back into Base64
                encryptedString = EncodeBase64(DecodeHex(encryptedString));

                return encryptedString;
            }


            private static string DecodeHex(string input)
            {
                var stringBuilder = new StringBuilder();
                var i = 0;
                do
                {
                    var a = ((Hex.IndexOf(input[i++]) << 4) & 0xf0);
                    var b = 0;

                    if (i < input.Length)
                        b = (Hex.IndexOf(input[i++]) & 0xf);

                    stringBuilder.Append(new[] { (char)(a | b) });
                } while (i < input.Length);

                return stringBuilder.ToString();
            }

            private static string EncodeBase64(string input)
            {
                var stringBuilder = new StringBuilder();
                var i = 0;

                do
                {
                    var x = 0;
                    int chr1 = input[i++];
                    int chr2, chr3;
                    if (input.Length > i)
                    {
                        chr2 = input.Length > i ? input[i++] : 0;

                        if (input.Length > i)
                        {
                            chr3 = input.Length > i ? input[i++] : 0;
                        }
                        else
                        {
                            x = 2;
                            chr3 = 0;
                        }
                    }
                    else
                    {
                        x = 1;
                        chr2 = 0;
                        chr3 = 0;
                    }

                    var enc1 = chr1 >> 2;
                    var enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
                    var enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
                    var enc4 = chr3 & 63;

                    if (x == 1)
                        enc3 = enc4 = 64;
                    else if (x == 2)
                        enc4 = 64;

                    stringBuilder.Append(new[] { Base64[enc1], Base64[enc2], Base64[enc3], Base64[enc4] });
                } while (i < input.Length);

                return stringBuilder.ToString();
            }

            /// <summary>
            /// Encodes the data
            /// </summary>
            /// <param name="data"></param>
            /// <param name="keySize"></param>
            /// <returns></returns>
            private static BigInteger Pkcs1Pad2(string data, int keySize)
            {
                if (keySize < data.Length + 11)
                    return new BigInteger();

                var buffer = new byte[256];
                var i = data.Length - 1;

                while (i >= 0 && keySize > 0)
                {
                    buffer[--keySize] = (byte)data[i--];
                }

                // Padding, I think
                var random = new Random();
                buffer[--keySize] = 0;
                while (keySize > 2)
                {
                    buffer[--keySize] = (byte)random.Next(1, 256);
                    //buffer[--keySize] = 5;
                }

                buffer[--keySize] = 2;
                buffer[--keySize] = 0;

                Array.Reverse(buffer);

                return new BigInteger(buffer);
            }

            private static BigInteger CreateBigInteger(string hex)
            {
                return BigInteger.Parse("00" + hex, NumberStyles.AllowHexSpecifier);
            }
        }
}
CC показал?что вся проблема в методе BigInteger Pkcs1Pad2.
Кто подскажет как исправит ошибку? Заранее благодарен
 
  • Спасибо
Реакции: Oleg1357

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
651
Баллы
93
Ссылку на GitHub скиньте, а так вроде все работает:
 

Вложения

  • Спасибо
Реакции: btc22 и Oleg1357

btc22

Client
Регистрация
22.11.2015
Сообщения
9
Благодарностей
8
Баллы
3
Ссылку на GitHub скиньте, а так вроде все работает:
Да, действительно все работает безупречно и как надо. Оказывает в References у меня были добавлены библиотеки, которые конфликтовали между собой, другого объяснения я не вижу. Благодарю за помочь :df:
Ссылка на гитхаб: https://github.com/igeligel/BackpackLogin/blob/fc1125f7da479251a7e111e24e2d37ff74098a4b/src/BackpackLogin/SteamLogin/PasswordEncrypter.cs
 
  • Спасибо
Реакции: Oleg1357

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)