ranio Ответов: 1

Как расшифровать зашифрованную строку с помощью алгоритма RSA 2048 в C#?


Я хочу расшифровать зашифрованную строку с помощью алгоритма RSA 2048. Я могу успешно зашифровать то же самое. Но при расшифровке я получаю исключение, как показано ниже:
The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters. 


Что я уже пробовал:

Шифрование RSA:

#region Encrypt_AES_With_CBPublicKey
   public  string Encrypt_AES_With_CBPublicKey(CBAPIDetails objReqAPI)//string Request_AES_string,string RSAPrivateKey
   {
       try
       {
           txtLog.Text += "Client:Encryption of AES Key with CB Public Key started under : " + MethodInfo.GetCurrentMethod().Name + Environment.NewLine;
           /* Bouncy Castle */
           //var keyBytes =
           //Convert.FromBase64String(objReqAPI.AES_KEY); // your key here Deept

           ////var keyBytes =
           ////Convert.FromBase64String("test1"); // your key here Deept

           //var eng = new Pkcs1Encoding(new RsaEngine());
           //using (var reader = File.OpenText(NeSTCommonClass.CB_Public_KeyFile)) // file containing RSA PKCS1 private key
           //{
           //    var keyParameter = (AsymmetricKeyParameter)new PemReader(reader).ReadObject();

           //    eng.Init(true, keyParameter);
           //}

           //var encrypted = Convert.ToBase64String(eng.ProcessBlock(keyBytes, 0, keyBytes.Length));

           //return encrypted;

           /* Bouncy Castle */

           /* Without Bouncy Castle Working here */

           var publicKey = "<RSAKeyValue><Modulus>21wEnTU+mcD2w0Lfo1Gv4rtcSWsQJQTNa6gio05AOkV/Er9w3Y13Ddo5wGtjJ19402S71HUeN0vbKILLJdRSES5MHSdJPSVrOqdrll/vLXxDxWs/U0UT1c8u6k/Ogx9hTtZxYwoeYqdhDblof3E75d9n2F0Zvf6iTb4cI7j6fMs=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";

           //var publicKey = Modulus(Common.ReadTextFile(Common.CB_Public_KeyFile));


           var AESkeyBytes = Encoding.UTF8.GetBytes(objReqAPI.AES_KEY);

           using (var rsa = new RSACryptoServiceProvider(2048))
           {
               try
               {
                   // client encrypting data with public key issued by server
                   rsa.FromXmlString(publicKey.ToString());

                   var encryptedData = rsa.Encrypt(AESkeyBytes, true);

                   var base64Encrypted = Convert.ToBase64String(encryptedData);
                   txtLog.Text += "Client:Encryption of AES Key with CB Public Key Finished under : " + MethodInfo.GetCurrentMethod().Name + Environment.NewLine;
                   return base64Encrypted;
               }
               finally
               {
                   rsa.PersistKeyInCsp = false;
               }
           }

       }
       catch (Exception ex)
       {
           //NeSTCommonClass.WriteTextFile(LogPath + Logfilename, "Encryption with RSA Private Key Failed:" + ex.Message.ToString() + "", true);
           throw ex;
       }


   }


   #region Modulus
   public static string Modulus(string pem)
   {
       byte[] x509der = null;

      x509der = Convert.FromBase64String(pem.Replace("-----BEGIN PUBLIC KEY-----", "").Replace("-----END PUBLIC KEY-----", ""));



      byte[] seqOID = { 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01 };

       MemoryStream ms = new MemoryStream(x509der);
       BinaryReader reader = new BinaryReader(ms);

       if (reader.ReadByte() == 0x30) ReadASNLength(reader); //skip the size
       else return null;

       int identifierSize = 0; //total length of Object Identifier section

       if (reader.ReadByte() == 0x30) identifierSize = ReadASNLength(reader);
       else return null;

       if (reader.ReadByte() == 0x06) //is the next element an object identifier?
       {
           int oidLength = ReadASNLength(reader);
           byte[] oidBytes = new byte[oidLength];
           reader.Read(oidBytes, 0, oidBytes.Length);

           if (oidBytes.SequenceEqual(seqOID) == false) return null; //is the object identifier rsaEncryption PKCS#1?

           int remainingBytes = identifierSize - 2 - oidBytes.Length;
           reader.ReadBytes(remainingBytes);
       }

       if (reader.ReadByte() == 0x03) //is the next element a bit string?
       {
           ReadASNLength(reader); //skip the size
           reader.ReadByte(); //skip unused bits indicator
           if (reader.ReadByte() == 0x30)
           {
               ReadASNLength(reader); //skip the size
               if (reader.ReadByte() == 0x02) //is it an integer?
               {
                   int modulusSize = ReadASNLength(reader);
                   byte[] modulus = new byte[modulusSize];
                   reader.Read(modulus, 0, modulus.Length);
                   if (modulus[0] == 0x00) //strip off the first byte if it's 0
                   {
                       byte[] tempModulus = new byte[modulus.Length - 1];
                       Array.Copy(modulus, 1, tempModulus, 0, modulus.Length - 1);
                       modulus = tempModulus;
                   }

                   if (reader.ReadByte() == 0x02) //is it an integer?
                   {
                       int exponentSize = ReadASNLength(reader);
                       byte[] exponent = new byte[exponentSize];
                       reader.Read(exponent, 0, exponent.Length);

                       RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                       RSAParameters RSAKeyInfo = new RSAParameters();
                       RSAKeyInfo.Modulus = modulus;
                       RSAKeyInfo.Exponent = exponent;
                       rsa.ImportParameters(RSAKeyInfo);
                       // return rsa.ToXmlString(false).Replace("<RSAKeyValue><Modulus>", "").Replace("</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>", "");

                       return rsa.ToXmlString(false);
                   }
               }
           }
       }

       return null;
   }
   #endregion


   #region ReadASNLength
   public static int ReadASNLength(BinaryReader reader)
   {//Note: this method only reads lengths up to 4 bytes long as this is satisfactory for the majority of situations.
       int length = reader.ReadByte();
       if ((length & 0x00000080) == 0x00000080) //is the length greater than 1 byte
       {
           int count = length & 0x0000000f;
           byte[] lengthBytes = new byte[4];
           reader.Read(lengthBytes, 4 - count, count);
           Array.Reverse(lengthBytes); //
           length = BitConverter.ToInt32(lengthBytes, 0);
       }
       return length;
   }
   #endregion

   #endregion

Расшифровка RSA:
#region AES_Decrypt_CB_Private_Key
     public string AES_Decrypt_CB_Private_Key(CBAPIDetails objReqAPI)
     {

         try
         {

             /* Bouncy Castle */
             //string CBPvtKeyString=Common.ReadTextFile(Common.CB_Private_KeyFile);
             //CBPvtKeyString = CBPvtKeyString.Replace("-----BEGIN RSA PRIVATE KEY-----", "").Replace("-----END RSA PRIVATE KEY-----", "");
             //var keyBytes =
             // Convert.FromBase64String(Common.CB_PrivateKey); // your key here

             //RsaPrivateCrtKeyParameters privateKey = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(keyBytes);
             //IAsymmetricBlockCipher eng = new Org.BouncyCastle.Crypto.Encodings.Pkcs1Encoding(new Org.BouncyCastle.Crypto.Engines.RsaEngine());
             //eng.Init(false, privateKey);
             //var base64Encrypted = objReqAPI.encrypyedRequestKeyData;
             //byte[] encdata = System.Convert.FromBase64String(objReqAPI.encrypyedRequestKeyData);

             //string result = System.Convert.ToBase64String(eng.ProcessBlock(encdata, 0, encdata.Length));
             //return result;

             /* Bouncy Castle */

             /* Without Bouncy Castle Working here */
             //var privateKey = "<RSAKeyValue><Modulus>21wEnTU+mcD2w0Lfo1Gv4rtcSWsQJQTNa6gio05AOkV/Er9w3Y13Ddo5wGtjJ19402S71HUeN0vbKILLJdRSES5MHSdJPSVrOqdrll/vLXxDxWs/U0UT1c8u6k/Ogx9hTtZxYwoeYqdhDblof3E75d9n2F0Zvf6iTb4cI7j6fMs=</Modulus><Exponent>AQAB</Exponent><P>/aULPE6jd5IkwtWXmReyMUhmI/nfwfkQSyl7tsg2PKdpcxk4mpPZUdEQhHQLvE84w2DhTyYkPHCtq/mMKE3MHw==</P><Q>3WV46X9Arg2l9cxb67KVlNVXyCqc/w+LWt/tbhLJvV2xCF/0rWKPsBJ9MC6cquaqNPxWWEav8RAVbmmGrJt51Q==</Q><DP>8TuZFgBMpBoQcGUoS2goB4st6aVq1FcG0hVgHhUI0GMAfYFNPmbDV3cY2IBt8Oj/uYJYhyhlaj5YTqmGTYbATQ==</DP><DQ>FIoVbZQgrAUYIHWVEYi/187zFd7eMct/Yi7kGBImJStMATrluDAspGkStCWe4zwDDmdam1XzfKnBUzz3AYxrAQ==</DQ><InverseQ>QPU3Tmt8nznSgYZ+5jUo9E0SfjiTu435ihANiHqqjasaUNvOHKumqzuBZ8NRtkUhS6dsOEb8A2ODvy7KswUxyA==</InverseQ><D>cgoRoAUpSVfHMdYXW9nA3dfX75dIamZnwPtFHq80ttagbIe4ToYYCcyUz5NElhiNQSESgS5uCgNWqWXt5PnPu4XmCXx6utco1UVH8HGLahzbAnSy6Cj3iUIQ7Gj+9gQ7PkC434HTtHazmxVgIR5l56ZjoQ8yGNCPZnsdYEmhJWk=</D></RSAKeyValue>";

             string CB_Private_Key = Common.ReadTextFile(Common.CB_Private_KeyFile);
             var privateKey = Modulus(CB_Private_Key);



             var testData = Encoding.UTF8.GetBytes(objReqAPI.encrypyedRequestKeyData);

             using (var rsa = new RSACryptoServiceProvider(2048))
             {
                 try
                 {
                     var base64Encrypted = objReqAPI.encrypyedRequestKeyData;

                     // server decrypting data with private key
                     rsa.FromXmlString(privateKey);

                     var resultBytes = Convert.FromBase64String(base64Encrypted);
                     var decryptedBytes = rsa.Decrypt(resultBytes, true);
                     var decryptedData = Encoding.UTF8.GetString(decryptedBytes);
                     return decryptedData.ToString();
                 }
                 finally
                 {
                     rsa.PersistKeyInCsp = false;
                 }
             }
             /* Without Bouncy Castle Working here */



         }


         catch (Exception ex)
         {

             throw ex;
         }


     }


     #endregion

1 Ответов

Рейтинг:
2

OriginalGriff

Прочтите сообщение об ошибке, это довольно ясно:

Цитата:
Входные данные не являются допустимой строкой Base-64, поскольку они содержат неосновные 64 символа, более двух символов заполнения или недопустимый символ среди символов заполнения.

Это означает именно то, что говорится - строка, которую вы пытаетесь преобразовать из Base64, не является допустимой строкой Base64.

Поэтому используйте отладчик и посмотрите, что именно у вас есть в вашей строке и откуда она взялась.
Мы не можем сделать это за вас - у нас нет доступа к вашим данным...