2016-11-23 6 views
5

मैं core1.1 का उपयोग करते समय शुद्ध कोर करने के लिए एक पुराने .NET4.6 से एक cript/decript मॉड्यूल पलायन शुद्ध कोर ऐप्लिकेशन है, उनके लिए मान्य नहीं है यह सिर्फ अभ्यस्त अब कामट्रिपलडेस। निर्दिष्ट गद्दी मोड इस एल्गोरिथ्म

पहले TripleDES (इसका उपयोग किया जाता है) 128 बिट कुंजी का समर्थन करता है और इसे बदलने की कोशिश कर रहा है, इसे बदलने की कोशिश कर रहा है, यह त्रुटि का कारण बनता है।

दूसरा, इस स्ट्रिंग decript की कोशिश करते हुए:

/Tk0ydguv3HauCVUWDK3Tr6U8c9BBaaRwtSt5q4/uHg=

TripleDES PKCS7 पैडिंग saing साथ त्रुटि की शुरूआत "निर्दिष्ट गद्दी मोड नहीं इस एल्गोरिथ्म के लिए मान्य है।" जो अजीब बात है क्योंकि टीआई पैडिंग है जो इसे डिफ़ॉल्ट करता है।

मेरे project.json:

{ 
    "dependencies": { 
    "Microsoft.NETCore.App": { 
     "version": "1.1.0", 
     "type": "platform" 
    }, 
    "Microsoft.AspNetCore.Diagnostics": "1.1.0", 
    "Microsoft.AspNetCore.Mvc": "1.0.1", 
    "Microsoft.AspNetCore.Razor.Tools": { 
     "version": "1.0.0-preview2-final", 
     "type": "build" 
    }, 
    "Microsoft.AspNetCore.Routing": "1.0.1", 
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0", 
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.1", 
    "Microsoft.AspNetCore.StaticFiles": "1.0.0", 
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0", 
    "Microsoft.Extensions.Configuration.Json": "1.0.0", 
    "Microsoft.Extensions.Logging": "1.0.0", 
    "Microsoft.Extensions.Logging.Console": "1.0.0", 
    "Microsoft.Extensions.Logging.Debug": "1.0.0", 
    "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0", 
    "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0", 
    "Microsoft.EntityFrameworkCore.SqlServer": "1.0.1", 
    "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final", 
    "Microsoft.EntityFrameworkCore.Design": "1.0.0-preview2-final", 
    "Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.1", 
    "Microsoft.AspNetCore.Mvc.WebApiCompatShim": "1.0.1", 
    "Microsoft.AspNetCore.Session": "1.0.0", 
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final" 
    }, 

    "tools": { 
     "BundlerMinifier.Core": "2.0.238", 
     "Microsoft.EntityFrameworkCore.Tools.DotNet": "1.0.0-preview3-final", 
     "Microsoft.AspNetCore.Razor.Tools": "1.0.0-preview2-final", 
     "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final" 
    }, 

    "frameworks": { 
    "netcoreapp1.1": { 
     "imports": [ 
      "portable-net461+win8" 
     ] 
    } 
    }, 

    "buildOptions": { 
    "emitEntryPoint": true, 
    "preserveCompilationContext": true 
    }, 

    "runtimeOptions": { 
    "configProperties": { 
     "System.GC.Server": true 
    } 
    }, 

    "publishOptions": { 
    "include": [ 
     "wwwroot", 
     "**/*.cshtml", 
     "appsettings.json", 
     "web.config" 
    ] 
    }, 

    "scripts": { 
    "prepublish": [ "bower install", "dotnet bundle" ], 
    "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ] 
    } 
} 

मेरे कोड:

using System; 
using System.Security.Cryptography; 
using System.Text; 
namespace WebApp.Class 
{ 
    public class Md5 
    { 
     private static readonly byte[] IV = { 240, 3, 45, 29, 0, 76, 173, 59 }; 

     const int NumCryptokey = 6; 
     const int NumExtraClave = 8; 
     const int NumsKey = 7; 


     public static string Generate(int KeyChars) 
     { 
      int i_key = 0; 
      float Random1 = 0; 
      Int16 arrIndex = default(Int16); 
      StringBuilder sb = new StringBuilder(); 
      char RandomLetter; 

      string KeyLetters = "abcdefghijklmnopqrstuvwxyz"; 
      string KeyNumbers = ""; 

      char[] LettersArray = null; 
      char[] NumbersArray = null; 

      LettersArray = KeyLetters.ToCharArray(); 
      NumbersArray = KeyNumbers.ToCharArray(); 

      for (i_key = 1; i_key <= KeyChars; i_key++) 
      { 
       Random random = new Random(); 
       Random1 = random.Next(); 

       arrIndex = -1; 
       if ((Convert.ToInt32(Random1 * 111)) % 2 == 0) 
       { 
        while (arrIndex < 0) 
        { 
         arrIndex = Convert.ToInt16(LettersArray.GetUpperBound(0) * Random1); 
        } 
        RandomLetter = LettersArray[arrIndex]; 
        if ((Convert.ToInt32(arrIndex * Random1 * 99)) % 2 != 0) 
        { 
         RandomLetter = LettersArray[arrIndex]; 
         RandomLetter = char.ToUpper(RandomLetter); 
        } 
        sb.Append(RandomLetter); 
       } 
       else 
       { 
        while (arrIndex < 0) 
        { 
         arrIndex = Convert.ToInt16(NumbersArray.GetUpperBound(0) * Random1); 
        } 
        sb.Append(NumbersArray[arrIndex]); 
       } 
      } 
      return sb.ToString(); 
     } 

     public static string Encriptar(string serializedQueryString) 
     { 
      string functionReturnValue = null; 
      string sRetorno = null; 
      try 
      { 
       string cryptokey = ""; 
       string ExtraClave = ""; 
       string sKey = ""; 

       cryptokey = Generate(NumCryptokey); 
       ExtraClave = Generate(NumExtraClave); 
       sKey = Generate(NumsKey); 

       byte[] buffer = Encoding.ASCII.GetBytes(serializedQueryString + ExtraClave); 
       var des = TripleDES.Create(); 
       var MD5 = System.Security.Cryptography.MD5.Create(); 
       des.Key = MD5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(sKey + cryptokey)); 
       des.IV = IV; 

       sRetorno = cryptokey + ExtraClave + sKey + Convert.ToBase64String(des.CreateEncryptor().TransformFinalBlock(buffer, 0, buffer.Length)); 

       functionReturnValue = sRetorno; 
      } 
      catch (Exception ex) 
      { 
       functionReturnValue = ""; 
      } 
      return functionReturnValue; 

     } 

     public static string Desencriptar(string encryptedQueryString) 
     { 
      string functionReturnValue = null; 
      byte[] buffer = null; 
      var DES = System.Security.Cryptography.TripleDES.Create(); 
      var Md5 = MD5.Create(); 
      string sRetorno = null; 

      string cryptokey = ""; 
      string ExtraClave = ""; 
      string sKey = ""; 

      cryptokey = encryptedQueryString.Substring(0,NumCryptokey); 
      ExtraClave = encryptedQueryString.Substring(NumCryptokey, NumExtraClave); 
      sKey = encryptedQueryString.Substring(NumCryptokey + NumExtraClave, NumsKey); 

      encryptedQueryString = encryptedQueryString.Substring(NumCryptokey + NumExtraClave + NumsKey, encryptedQueryString.Length-(NumCryptokey + NumExtraClave + NumsKey)); 

      try 
      { 
       buffer = Convert.FromBase64String(encryptedQueryString); 
      byte[] by = new byte[24]; 
       by = Md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(sKey + cryptokey)); 
      Array.Resize(ref by, 24); 
       DES.Key = by; 
       DES.IV = IV; 

       sRetorno = Encoding.ASCII.GetString(DES.CreateDecryptor().TransformFinalBlock(buffer, 0, buffer.Length)).Replace(ExtraClave, ""); 
       functionReturnValue = sRetorno; 
      } 
      catch (Exception ex) 
      { 
       functionReturnValue = ""; 
      } 
      return functionReturnValue; 

     } 
    } 
} 
+0

इसके बजाए पीकेसीएस 5 पैडिंग आज़माएं। तकनीकी रूप से पीकेसीएस # 7 को 128 बिट सिफर के लिए परिभाषित किया गया है, जबकि पीकेसीएस # 5 64 बिट सिफर के लिए है, जैसे डीईएस। आपका कार्यान्वयन picky हो सकता है। – rossum

+1

@rossum: असल में, पीकेसीएस # 7 पीकेसीएस # 5 के विपरीत, ब्लॉक आकार पर कोई धारणा नहीं करता है। –

+0

ठीक है, सुधार के लिए धन्यवाद। – rossum

उत्तर

0

इसे मिला!

public static string Encriptar(string serializedQueryString) 
    { 
     string functionReturnValue = null; 
     string sRetorno = null; 
     try 
     { 
      string cryptokey = ""; 
      string ExtraClave = ""; 
      string sKey = ""; 

      cryptokey = Generate(NumCryptokey); 
      ExtraClave = Generate(NumExtraClave); 
      sKey = Generate(NumsKey); 

      byte[] buffer = Encoding.ASCII.GetBytes(serializedQueryString + ExtraClave); 
      var des = TripleDES.Create(); 
      var Md5 = MD5.Create(); 

      byte[] by = new byte[24]; 
      by = Md5.ComputeHash(Encoding.ASCII.GetBytes(sKey + cryptokey)); 
      Array.Resize(ref by, 24); 
      Array.Copy(by, 0, by, 16, 8); 
      des.Key = by; 
      des.IV = IV; 
      //es.Padding = PaddingMode.None; 
      sRetorno = cryptokey + ExtraClave + sKey + Convert.ToBase64String(des.CreateEncryptor().TransformFinalBlock(buffer, 0, buffer.Length)); 

      functionReturnValue = sRetorno; 

     } 
     catch (Exception ex) 
     { 
      functionReturnValue = ""; 
     } 
     return functionReturnValue; 
    } 
-2

मैं ASP.NET कोर में एक ही मुद्दा सामना करना पड़ा। हालांकि, मैं किसी भी IV को निर्दिष्ट नहीं कर रहा था।

मैंने एन्क्रिप्ट करने के साथ-साथ कुंजी निर्दिष्ट करने के बाद डिक्रिप्टिंग करते समय भी इस पंक्ति को जोड़ा।

DES3.IV = new byte[DES3.BlockSize/8]; 

इस लाइन के बिना, मुझे ऊपर वर्णित त्रुटि मिल रही थी।

https://msdn.microsoft.com/en-us/library/system.security.cryptography.symmetricalgorithm.iv(v=vs.110).aspx

The IV property is automatically set to a new random value whenever you create a new instance of one of the SymmetricAlgorithm classes or when you manually call the GenerateIV method.

हालांकि पर

डॉक्स के अनुसार, मैं अभी भी समझ में नहीं आता क्यों यह काम किया है, क्योंकि यहां तक ​​कि मैं स्थिर मूल्यों (प्रश्न में आपके जैसे) चतुर्थ देने की कोशिश की & तो यह और भी तो विफल रहा है।

+0

एक यादृच्छिक चतुर्थ का प्रयोग करें, बस एन्क्रिप्ट को उपसर्ग करें डीसी के साथ टेड डेटा डिक्रिप्शन में उपयोग के लिए, इसे गुप्त नहीं होने की आवश्यकता नहीं है। अन्यथा समान संदेश वाले संदेशों या संदेशों में एक ही एन्क्रिप्टेड डेटा होगा और जानकारी लीक हो जाएगी। यह भी समझाते हुए कि यह काम क्यों करता है और उत्तर अधिक उपयोगी बनाता है। – zaph

+0

@zaph मैंने एक स्थिर चतुर्थ का उपयोग करने की कोशिश की थी लेकिन यह असफल रहा। मुझे अभी भी पता नहीं क्यों यह काम किया !! –

+0

यदि स्वचालित रूप से जेनरेट किए गए यादृच्छिक चतुर्थ का उपयोग किया जाता है तो इसे पुनर्प्राप्त किया जाना चाहिए और बाद में डिक्रिप्शन के लिए उपयोग किया जाना चाहिए।चतुर्थ को संभालने का एक तरीका है एन्क्रिप्टेड डेटा को डीवी के साथ डीक्रीशन में उपयोग के लिए उपसर्ग करना है, इसे गुप्त नहीं होने की आवश्यकता है। – zaph

संबंधित मुद्दे