簡體   English   中英

cryptico.js加密消息,必須在C#中解密

[英]cryptico.js encrypted message, must decrypt in C#

我需要能夠使用C#解密服務器上的字符串,但是使用客戶端上的cryptico.js使用公鑰加密對字符串進行加密。 有關詳細信息,請參閱最后的上下文。

Cryptico給我一個像這樣的私人RSA密鑰(注意 - '喜歡'這個 - 我為這個問題創建了一個新的密鑰):

Array ( [n] => 8029845567507477803775928519657066509146751167600087041355508603090505634905205233922950527978886894355290423984597739819216469551137046641801207199138209 [e] => 3 [d] => 5353230378338318535850619013104711006097834111733391360903672402060337089936682996269976597251251223844095913209399106464214877696419418951728015128013411 [p] => 102067954277225510613941189336789903269738979633396754230261162567549753196947 [q] => 78671563708406591396117399809764267229341143260756252277657051641634753921147 [dmp1] => 68045302851483673742627459557859935513159319755597836153507441711699835464631 [dmq1] => 52447709138937727597411599873176178152894095507170834851771367761089835947431 [coeff] => 26458340158787140383846156526777567128582042036682248240414722856369310516021 

......加上一堆方法。

我試圖解密它:

                RSAParameters parameters = new RSAParameters();

            System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();

            parameters.Exponent = encoding.GetBytes("3");

            //dmp1
            parameters.DP =
                encoding.GetBytes("68045302851483673742627459557859935513159319755597836153507441711699835464631");

            //dmq1
            parameters.DQ =
                encoding.GetBytes("52447709138937727597411599873176178152894095507170834851771367761089835947431");

            //d
            parameters.D =
                encoding.GetBytes(
                    "5353230378338318535850619013104711006097834111733391360903672402060337089936682996269976597251251223844095913209399106464214877696419418951728015128013411");

            //p
            parameters.P =
                encoding.GetBytes("102067954277225510613941189336789903269738979633396754230261162567549753196947");

            //q
            parameters.Q =
                encoding.GetBytes("78671563708406591396117399809764267229341143260756252277657051641634753921147");

            //n
            parameters.InverseQ =
                encoding.GetBytes(
                    "8029845567507477803775928519657066509146751167600087041355508603090505634905205233922950527978886894355290423984597739819216469551137046641801207199138209");

            //coeff
            parameters.Modulus =
                encoding.GetBytes("26458340158787140383846156526777567128582042036682248240414722856369310516021");

            RSA rsa = new RSACryptoServiceProvider();
            rsa.ImportParameters(parameters);

            var decryptThis = encoding.GetBytes(ciphertext);

            var result = rsa.DecryptValue(decryptThis);

            resultString = encoding.GetString(result);

但是這會讓異常“糟糕的數據”丟掉。

有沒有更多有經驗的C#有任何想法,我出錯了?

謝謝,

G


上下文詳細信息:我試圖在應用程序的客戶端和服務器端實現密碼強度檢查功能,但僅使用服務器端的代碼。 為了在客戶端實現這一點,我想將假定的密碼發送到服務器,判斷其強度,然后返回客戶端上顯示的分數。 這意味着我只需要在服務器上維護密碼強度檢查代碼。 作為額外的安全措施,我在使用cryptico.js庫加密推定的密碼,然后將其發送到服務器進行判斷。

BigInteger和RSAParameter類以不同的格式存儲數字。

BigInteger將數字存儲為little-endian - 這意味着如果你創建一個BigInteger來保存十六進制數0xABCD (43981) - ToByteArray將返回字節{ 0xCD,0xAB,0x00 }(稍后會有更多的額外零)。

RSAParameter旨在以big-endian格式存儲數字。 這意味着寫入例如Exponent屬性的字節{ 0xCD,0xAB,0x00 }將被RSA實現解釋為數字0xCDAB00 (13478656)。

更復雜的是 - RSAParameters總是正數,而BigInteger支持sign。 和相同的數字,0xFF - 將被不同地解釋。 對於RSA,它是十進制255.對於BigInteger,它表示-1,因為它將最高有效位解釋為符號。 這就是為什么添加零 - 在構造時,BigInteger意識到我們正在傳遞正值43981.但是將此值存儲為兩個字節將產生負數(-21555),因為最高位設置為字節0xCD (11001101 in二進制)。 所以BigInteger加零表示正數。 親自嘗試一下:

Console.WriteLine(new BigInteger(new byte[]{0xCD,0xAB}));
Console.WriteLine(BitConverter.ToString(new BigInteger(0xABCD).ToByteArray()));

因此,我們將大整數作為十進制字符串“1234567 ...”傳遞給我們,我們希望將其轉換為RSA使用的表示形式。 為此,我們需要:

  1. 將字符串解析為BigInteger。
  2. 提取BigInteger字節。
  3. 確保BigInteger沒有添加任何前導零來補償符號。
  4. 將數組反轉回大端格式,並提供給RSA。

代碼(使用您的參數):

using System;
using System.Numerics;
using System.Security.Cryptography;
using System.Text;

class App
{
    static void Main()
    {
      var parameters = new RSAParameters();
      parameters.Exponent=B("3"); 
      parameters.Modulus=B("8029845567507477803775928519657066509146751167600087041355508603090505634905205233922950527978886894355290423984597739819216469551137046641801207199138209"); 
      parameters.D=B("5353230378338318535850619013104711006097834111733391360903672402060337089936682996269976597251251223844095913209399106464214877696419418951728015128013411");
      parameters.P=B("102067954277225510613941189336789903269738979633396754230261162567549753196947");
      parameters.Q=B("78671563708406591396117399809764267229341143260756252277657051641634753921147");
      parameters.DP=B("68045302851483673742627459557859935513159319755597836153507441711699835464631");
      parameters.DQ=B("52447709138937727597411599873176178152894095507170834851771367761089835947431");
      parameters.InverseQ=B("26458340158787140383846156526777567128582042036682248240414722856369310516021");

      var rsa = new RSACryptoServiceProvider();
      rsa.ImportParameters(parameters);
      var ciphertext = rsa.Encrypt(Encoding.ASCII.GetBytes("Hello"), false);
      Console.WriteLine(Encoding.ASCII.GetString(rsa.Decrypt(ciphertext, false)));
    }

    static byte[] B(string s)
    {
      var b = BigInteger.Parse(s);
      var ret = b.ToByteArray();
      if (ret[ret.Length - 1] == 0) 
      {
        Array.Resize(ref ret, ret.Length - 1);
      }
      Array.Reverse(ret);
      return ret;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM