প্যাডিং অবৈধ এবং সরানো যাবে না?


124

এই ব্যতিক্রমটি কীভাবে আমার প্রোগ্রামের সাথে সম্পর্কিত তা আমি অনলাইনে দেখেছি তবে সমাধান বা আমার নির্দিষ্ট প্রোগ্রামে এটি কেন ঘটছে তার কারণ খুঁজে পাচ্ছি না। আমি রিজান্ডেল অ্যালগরিদম ব্যবহার করে একটি এক্সএমএল ডকুমেন্টকে এনক্রিপ্ট এবং ডিক্রিপ্ট করার জন্য আমার এমএসডিএন প্রদত্ত উদাহরণটি ব্যবহার করছি। এনক্রিপশনটি দুর্দান্ত কাজ করে তবে আমি যখন ডিক্রিপ্ট করার চেষ্টা করি তখন আমি নিম্নলিখিত ব্যতিক্রমগুলি পাই:

প্যাডিং অবৈধ এবং সরানো যাবে না

কেউ কি আমাকে বলতে পারেন যে আমি এই সমস্যাটি সমাধান করতে পারি? নীচে আমার কোডটি যেখানে আমি কী এবং অন্যান্য ডেটা পেয়েছি। যদি ক্রিপ্টোমোডটি মিথ্যা হয়, তবে এটি ডিক্রিপ্ট পদ্ধতিটিকে কল করবে, যেখানে ব্যতিক্রম ঘটে:

public void Cryptography(XmlDocument doc, bool cryptographyMode)
{
    RijndaelManaged key = null;
    try
    {
    // Create a new Rijndael key.
    key = new RijndaelManaged();
    const string passwordBytes = "Password1234"; //password here 

    byte[] saltBytes = Encoding.UTF8.GetBytes("SaltBytes");
    Rfc2898DeriveBytes p = new Rfc2898DeriveBytes(passwordBytes, saltBytes);
    // sizes are devided by 8 because [ 1 byte = 8 bits ] 
    key.IV = p.GetBytes(key.BlockSize/8);
    key.Key = p.GetBytes(key.KeySize/8);

    if (cryptographyMode)
    {
        Ecrypt(doc, "Content", key);
    }
    else
    {
        Decrypt(doc, key);
    }

    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message);
    }
    finally
    {
    // Clear the key.
    if (key != null)
    {
        key.Clear();
    }
    }

}

private void Decrypt(XmlDocument doc, SymmetricAlgorithm alg)
{
    // Check the arguments.  
    if (doc == null)
    throw new ArgumentNullException("Doc");
    if (alg == null)
    throw new ArgumentNullException("alg");

    // Find the EncryptedData element in the XmlDocument.
    XmlElement encryptedElement = doc.GetElementsByTagName("EncryptedData")[0] as XmlElement;

    // If the EncryptedData element was not found, throw an exception.
    if (encryptedElement == null)
    {
    throw new XmlException("The EncryptedData element was not found.");
    }


    // Create an EncryptedData object and populate it.
    EncryptedData edElement = new EncryptedData();
    edElement.LoadXml(encryptedElement);

    // Create a new EncryptedXml object.
    EncryptedXml exml = new EncryptedXml();


    // Decrypt the element using the symmetric key.
    byte[] rgbOutput = exml.DecryptData(edElement, alg); <----  I GET THE EXCEPTION HERE
    // Replace the encryptedData element with the plaintext XML element.
    exml.ReplaceData(encryptedElement, rgbOutput);

}

12
আপনি কী স্পষ্টভাবে প্যাডিং মোডটি এনক্রিপশন এবং ডিক্রিপশন উভয়কে ইনডেন্টিকাল হতে একইরূপে সেট করার মাধ্যমে একটি চেষ্টা করতে পারেন। উদাহরণস্বরূপ: alg.Padding = PaddingMode.NONE;
নেটস্কুইরেল

এনক্রিপ্ট () পদ্ধতিটি দেখতে কেমন?
csharptest.net

1
ধন্যবাদ ছেলেরা যে কাজ করেছে।
ব্রাউন লাভ

2
@ নেটস্কুইরেল: প্যাডিংমোড.নোনমের জন্য অনুস্মারক দেওয়ার জন্য আপনাকে ধন্যবাদ। এটি আমাকে এই ত্রুটি থেকে মুক্তি পেয়েছে (অন্য একজনের কাছে) ... জাভা এবং সি # উভয় ক্ষেত্রেই এইএস করছেন, এবং এখন কেন সি # জাভা প্যাডিংয়ের বিষয়ে অভিযোগ করছেন তা জানেন না, যদিও দুজনেই পিকেসিএস # 7 ব্যবহার করেন
হোং লং

উত্তর:


80

রিজান্ডেল / এইএস একটি ব্লক সাইফার yp এটি 128 বিট (16 অক্ষর) ব্লকে ডেটা এনক্রিপ্ট করে। মেসেজের শেষ ব্লকটি সর্বদা সঠিক আকারের হয় তা নিশ্চিত করতে ক্রিপ্টোগ্রাফিক প্যাডিং ব্যবহার করা হয়।

আপনার ডিক্রিপশন পদ্ধতিটি তার ডিফল্ট প্যাডিং যা যা আশা করে এবং এটি খুঁজে পাচ্ছে না। @ নেটস্কুইয়ারেল যেমন বলেছে, আপনাকে এনক্রিপশন এবং ডিক্রিপশন উভয়ের জন্য স্পষ্টভাবে প্যাডিং সেট করা দরকার। অন্যথায় আপনার কাছে কারণ না থাকলে পিকেসিএস # 7 প্যাডিং ব্যবহার করুন।


7
স্পষ্টভাবে প্যাডিং সেট কিভাবে?
আহমদ হাজর

7
আপনাকে ধন্যবাদ আমি এটি rj.Padding = প্যাডিংমোড.নোন খুঁজে পেয়েছি; :)
আহমদ হাজর

7
@ আহমাদহজ্জার কোনও প্যাডিংয়ের সুরক্ষা সম্পর্কিত কোনও প্রভাব নেই, এটি ব্যবহার করবেন না।
ডিভেন্টফ্যান

1
হাই, আমি স্পষ্টভাবে প্যাডিং সেট করেছি, তবে কাজ করছে না। আমি জানি না আমি কী পদক্ষেপগুলি ভুল করেছি। সাহায্য করুন. alg.Padding = PaddingMode.PKCS7;
জনি

20
আমি বুঝতে পারি এটি একটি পুরানো সুতো। তবে, যারা যাচ্ছেন তাদের জন্য, নিশ্চিত করুন যে ডেটা এনক্রিপ্ট করার সময় আপনি চূড়ান্ত ব্লকটি ফ্লাশ করেছেন।
মার্কাস

51

নিশ্চিত করুন যে কী আপনাকে ব্যবহার করতে এনক্রিপ্ট এবং ডিক্রিপ্ট হয় একই । স্পষ্টভাবে সেট না করা থাকলেও প্যাডিং পদ্ধতিতে এখনও সঠিক ডিক্রিপশন / এনক্রিপশন (যদি সেট না করা থাকে তবে তারা একই হবে) এর জন্য অনুমতি দেওয়া উচিত। তবে যদি কোনো কারণে আপনি এনক্রিপশন জন্য ব্যবহৃত তুলনায় ডিক্রিপশন জন্য কি একটি ভিন্ন সেট ব্যবহার করছেন আপনি হবে এই ত্রুটি পাবেন:

প্যাডিং অবৈধ এবং সরানো যাবে না

আপনি যদি কিছু অ্যালগরিদম ব্যবহার করে গতিসম্পন্ন কী উত্পন্ন করে যা কার্যকর হবে না। এনক্রিপশন এবং ডিক্রিপশন উভয়ের জন্য তাদের একই হওয়া দরকার। একটি সাধারণ উপায় হ'ল কলারটি এনক্রিপশন পদ্ধতি শ্রেণীর নির্মাত্রে কীগুলি সরবরাহ করে যাতে এই আইটেমগুলির তৈরিতে এনক্রিপশন / ডিক্রিপশন প্রক্রিয়াটির কোনও হাত থাকে না। এটি হাতের কাজটি (এনক্রিপ্টিং এবং ডিক্রিপ্টিং ডেটা) এর উপরে ফোকাস করে ivএবং keyকলার দ্বারা সরবরাহ করা এবং সরবরাহ করা প্রয়োজন ।


এই টিপটি খুব দরকারী ছিল, কারণ, কখনও কখনও কীগুলি app.config এ সংরক্ষণ করা হয় এবং আমাদের অবশ্যই সর্বদা নিশ্চিত থাকতে হবে যে এনক্রিপ্ট করার জন্য ব্যবহৃত কীগুলি ডিক্রিপ্ট করার জন্য ব্যবহৃত একই রকম।
মারিও মাইরেলিস

@ এটকনওয়ে আপনি আমার প্রশ্নটি একবার দেখে নিন? আমার একই রকম সমস্যা আছে তবে সি ++ / সিএলআইতে: stackoverflow.com/questions/57139447/…
সহজ

আমি পরামর্শ দিই যে প্রতিদিন ব্যবহারে, সম্ভবত এই কারণেই লোকেরা এই ত্রুটির মুখোমুখি হবেন। বিশেষত যদি আপনি প্যাডিং সেটিংসের সাথে বিশৃঙ্খলা না করেন।
ড্যান

28

লোকেরা অনুসন্ধানের সুবিধার জন্য, এটি ডিক্রিপ্ট করা হচ্ছে ইনপুটটি পরীক্ষা করার উপযুক্ত হতে পারে। আমার ক্ষেত্রে, ডিক্রিপশন জন্য প্রেরণ করা তথ্য হচ্ছিল (ভুলভাবে) একটি খালি স্ট্রিং হিসাবে যাচ্ছিল। এর ফলে প্যাডিংয়ের ত্রুটি হয়েছে।

এটি রসমের উত্তরের সাথে সম্পর্কিত হতে পারে তবে এটি উল্লেখ করার মতো বলে মনে করেছে।


আমি সম্মত হই, আমার ক্ষেত্রেও একই ঘটনা ঘটেছিল, অন্যান্য চেকগুলি করার আগে ইনপুট ডিক্রিপ্ট করা হচ্ছে তা পরীক্ষা করা। আমি যে
কল্পনা

একটি ফাঁকা স্ট্রিং আমার জন্যও অপরাধী ছিল।
dotNET

আমার কেসটি ছিল পাসফ্রেজ সেট করা হয়নি (হ্যাঁ আমি জানি), তবে এই উত্তরটি আমাকে সঠিক দিকে নিয়ে গেছে।
জিম

2
আমার সমস্যাটি হ'ল ডিক্রিপ্ট করার স্ট্রিংটি ডিক্রিপ্ট করার চেষ্টা করার আগে লোয়ার কেসে রূপান্তরিত করা হয়েছিল। আমি প্যাডিং এবং সিফারগুলি এবং সেই সমস্ত স্টাফের সাথে মনোযোগ দিচ্ছিলাম তবে এটি কেবল খারাপ ইনপুট ছিল out কখনও কখনও আপনার শুধু একটি পদক্ষেপ পিছনে নেওয়া প্রয়োজন!
টম গারকেন

15

যদি একই কী এবং প্রারম্ভিকরণ ভেক্টরটি এনকোডিং এবং ডিকোডিংয়ের জন্য ব্যবহৃত হয় তবে এই সমস্যাটি ডেটা ডিকোডিং থেকে আসে না তবে ডেটা এনকোডিং থেকে আসে।

আপনি কোনও ক্রিপ্টোস্ট্রিম অবজেক্টে রাইটিং পদ্ধতিটি কল করার পরে, বন্ধ পদ্ধতির আগে আপনাকে অবশ্যই ফ্লাশফাইনালব্লক পদ্ধতিটি অবশ্যই কল করতে হবে।

CryptoStream.FlushFinalBlock পদ্ধতির উপর MSDN ডকুমেন্টেশন বলেছেন:
" বন্ধ পদ্ধতি কলিং FlushFinalBlock কল হবে ... "
https://msdn.microsoft.com/en-US/library/system.security.cryptography.cryptostream.flushfinalblock(v=vs .110) .aspx
এটি ভুল। কলিং ক্লাস্ট পদ্ধতিটি কেবল ক্রিপ্টোস্ট্রিম এবং আউটপুট স্ট্রিম বন্ধ করে দেয়।
আপনি এনক্রিপ্ট করার জন্য ডেটা লেখার পরে যদি আপনি ফ্লুশফিনাললককে কল না করেন, ডেটা ডিক্রিপ্ট করার সময় আপনার ক্রিপ্টোস্ট্রিম অবজেক্টে রিড বা কপিটো পদ্ধতিতে কল একটি ক্রিপ্টোগ্রাফিকঅ্যাক্সপশন ব্যতিক্রম উত্থাপন করবে (বার্তা: "প্যাডিং অবৈধ এবং সরানো যাবে না")।

এটি সিমমেট্রিক অ্যালগোরিদম (এস, ডিইএস, আরসি 2, রিজানডেল, ট্রিপলডিএস) থেকে প্রাপ্ত সমস্ত এনক্রিপশন অ্যালগরিদমের ক্ষেত্রে সম্ভবত সত্য, যদিও আমি কেবল এটিস ম্যানেজড এবং একটি মেমরিস্ট্রিমের জন্য আউটপুট স্ট্রিম হিসাবে যাচাই করেছি।

সুতরাং, আপনি যদি ডিক্রিপশনটিতে এই ক্রিপ্টোগ্রাফিক এক্সেপশন ব্যতিক্রম পান তবে আপনার ডেটা এনক্রিপ্ট করার জন্য আপনার আউটপুট স্ট্রিম দৈর্ঘ্যের সম্পত্তি মানটি পড়ুন, তারপরে ফ্লাশফিনব্লককে কল করুন এবং এর মানটি আবার পড়ুন। যদি এটি পরিবর্তিত হয়ে থাকে, আপনি জানেন যে ফ্লাশফিনালব্লক কল করা alচ্ছিক নয়।

এবং আপনার প্রোগ্রামিংয়ে কোনও প্যাডিং করার দরকার নেই, বা অন্য কোনও প্যাডিং সম্পত্তি মান চয়ন করুন। প্যাডিং হ'ল ফ্লাশফিনালব্লক পদ্ধতির কাজ।

.........

কেভিনের জন্য অতিরিক্ত মন্তব্য:

হ্যাঁ, ক্রিপ্টোস্ট্রিম ক্লোজ করার আগে ফ্লুশফিনলককে কল করে তবে এটি অনেক দেরিতে: যখন ক্রিপ্টোস্ট্রিম বন্ধ পদ্ধতিটি বলা হয়, আউটপুট স্ট্রিমটিও বন্ধ হয়ে যায়।

যদি আপনার আউটপুট স্ট্রিমটি একটি মেমরিস্ট্রিম হয় তবে আপনি এটি বন্ধ করার পরে এটির ডেটা পড়তে পারবেন না। সুতরাং মেমোরিস্ট্রিমে লিখিত এনক্রিপ্ট করা ডেটা ব্যবহার করার আগে আপনাকে আপনার ক্রিপ্টোস্ট্রিমে ফ্লাশফিনালক্লক কল করতে হবে।

যদি আপনার আউটপুট স্ট্রিম কোনও ফাইল স্ট্রিম হয় তবে লেখাগুলি বাফার হওয়ার কারণে জিনিসগুলি আরও খারাপ। ফলাফলটি সর্বশেষে লেখা বাইটগুলি ফাইলটিতে লেখা নাও হতে পারে যদি আপনি ফাইলস্ট্রিমে ফ্ল্যাশ কল করার আগে আউটপুট স্ট্রিমটি বন্ধ করে দেন। সুতরাং ক্রিপ্টোস্ট্রিমকে ক্লোজ করার আগে আপনাকে প্রথমে আপনার ক্রিপ্টোস্ট্রিমে ফ্লাশফিনালক্লক কল করতে হবে তারপরে আপনার ফাইলস্ট্রিমে ফ্ল্যাশ কল করতে হবে।


1
তুমি কেন ভুল বলছ? Stream.Close()কলগুলির জন্য কোড this.Dispose(true)। কোডটি CryptoStream.Dispose(bool)হ'ল:if (disposing) { if (!this._finalBlockTransformed) { this.FlushFinalBlock(); } this._stream.Close(); }
কেভিন ডায়ন

1
এটি আমার সমস্যা সমাধান করেছে। আমি ক্রিপ্টোস্ট্রিমটি সঠিকভাবে নিষ্পত্তি করছিলাম, তবে আপনি যেমন বলছেন ঠিক তেমনই নিষ্পত্তি কলটি "খুব দেরী" হচ্ছিল। এটি বর্ণিত হিসাবে "অবৈধ প্যাডিং" ত্রুটির ফলস্বরূপ। ক্রিপ্টোস্ট্রিম.ফ্লুশফিনালব্লক () যুক্ত করে, অবৈধ প্যাডিং ত্রুটিটি সমাধান করা হয়েছিল। ধন্যবাদ!
ড্যানিয়েল ল্যামবার্ট

13

লড়াইয়ের এক গুরুত্বপূর্ণ সময়, অবশেষে আমি সমস্যার সমাধান করেছি।
(দ্রষ্টব্য: আমি স্ট্যান্ডার্ড এইএসকে প্রতিসাম্য অ্যালগরিদম হিসাবে ব্যবহার করি This এই উত্তরটি সবার পক্ষে উপযুক্ত নাও হতে পারে))

  1. অ্যালগরিদম শ্রেণি পরিবর্তন করুন। RijndaelManagedক্লাসটি AESManagedএকটিতে প্রতিস্থাপন করুন ।
  2. KeySizeঅ্যালগরিদম শ্রেণীর সুস্পষ্ট সেট করবেন না , এগুলি ডিফল্ট রেখেছেন।
    (এটি অত্যন্ত গুরুত্বপূর্ণ পদক্ষেপ I আমি মনে করি কী সাইজের সম্পত্তিটিতে একটি বাগ রয়েছে))

আপনি যে যুক্তিটি মিস করেছেন তা এখানে যাচাই করতে চান এমন একটি তালিকা এখানে রয়েছে:

  • কী
    (বাইট অ্যারে, দৈর্ঘ্য অবশ্যই বিভিন্ন কী আকারের জন্য 16, 24, 32 বাইটের মধ্যে এক হতে হবে))
  • চতুর্থ
    (বাইট অ্যারে, 16 বাইট)
  • সাইফারমোড
    (সিবিসি, সিএফবি, সিটিএস, ইসিবি, ওএফবি অন্যতম)
  • প্যাডিংমোড
    ( ANSIX923 এর মধ্যে একটি, ISO10126, কোনওটি নয়, PKCS7, জিরোস)

3
সুস্পষ্টভাবে সেট KeySizeনা করে সরাসরি আমার জন্য এটি স্থির করে দেওয়া। ও নেট দ্য রিপোর্ট :-(
জন

নোট করুন যে এটি নিজেই নেট নেট ফ্রেমওয়ার্কে একটি রিগ্রেশন বলে মনে হচ্ছে। আমার কাছে কোড রয়েছে যা রিজান্ডেল ম্যানেজডের সাথে কাজ করত, তবে কাজ করা বন্ধ করে দিয়েছিল এবং কেবল এেস ম্যানেজড / এসসক্রিপ্টোসোসাইভারপ্রাইডারে পরিবর্তন করে এটি আবার কাজ করে। আমার কাছে স্পষ্টভাবে কীসাইজ সেট করার কোনও কোডও ছিল না। সুতরাং আপনি যদি এটিকে কামড়ে থাকেন তবে আরও ভাল মনে করুন - দোষটি আপনার কাছে নাও থাকতে পারে তবে নেট নেট ফ্রেমওয়ার্কের সাথে।
ইউসাস

6

আমার সমস্যাটি হ'ল এনক্রিপ্টের পাসফ্রেজ ডিক্রিপ্টের পাসফ্রেসের সাথে মেলে না ... সুতরাং এটি এই ত্রুটিটি ফেলে দিয়েছে .. কিছুটা বিভ্রান্তিকর।


আসলে এটি সত্য যে আমরা এনক্রিপ্ট এবং ডিক্রিপ্টের জন্য প্যাডিংমড.পিকেসিএস 7 ব্যবহার করি তবে আমি একই ত্রুটি বার্তা পেয়েছি got এছাড়াও আমাদের বিভিন্ন মূল মান সহ স্টেজ এবং দেব পরিবেশ রয়েছে। যখন আমি যথাযথ-পরিবেশ সম্পর্কিত নির্দিষ্ট ব্যবহার করি - কীটি এই ব্যতিক্রমটি সমাধান হয়ে যায় ...
মেজর

যদিও উপরের সমস্ত উত্তর ভাল এবং আপনার অবশ্যই এনক্রিপ্ট এবং ডিক্রিপ্টের জন্য একই প্যাডিং ব্যবহার করতে হবে (কোনওটিই প্রস্তাবিত নয়!) আসলে এই উত্তরটিও সত্য হতে পারে। যখন আমি যথাযথ-পরিবেশ সম্পর্কিত নির্দিষ্ট ব্যবহার করি - ব্যতিক্রমটি কী "সিস্টেম.সিকিউরিটি.ক্রিপোগ্রাফি ryক্রিপ্টোগ্রাফিক এক্সেপশন: প্যাডিং অবৈধ এবং সরানো যায় না" " সমাধান করা হয়েছিল। হ্যাঁ এটি বিভ্রান্তিকর হতে পারে।
মেজর

যদি "পাসফ্রেজ" দ্বারা আপনি এনক্রিপ্ট / ডিক্রিপ্ট করার সঠিক মান (ভুল কী ব্যবহার করে কোনও সমস্যা নয়) সম্পর্কে কথা বলছেন, তবে হ্যাঁ, এটি আমার সমস্যা ছিল। আমার কেসটি ছিল মূল এনক্রিপ্ট হওয়া মানটি আমার ডাটাবেস টেবিল ক্ষেত্রের মঞ্জুরির চেয়ে বেশি দীর্ঘ ছিল তাই এটি না বুঝে আমাকে ফিট করার জন্য এটি কেটে দেওয়া হয়েছিল। তারপরে সেই কাটা মানটিকে ডিক্রিপ্ট করার সময় এই ব্যতিক্রমটি ছুঁড়ে দেওয়া হয়েছিল।
ডেভিড গাউনসন 21

2

আমার যে সমাধানটি সমাধান করেছিল তা হ'ল আমি অজান্তেই এনক্রিপশন এবং ডিক্রিপশন পদ্ধতিতে বিভিন্ন কী প্রয়োগ করেছি।


1

ডিক্রিপ্ট পদ্ধতিতে একটি এনক্রিপ্ট করা ফাইল পথ পাস করার চেষ্টা করার সময় আমি এই ত্রুটিটি পেরিয়ে এসেছি solution সমাধানটি হ'ল ডিক্রিপ্ট করার চেষ্টা করার আগে পাস করা ফাইলটি প্রথমে এনক্রিপ্ট করা হয়েছে কিনা তা পরীক্ষা করা উচিত solution

if (Sec.IsFileEncrypted(e.File.FullName))
{
    var stream = Sec.Decrypt(e.File.FullName);
} 
else
{
    // non-encrypted scenario  
}

1
আমি এই সমাধানটির বৈধতা সম্পর্কে যে কোনও হিট এবং রান কাপওয়ার্ডকে চ্যালেঞ্জ জানাই।
20

+1 কারণ আপনি যখন দু'বার ডিক্রিপ্ট করবেন বা এনক্রিপ্ট করা হয়নি এমন কোনও কিছু ডিক্রিপ্ট করবেন তখন এই ব্যতিক্রমটি উত্থাপিত হবে। সুতরাং আমি এই উত্তরটি "" নিশ্চিত যে ডেটা আসলে এনক্রিপ্ট করা আছে? "হিসাবে পড়েছি read
জেরার্ডো গ্রিগনিলি

0

আর একটি দৃশ্য, আবার লোকেরা অনুসন্ধানের সুবিধার্থে।

আমার জন্য এই ত্রুটিটি ডিসপোজ () পদ্ধতির সময় ঘটেছিল যা পূর্ববর্তী ত্রুটিটি এনক্রিপশনের সাথে সম্পর্কিত নয় mas

একবার অন্য উপাদান স্থির হয়ে গেলে, এই ব্যতিক্রমটি চলে যায়।


3
এনক্রিপশনের সাথে সম্পর্কযুক্ত পূর্ববর্তী ত্রুটিটি কী ছিল?
এনএসটুকে

0

আমি এই প্যাডিংয়ের ত্রুটির মুখোমুখি হয়েছি যখন আমি ফাইলটিতে এনক্রিপ্ট করা স্ট্রিংগুলিকে ম্যানুয়ালি সম্পাদনা করব (নোটপ্যাড ব্যবহার করে) কারণ আমার এনক্রিপ্ট করা সামগ্রীটি ম্যানুয়ালি পরিবর্তিত হলে ডিক্রিপশন ফাংশনটি কী আচরণ করবে তা পরীক্ষা করতে চেয়েছিলাম।

আমার জন্য সমাধানটি ছিল একটি

        try
            decryption stuff....
        catch
             inform decryption will not be carried out.
        end try

যেমন আমি বলেছিলাম যে আমার প্যাডিংয়ের ত্রুটিটি কারণ আমি নোটপ্যাড ব্যবহার করে ডিক্রিপ্ট হওয়া পাঠ্যটিতে ম্যানুয়ালি টাইপ করছিলাম। আমার উত্তর হতে পারে আপনার সমাধানের জন্য আপনাকে গাইড করতে পারে।


0

আমারও ত্রুটি ছিল আমার ক্ষেত্রে এটি ছিল কারণ আমি একটি এসকিউএল ডেটাবেসে এনক্রিপ্ট হওয়া ডেটা সংরক্ষণ করেছি। তথ্যটি যে সারণীতে তথ্য সংরক্ষণ করা হয় তার একটি বাইনারি (1000) ডেটা রয়েছে। ডাটাবেস থেকে ডেটা পুনরুদ্ধার করার সময়, এটি 1000 টি বাইট ডিক্রিপ্ট করে দেবে, যেখানে সেখানে প্রকৃতপক্ষে 400 বাইট রয়েছে। সুতরাং ফলাফল থেকে পিছনের শূন্যের (600) অপসারণ এটি সমস্যার সমাধান করেছে।


0

আমার এই ত্রুটি ছিল এবং স্পষ্টভাবে ব্লকসাইজটি সেট করেছিলাম: aesManaged.BlockSize = 128;

একবার আমি এটি সরিয়ে ফেললাম, এটি কাজ করেছিল।


0

একটি গো প্রোগ্রাম সি # তে পোর্ট করার চেষ্টা করে আমারও একই সমস্যা হয়েছিল। এর অর্থ হ'ল গো প্রোগ্রামের সাথে ইতিমধ্যে প্রচুর ডেটা এনক্রিপ্ট করা হয়েছে। এই ডেটা এখন সি # দিয়ে ডিক্রিপ্ট করা উচিত।

চূড়ান্ত সমাধান ছিল PaddingMode.Noneবা বরং PaddingMode.Zeros

গো-তে ক্রিপ্টোগ্রাফিক পদ্ধতি:

import (
    "crypto/aes"
    "crypto/cipher"
    "crypto/sha1"
    "encoding/base64"
    "io/ioutil"
    "log"

    "golang.org/x/crypto/pbkdf2"
)

func decryptFile(filename string, saltBytes []byte, masterPassword []byte) (artifact string) {

    const (
        keyLength         int = 256
        rfc2898Iterations int = 6
    )

    var (
        encryptedBytesBase64 []byte // The encrypted bytes as base64 chars
        encryptedBytes       []byte // The encrypted bytes
    )

    // Load an encrypted file:
    if bytes, bytesErr := ioutil.ReadFile(filename); bytesErr != nil {
        log.Printf("[%s] There was an error while reading the encrypted file: %s\n", filename, bytesErr.Error())
        return
    } else {
        encryptedBytesBase64 = bytes
    }

    // Decode base64:
    decodedBytes := make([]byte, len(encryptedBytesBase64))
    if countDecoded, decodedErr := base64.StdEncoding.Decode(decodedBytes, encryptedBytesBase64); decodedErr != nil {
        log.Printf("[%s] An error occur while decoding base64 data: %s\n", filename, decodedErr.Error())
        return
    } else {
        encryptedBytes = decodedBytes[:countDecoded]
    }

    // Derive key and vector out of the master password and the salt cf. RFC 2898:
    keyVectorData := pbkdf2.Key(masterPassword, saltBytes, rfc2898Iterations, (keyLength/8)+aes.BlockSize, sha1.New)
    keyBytes := keyVectorData[:keyLength/8]
    vectorBytes := keyVectorData[keyLength/8:]

    // Create an AES cipher:
    if aesBlockDecrypter, aesErr := aes.NewCipher(keyBytes); aesErr != nil {
        log.Printf("[%s] Was not possible to create new AES cipher: %s\n", filename, aesErr.Error())
        return
    } else {

        // CBC mode always works in whole blocks.
        if len(encryptedBytes)%aes.BlockSize != 0 {
            log.Printf("[%s] The encrypted data's length is not a multiple of the block size.\n", filename)
            return
        }

        // Reserve memory for decrypted data. By definition (cf. AES-CBC), it must be the same lenght as the encrypted data:
        decryptedData := make([]byte, len(encryptedBytes))

        // Create the decrypter:
        aesDecrypter := cipher.NewCBCDecrypter(aesBlockDecrypter, vectorBytes)

        // Decrypt the data:
        aesDecrypter.CryptBlocks(decryptedData, encryptedBytes)

        // Cast the decrypted data to string:
        artifact = string(decryptedData)
    }

    return
}

... এবং ...

import (
    "crypto/aes"
    "crypto/cipher"
    "crypto/sha1"
    "encoding/base64"
    "github.com/twinj/uuid"
    "golang.org/x/crypto/pbkdf2"
    "io/ioutil"
    "log"
    "math"
    "os"
)

func encryptFile(filename, artifact string, masterPassword []byte) (status bool) {

    const (
        keyLength         int = 256
        rfc2898Iterations int = 6
    )

    status = false
    secretBytesDecrypted := []byte(artifact)

    // Create new salt:
    saltBytes := uuid.NewV4().Bytes()

    // Derive key and vector out of the master password and the salt cf. RFC 2898:
    keyVectorData := pbkdf2.Key(masterPassword, saltBytes, rfc2898Iterations, (keyLength/8)+aes.BlockSize, sha1.New)
    keyBytes := keyVectorData[:keyLength/8]
    vectorBytes := keyVectorData[keyLength/8:]

    // Create an AES cipher:
    if aesBlockEncrypter, aesErr := aes.NewCipher(keyBytes); aesErr != nil {
        log.Printf("[%s] Was not possible to create new AES cipher: %s\n", filename, aesErr.Error())
        return
    } else {

        // CBC mode always works in whole blocks.
        if len(secretBytesDecrypted)%aes.BlockSize != 0 {
            numberNecessaryBlocks := int(math.Ceil(float64(len(secretBytesDecrypted)) / float64(aes.BlockSize)))
            enhanced := make([]byte, numberNecessaryBlocks*aes.BlockSize)
            copy(enhanced, secretBytesDecrypted)
            secretBytesDecrypted = enhanced
        }

        // Reserve memory for encrypted data. By definition (cf. AES-CBC), it must be the same lenght as the plaintext data:
        encryptedData := make([]byte, len(secretBytesDecrypted))

        // Create the encrypter:
        aesEncrypter := cipher.NewCBCEncrypter(aesBlockEncrypter, vectorBytes)

        // Encrypt the data:
        aesEncrypter.CryptBlocks(encryptedData, secretBytesDecrypted)

        // Encode base64:
        encodedBytes := make([]byte, base64.StdEncoding.EncodedLen(len(encryptedData)))
        base64.StdEncoding.Encode(encodedBytes, encryptedData)

        // Allocate memory for the final file's content:
        fileContent := make([]byte, len(saltBytes))
        copy(fileContent, saltBytes)
        fileContent = append(fileContent, 10)
        fileContent = append(fileContent, encodedBytes...)

        // Write the data into a new file. This ensures, that at least the old version is healthy in case that the
        // computer hangs while writing out the file. After a successfully write operation, the old file could be
        // deleted and the new one could be renamed.
        if writeErr := ioutil.WriteFile(filename+"-update.txt", fileContent, 0644); writeErr != nil {
            log.Printf("[%s] Was not able to write out the updated file: %s\n", filename, writeErr.Error())
            return
        } else {
            if renameErr := os.Rename(filename+"-update.txt", filename); renameErr != nil {
                log.Printf("[%s] Was not able to rename the updated file: %s\n", fileContent, renameErr.Error())
            } else {
                status = true
                return
            }
        }

        return
    }
}

এখন, সি # তে ডিক্রিপশন:

public static string FromFile(string filename, byte[] saltBytes, string masterPassword)
{
    var iterations = 6;
    var keyLength = 256;
    var blockSize = 128;
    var result = string.Empty;
    var encryptedBytesBase64 = File.ReadAllBytes(filename);

    // bytes -> string:
    var encryptedBytesBase64String = System.Text.Encoding.UTF8.GetString(encryptedBytesBase64);

    // Decode base64:
    var encryptedBytes = Convert.FromBase64String(encryptedBytesBase64String);
    var keyVectorObj = new Rfc2898DeriveBytes(masterPassword, saltBytes.Length, iterations);
    keyVectorObj.Salt = saltBytes;
    Span<byte> keyVectorData = keyVectorObj.GetBytes(keyLength / 8 + blockSize / 8);
    var key = keyVectorData.Slice(0, keyLength / 8);
    var iv = keyVectorData.Slice(keyLength / 8);

    var aes = Aes.Create();
    aes.Padding = PaddingMode.Zeros;
    // or ... aes.Padding = PaddingMode.None;
    var decryptor = aes.CreateDecryptor(key.ToArray(), iv.ToArray());
    var decryptedString = string.Empty;

    using (var memoryStream = new MemoryStream(encryptedBytes))
    {
        using (var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
        {
            using (var reader = new StreamReader(cryptoStream))
            {
                decryptedString = reader.ReadToEnd();
            }
        }
    }

    return result;
}

প্যাডিং সহ সমস্যাটি কীভাবে ব্যাখ্যা করা যেতে পারে? এনক্রিপশনের ঠিক আগে গো প্রোগ্রামটি প্যাডিং চেক করে:

// CBC mode always works in whole blocks.
if len(secretBytesDecrypted)%aes.BlockSize != 0 {
    numberNecessaryBlocks := int(math.Ceil(float64(len(secretBytesDecrypted)) / float64(aes.BlockSize)))
    enhanced := make([]byte, numberNecessaryBlocks*aes.BlockSize)
    copy(enhanced, secretBytesDecrypted)
    secretBytesDecrypted = enhanced
}

গুরুত্বপূর্ণ অংশটি হ'ল:

enhanced := make([]byte, numberNecessaryBlocks*aes.BlockSize)
copy(enhanced, secretBytesDecrypted)

উপযুক্ত দৈর্ঘ্যের সাহায্যে একটি নতুন অ্যারে তৈরি করা হয়, যাতে দৈর্ঘ্যটি ব্লকের আকারের একাধিক। এই নতুন অ্যারেটি শূন্যে ভরা। অনুলিপি পদ্ধতিটি এর মধ্যে বিদ্যমান ডেটা অনুলিপি করে। এটি নিশ্চিত করা হয়েছে যে নতুন অ্যারে বিদ্যমান ডেটার চেয়ে বড়। তদনুসারে, অ্যারের শেষে জিরো রয়েছে।

সুতরাং, সি # কোড ব্যবহার করতে পারেন PaddingMode.Zeros। বিকল্পটি PaddingMode.Noneকেবল কোনও প্যাডিং উপেক্ষা করে, যা কাজ করে। আমি আশা করি যে এই উত্তরটি যে কারও কাছে যান # # সি থেকে শুরু করে কোড ইত্যাদি পোর্ট করতে হয় তাদের জন্য সহায়ক is


0

আমি ক্লায়েন্ট দ্বারা একই ত্রুটি রিপোর্ট করা হয়। আমি ব্যক্তিগতভাবে এটি তিরস্কার করতে পারি না। এনক্রিপ্ট এবং ডিক্রিপ্ট পদ্ধতিগুলির কোডটি দেখে উভয়ের প্যাডিং প্যাডিংমোড.পিকেসিএস 7 তে সেট করা আছে । ডিক্রিপ্টটি দেখতে দেখতে দেখতে ' ফ্লাশফিনালব্লক'-এর ক্ষেত্রে সমস্যাটি দেখতে পাচ্ছি না । কেউ দয়া করে কিছু আলোকপাত করতে পারেন?

public string Decrypt(string cipherText)
{
  if (string.IsNullOrEmpty(cipherText))
    return "";
  string result;
  Encoding byteEncoder = Encoding.Default;

  byte[] rijnKey = byteEncoder.GetBytes(Password);
  byte[] rijnIv = byteEncoder.GetBytes(InitialVector);
  RijndaelManaged rijn = new RijndaelManaged { Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 };

  using (MemoryStream msDecrypt = new MemoryStream(Convert.FromBase64String(cipherText)))
  {
    using (ICryptoTransform decryptor = rijn.CreateDecryptor(rijnKey, rijnIv))
    {
      using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
      {
                    using (StreamReader swDecrypt = new StreamReader(csDecrypt))
                    {
                        result = swDecrypt.ReadToEnd();
                    }
                }
    }
  }
  rijn.Clear();      
  return result.Replace("\0", "");
}

0

আমারও ত্রুটি ছিল আমার ক্ষেত্রে প্রদত্ত পাসওয়ার্ডটি 16 এর বেশি হওয়া মানে এটি এনক্রিপ্ট করা হয়েছে তবে ডিক্রিপশন করার সময় আমি এই ত্রুটিটি পাচ্ছি। জোড়া লাগানো:

string keyString = "CDFUYP@ssw0rd123";
            var key = Encoding.UTF8.GetBytes(keyString);            
            using (var aesAlg = Aes.Create())
            {
                using (var encryptor = aesAlg.CreateEncryptor(key, aesAlg.IV))
                {
                    using (var msEncrypt = new MemoryStream())
                    {
                        using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                        using (var swEncrypt = new StreamWriter(csEncrypt))
                        {
                            swEncrypt.Write(text);
                        }                          
                        var iv = aesAlg.IV;

                        var decryptedContent = msEncrypt.ToArray();

                        var result = new byte[iv.Length + decryptedContent.Length];

                        Buffer.BlockCopy(iv, 0, result, 0, iv.Length);
                        Buffer.BlockCopy(decryptedContent, 0, result, iv.Length, decryptedContent.Length);

                        var encryptedString = Convert.ToBase64String(result);
                        var decryptedString = Decrypt(encryptedString);
                        if (decryptedString == null)
                        {
                            return null;
                        }
                        return encryptedString;

                    }
                }

ডিক্রিপশন:

 string keyString = "CDFUYP@ssw0rd123";
            var fullCipher = Convert.FromBase64String(cipherText);
            var iv = new byte[16];
            var cipher = new byte[16];
            Buffer.BlockCopy(fullCipher, 0, iv, 0, iv.Length);
            Buffer.BlockCopy(fullCipher, iv.Length, cipher, 0, iv.Length);
            var key = Encoding.UTF8.GetBytes(keyString);

            using (var aesAlg = Aes.Create())
            {
                using (var decryptor = aesAlg.CreateDecryptor(key, iv))
                {
                    string result;
                    using (var msDecrypt = new MemoryStream(cipher))
                    {
                        using (var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                        {
                            using (var srDecrypt = new StreamReader(csDecrypt))
                            {
                                result = srDecrypt.ReadToEnd();
                            }
                        }
                    }

                    return result;
                }
            }

হাই @ সুন্দররাজ, এটা কি প্রশ্ন?
টিয়াগো মার্টিনস পেরেস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.