সরল নিরাপত্তাহীন দ্বি-মুখী ডেটা "অবলম্বন"?


426

আমি খুব সাধারণ অবলম্বন খুঁজছি (যেমন এনক্রিপ্ট এবং ডিক্রিপ্ট তবে প্রয়োজনীয় সুরক্ষিত নয়) কিছু কার্যকারিতার জন্য কার্যকারিতা। এটা মিশন সমালোচনা নয়। সৎ লোকদের সৎ রাখতে আমার কিছু দরকার তবে ROT13 বা বেস 64 এর চেয়ে কিছুটা শক্তিশালী ।

আমি NET ফ্রেমওয়ার্ক 2.0 এর মধ্যে ইতিমধ্যে অন্তর্ভুক্ত এমন কিছু পছন্দ করবো , সুতরাং আমাকে কোনও বাহ্যিক নির্ভরতা সম্পর্কে চিন্তা করতে হবে না।

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


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

3
নিজেকে ঘন্টা বাঁচান এবং বাইট অ্যারে থেকে url বন্ধুত্বপূর্ণ স্ট্রিংয়ে পিছনে পিছনে রূপান্তর করতে HttpServerU उपयुक्त.UllTokenEn / Decode ব্যবহার করুন।
প্রেশাগাস

32
আপনার নিজের চালাক নকশা রোল করার চেষ্টা না করার জন্য +1। আপনি এনক্রিপশন সম্পর্কে খুব বেশি জানেন না, তবে আপনি জানেন যে বেশিরভাগ বিকাশকারীদের সাথে আমি সাক্ষাত্কার রেখেছি যারা এনক্রিপশন সম্পর্কে বেশি জানেন না তবে তারা যেভাবেই নিজের সমাধান তৈরি করতে পারে বলে মনে করেন।
দিনাহ

6
মনোযোগ দিন: এই প্রশ্নের উত্তরগুলির মধ্যে অনেকগুলিই কেবল অযৌক্তিক এনক্রিপশন। এর অর্থ হ'ল আক্রমণকারী অ্যাপটিকে লক্ষ্য না করেই ডেটা পরিবর্তন করতে পারে । এটি অন্যান্য গুরুতর দুর্বলতার দিকেও নিয়ে যায় (প্যাডিং ওরাকেলের কারণে কী ছাড়াই ডিক্রিপশন)। টিএল; ডিআর: প্রদত্ত উত্তরে কোডটি ব্যবহার করবেন না যদি আপনি এটির সাথে ঠিক না থাকেন, বা আমি কী বলেছি তা বুঝতে পারছেন না।
usr

36
এই প্রশ্নের একটিও উত্তর নিরাপদ এনক্রিপশন বর্ণনা করে না। এনক্রিপ্টে jbtule এর উত্তর ব্যবহার করুন এবং তার পরিবর্তে একটি স্ট্রিং ডিক্রিপ্ট করুন।
কোডসইনচওস 20:38

উত্তর:


471

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

দ্রষ্টব্য: আপনার কী (32 বাইট) এবং ভেক্টর (16 বাইট) অ্যারেতে বিভিন্ন মান ব্যবহার করা উচিত! আপনি চাইবেন না যে কেউ এই কোডটি যেমন আছেন তেমন ধরে নিয়ে কেবল আপনার চাবিগুলি বের করে! আপনাকে যা করতে হবে তা হ'ল কী এবং ভেক্টর অ্যারেতে কিছু নম্বর (অবশ্যই <= 255) হওয়া উচিত (আপনি এটি করেছেন তা নিশ্চিত করার জন্য আমি ভেক্টর অ্যারেতে একটি অবৈধ মান রেখেছি ...)। সহজেই একটি নতুন সেট তৈরি করতে আপনি https://www.random.org/bytes/ ব্যবহার করতে পারেন:

এটি ব্যবহার করা সহজ: কেবল ক্লাসটি ইনস্ট্যান্ট করুন এবং তারপরে পদ্ধতি হিসাবে (সাধারণত) এনক্রিপ্টটোস্ট্রিং (স্ট্রিং স্ট্রিংটোসেক্রিপ্ট) এবং ডিক্রিপ্টস্ট্রিং (স্ট্রিং স্ট্রিংটোডেক্রিপ্ট) কল করুন। আপনার এই ক্লাসটি জায়গায় রাখার পরে এটি কোনও সহজ (বা আরও সুরক্ষিত) হতে পারে না।


using System;
using System.Data;
using System.Security.Cryptography;
using System.IO;


public class SimpleAES
{
    // Change these keys
    private byte[] Key = __Replace_Me__({ 123, 217, 19, 11, 24, 26, 85, 45, 114, 184, 27, 162, 37, 112, 222, 209, 241, 24, 175, 144, 173, 53, 196, 29, 24, 26, 17, 218, 131, 236, 53, 209 });

    // a hardcoded IV should not be used for production AES-CBC code
    // IVs should be unpredictable per ciphertext
    private byte[] Vector = __Replace_Me__({ 146, 64, 191, 111, 23, 3, 113, 119, 231, 121, 2521, 112, 79, 32, 114, 156 });


    private ICryptoTransform EncryptorTransform, DecryptorTransform;
    private System.Text.UTF8Encoding UTFEncoder;

    public SimpleAES()
    {
        //This is our encryption method
        RijndaelManaged rm = new RijndaelManaged();

        //Create an encryptor and a decryptor using our encryption method, key, and vector.
        EncryptorTransform = rm.CreateEncryptor(this.Key, this.Vector);
        DecryptorTransform = rm.CreateDecryptor(this.Key, this.Vector);

        //Used to translate bytes to text and vice versa
        UTFEncoder = new System.Text.UTF8Encoding();
    }

    /// -------------- Two Utility Methods (not used but may be useful) -----------
    /// Generates an encryption key.
    static public byte[] GenerateEncryptionKey()
    {
        //Generate a Key.
        RijndaelManaged rm = new RijndaelManaged();
        rm.GenerateKey();
        return rm.Key;
    }

    /// Generates a unique encryption vector
    static public byte[] GenerateEncryptionVector()
    {
        //Generate a Vector
        RijndaelManaged rm = new RijndaelManaged();
        rm.GenerateIV();
        return rm.IV;
    }


    /// ----------- The commonly used methods ------------------------------    
    /// Encrypt some text and return a string suitable for passing in a URL.
    public string EncryptToString(string TextValue)
    {
        return ByteArrToString(Encrypt(TextValue));
    }

    /// Encrypt some text and return an encrypted byte array.
    public byte[] Encrypt(string TextValue)
    {
        //Translates our text value into a byte array.
        Byte[] bytes = UTFEncoder.GetBytes(TextValue);

        //Used to stream the data in and out of the CryptoStream.
        MemoryStream memoryStream = new MemoryStream();

        /*
         * We will have to write the unencrypted bytes to the stream,
         * then read the encrypted result back from the stream.
         */
        #region Write the decrypted value to the encryption stream
        CryptoStream cs = new CryptoStream(memoryStream, EncryptorTransform, CryptoStreamMode.Write);
        cs.Write(bytes, 0, bytes.Length);
        cs.FlushFinalBlock();
        #endregion

        #region Read encrypted value back out of the stream
        memoryStream.Position = 0;
        byte[] encrypted = new byte[memoryStream.Length];
        memoryStream.Read(encrypted, 0, encrypted.Length);
        #endregion

        //Clean up.
        cs.Close();
        memoryStream.Close();

        return encrypted;
    }

    /// The other side: Decryption methods
    public string DecryptString(string EncryptedString)
    {
        return Decrypt(StrToByteArray(EncryptedString));
    }

    /// Decryption when working with byte arrays.    
    public string Decrypt(byte[] EncryptedValue)
    {
        #region Write the encrypted value to the decryption stream
        MemoryStream encryptedStream = new MemoryStream();
        CryptoStream decryptStream = new CryptoStream(encryptedStream, DecryptorTransform, CryptoStreamMode.Write);
        decryptStream.Write(EncryptedValue, 0, EncryptedValue.Length);
        decryptStream.FlushFinalBlock();
        #endregion

        #region Read the decrypted value from the stream.
        encryptedStream.Position = 0;
        Byte[] decryptedBytes = new Byte[encryptedStream.Length];
        encryptedStream.Read(decryptedBytes, 0, decryptedBytes.Length);
        encryptedStream.Close();
        #endregion
        return UTFEncoder.GetString(decryptedBytes);
    }

    /// Convert a string to a byte array.  NOTE: Normally we'd create a Byte Array from a string using an ASCII encoding (like so).
    //      System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
    //      return encoding.GetBytes(str);
    // However, this results in character values that cannot be passed in a URL.  So, instead, I just
    // lay out all of the byte values in a long string of numbers (three per - must pad numbers less than 100).
    public byte[] StrToByteArray(string str)
    {
        if (str.Length == 0)
            throw new Exception("Invalid string value in StrToByteArray");

        byte val;
        byte[] byteArr = new byte[str.Length / 3];
        int i = 0;
        int j = 0;
        do
        {
            val = byte.Parse(str.Substring(i, 3));
            byteArr[j++] = val;
            i += 3;
        }
        while (i < str.Length);
        return byteArr;
    }

    // Same comment as above.  Normally the conversion would use an ASCII encoding in the other direction:
    //      System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
    //      return enc.GetString(byteArr);    
    public string ByteArrToString(byte[] byteArr)
    {
        byte val;
        string tempStr = "";
        for (int i = 0; i <= byteArr.GetUpperBound(0); i++)
        {
            val = byteArr[i];
            if (val < (byte)10)
                tempStr += "00" + val.ToString();
            else if (val < (byte)100)
                tempStr += "0" + val.ToString();
            else
                tempStr += val.ToString();
        }
        return tempStr;
    }
}

53
@ অ্যান্ডিএমসি কেইনা - এটি উদ্দেশ্য অনুসারে সম্পন্ন হয়েছে যাতে আপনি দ্বিতীয় অনুচ্ছেদে মার্ক নোট হিসাবে অ্যারেগুলিতে মানগুলি পরিবর্তন করতে পারেন।
পাউক

42
আপনার এই জাতীয় আইভি ব্যবহার করা উচিত নয়। প্রদত্ত দুটি বার্তাগুলির জন্য তাদের একই কী এবং একই IV দিয়ে এনক্রিপ্ট করা উচিত হয়নি। IV প্রতিটি বার্তার জন্য এলোমেলো হওয়া উচিত, ক্রিপ্টোস্ট্রিমে প্রিপেন্ড করা উচিত এবং ডিক্রিপশনের আগে পড়তে হবে। crypto.stackexchange.com/a/82/1934
jbtule

30
প্রতিটি বার্তার জন্য এলোমেলো IV ব্যবহার করা বিদেশী বা নতুন নয়, কেবল গুরুত্বপূর্ণ এবং অ্যালগরিদমের নকশার অংশ design প্রতিটি বার্তার জন্য অনুমানযোগ্য IV ব্যবহার করা একটি সাধারণ ক্রিপ্টো ভুল যা স্থায়ী হওয়ার দরকার হয় না।
jbtule

14
এটিও নোট করুন যে সিবিসিকে এর মোড হিসাবে ব্যবহার করার একটি পরিণতি হ'ল আপনি সম্ভবত ওরাকল আক্রমণগুলিতে প্যাডিংয়ের ঝুঁকির মধ্যে পড়তে পারেন । প্রমাণীকৃত এনক্রিপশন ব্যবহার করুন এবং যখনই সম্ভব হবে, নিজেকে ক্রিপ্টোগ্রাফি প্রয়োগ করবেন না
স্টিফেন টোসেট

57
সুরক্ষা সতর্কতা: এই কোডটি ব্যবহার করবেন না স্বীকৃত উত্তর হওয়া সত্ত্বেও, উপরোক্ত মন্তব্যে গুরুতর সুরক্ষার সমস্যা রয়েছে যা লেখক 8 বছর অবহেলা করে চলেছেন।
jbtule

176

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

কোডটি ছোট, সহজ, দ্রুত এবং আউটপুট আরও সংক্ষিপ্ত হয়। উদাহরণস্বরূপ, johnsmith@gmail.comউত্পাদন করে:

SimpleAES: "096114178117140150104121138042115022037019164188092040214235183167012211175176167001017163166152"
SimplerAES: "YHKydYyWaHmKKnMWJROkvFwo1uu3pwzTr7CnARGjppg%3d"

কোড:

public class SimplerAES
{
    private static byte[] key = __Replace_Me__({ 123, 217, 19, 11, 24, 26, 85, 45, 114, 184, 27, 162, 37, 112, 222, 209, 241, 24, 175, 144, 173, 53, 196, 29, 24, 26, 17, 218, 131, 236, 53, 209 });

    // a hardcoded IV should not be used for production AES-CBC code
    // IVs should be unpredictable per ciphertext
    private static byte[] vector = __Replace_Me_({ 146, 64, 191, 111, 23, 3, 113, 119, 231, 121, 221, 112, 79, 32, 114, 156 });

    private ICryptoTransform encryptor, decryptor;
    private UTF8Encoding encoder;

    public SimplerAES()
    {
        RijndaelManaged rm = new RijndaelManaged();
        encryptor = rm.CreateEncryptor(key, vector);
        decryptor = rm.CreateDecryptor(key, vector);
        encoder = new UTF8Encoding();
    }

    public string Encrypt(string unencrypted)
    {
        return Convert.ToBase64String(Encrypt(encoder.GetBytes(unencrypted)));
    }

    public string Decrypt(string encrypted)
    {
        return encoder.GetString(Decrypt(Convert.FromBase64String(encrypted)));
    }

    public byte[] Encrypt(byte[] buffer)
    {
        return Transform(buffer, encryptor);
    }

    public byte[] Decrypt(byte[] buffer)
    {
        return Transform(buffer, decryptor);
    }

    protected byte[] Transform(byte[] buffer, ICryptoTransform transform)
    {
        MemoryStream stream = new MemoryStream();
        using (CryptoStream cs = new CryptoStream(stream, transform, CryptoStreamMode.Write))
        {
            cs.Write(buffer, 0, buffer.Length);
        }
        return stream.ToArray();
    }
}

2
ডিকোডিংয়ের সময়, ক্রোমে কোয়েরিস্ট্রিংয়ের সাথে কাজ করার জন্য আমাকে স্থানটি + এর সাথে প্রতিস্থাপন করতে হয়েছিল: (নতুন সিম্পলারিএইএস ()) ডিক্রিপ্ট (অনুরোধ।কুইস্ট্রিং ["মাইপ্রাম"])। প্রতিস্থাপন ('', '+'));
লাইভ-

20
স্থির সূচনা ভেক্টরটি কখনই ব্যবহার করবেন না, এটি সম্পর্কে আরও তথ্যের জন্য দেখুন: crypto.stackexchange.com/questions/66/… । পরিবর্তে, প্রতিটি এনক্রিপশনের জন্য একটি নতুন আইভি তৈরি করুন এবং এটি ক্রিপ্টোটেক্সটে সংযুক্ত করুন, আরও ভাল এবং শক্ত নয়।
টম হিয়ার্ড

2
এ বিষয়ে সচেতন থাকুন যে কোনও সমাধানের URL হিসাবে (কোয়েরি স্ট্রিং নয়) হিসাবে ব্যবহার করা হলে এই সমাধানের এনক্রিপ্টটোরাল পদ্ধতির আউটপুট (বা সাধারণভাবে একটি urlCoded বেস 64 স্ট্রিংয়ের কোনও ব্যবহার) আইআইএস 7 এর অধীনে ডিফল্টরূপে কাজ করবে না আইআইএস 7 সুরক্ষা সেটিংয়ের কারণে একটি এএসপি.এনইটি এমভিসি রুট। আরও তথ্যের জন্য দেখুন: stackoverflow.com/a/2014121/12484
জন স্নাইডার

5
@ টমহিয়ার্ড উপরের কোড সহ কেউ কীভাবে এটি করতে যাবেন?
এমকেআইআই

26
সুরক্ষা সতর্কতা: এই কোডটি ব্যবহার করবেন না @ টমহাইডের মন্তব্য দেখুন
jbtule

36

হ্যাঁ, সমাবেশটি যুক্ত করুন System.Security, System.Security.Cryptographyনাম স্থানটি আমদানি করুন । এখানে প্রতিসাম্য (ডিইএস) অ্যালগরিদম এনক্রিপশনের একটি সাধারণ উদাহরণ রয়েছে:

DESCryptoServiceProvider des = new DESCryptoServiceProvider();
des.GenerateKey();
byte[] key = des.Key; // save this!

ICryptoTransform encryptor = des.CreateEncryptor();
// encrypt
byte[] enc = encryptor.TransformFinalBlock(new byte[] { 1, 2, 3, 4 }, 0, 4);

ICryptoTransform decryptor = des.CreateDecryptor();

// decrypt
byte[] originalAgain = decryptor.TransformFinalBlock(enc, 0, enc.Length);
Debug.Assert(originalAgain[0] == 1);

5
এটি একটি দুর্দান্ত, কমপ্যাক্ট দ্বিমুখী এনক্রিপশন। একমাত্র সতর্কতা হ'ল ডিইএসকে আর অত্যাধুনিক সুরক্ষা হিসাবে বিবেচনা করা হয় না। সেই শিরোনামটি এখন আমি নীচে আলোচনা করা AES অ্যালগরিদমের কাছে যায়।
মার্ক ব্রিটিংহাম

@richdiet। আমি দুঃখিত আমি আপনার উত্তর অগ্রহণযোগ্য। 37+ ভোট সহ অন্য উত্তর কারণ এটি বেশি বর্তমান। আপনার উত্তরের জন্য ধন্যবাদ, কারণ এটি এখনও একটি ভাল one
ম্যাট ডাওডি

14
@ মার্কব্রিটিংহাম: ব্লক চেইনিং ফাংশন, ইনিশিয়েশন ভেক্টর এবং সঠিক প্যাডিং ছাড়াই যে কোনও ব্লক সাইফারটি নিরাপত্তাহীন। এই স্কিমের সাথে ডিইএস ব্যবহার করা সবচেয়ে কম গুরুত্বপূর্ণ সমস্যা।
হুবার্ট কারিও

2
তাহলে চাবিটি কোথায় ব্যবহৃত হয়?
অ্যালেক্স

22
সুরক্ষা সতর্কতা: এই কোডটি ব্যবহার করবেন না @ হুবার্টকারিও
jbtule

28

কেবল ভেবেছি আমি এনড্রিপ্ট স্ট্রিংয়ের অভ্যন্তরে ফিরে আসা একটি এলোমেলো চতুর্থ যোগ করে মুডের সিম্পলারএইএস উন্নত করেছি। এটি এনক্রিপশনকে উন্নত করে কারণ একই স্ট্রিং এনক্রিপ্ট করা প্রতিটি সময় ভিন্ন আউটপুট তৈরি করে।

public class StringEncryption
{
    private readonly Random random;
    private readonly byte[] key;
    private readonly RijndaelManaged rm;
    private readonly UTF8Encoding encoder;

    public StringEncryption()
    {
        this.random = new Random();
        this.rm = new RijndaelManaged();
        this.encoder = new UTF8Encoding();
        this.key = Convert.FromBase64String("Your+Secret+Static+Encryption+Key+Goes+Here=");
    }

    public string Encrypt(string unencrypted)
    {
        var vector = new byte[16];
        this.random.NextBytes(vector);
        var cryptogram = vector.Concat(this.Encrypt(this.encoder.GetBytes(unencrypted), vector));
        return Convert.ToBase64String(cryptogram.ToArray());
    }

    public string Decrypt(string encrypted)
    {
        var cryptogram = Convert.FromBase64String(encrypted);
        if (cryptogram.Length < 17)
        {
            throw new ArgumentException("Not a valid encrypted string", "encrypted");
        }

        var vector = cryptogram.Take(16).ToArray();
        var buffer = cryptogram.Skip(16).ToArray();
        return this.encoder.GetString(this.Decrypt(buffer, vector));
    }

    private byte[] Encrypt(byte[] buffer, byte[] vector)
    {
        var encryptor = this.rm.CreateEncryptor(this.key, vector);
        return this.Transform(buffer, encryptor);
    }

    private byte[] Decrypt(byte[] buffer, byte[] vector)
    {
        var decryptor = this.rm.CreateDecryptor(this.key, vector);
        return this.Transform(buffer, decryptor);
    }

    private byte[] Transform(byte[] buffer, ICryptoTransform transform)
    {
        var stream = new MemoryStream();
        using (var cs = new CryptoStream(stream, transform, CryptoStreamMode.Write))
        {
            cs.Write(buffer, 0, buffer.Length);
        }

        return stream.ToArray();
    }
}

এবং বোনাস ইউনিট পরীক্ষা

[Test]
public void EncryptDecrypt()
{
    // Arrange
    var subject = new StringEncryption();
    var originalString = "Testing123!£$";

    // Act
    var encryptedString1 = subject.Encrypt(originalString);
    var encryptedString2 = subject.Encrypt(originalString);
    var decryptedString1 = subject.Decrypt(encryptedString1);
    var decryptedString2 = subject.Decrypt(encryptedString2);

    // Assert
    Assert.AreEqual(originalString, decryptedString1, "Decrypted string should match original string");
    Assert.AreEqual(originalString, decryptedString2, "Decrypted string should match original string");
    Assert.AreNotEqual(originalString, encryptedString1, "Encrypted string should not match original string");
    Assert.AreNotEqual(encryptedString1, encryptedString2, "String should never be encrypted the same twice");
}

11
1) System.Randomআরএনজি হিসাবে ব্যবহার করবেন না । 2) এটি নির্বাচিত-সিফারেক্সট আক্রমণের বিরুদ্ধে সম্পূর্ণভাবে ভেঙে গেছে (বিশেষত প্যাডিং-
ওরাকলসগুলিতে

21
সুরক্ষা সতর্কতা: এই কোডটি ব্যবহার করবেন না @ কোডসআইএনচাউসের উপরের মন্তব্যটি দেখুন
jbtule

@ জেবিটুলে দয়া করে এমন প্রতিটি ব্যক্তিকে বিপথগামী করবেন না যারা কেবল এনক্রিপ্ট করতে জটিলতা চায় না, এবং যারা আক্রমণ সম্পর্কে কোনও সতর্কও নয়, - দয়া করে আপনি যদি পরামর্শ চান তবে অর্ডার করবেন না।
বীরভদ্রসিংহ

@ বিরভদ্রসিংহ আমার পক্ষ থেকে কোনও বিভ্রান্তিকর নেই, বাস্তবে এটি সম্পূর্ণ বিপরীত। আপনি যদি এইএস ব্যবহার করতে যাচ্ছেন, এটি সঠিকভাবে ব্যবহার করা বেশ গুরুত্বপূর্ণ, এটি ভুলভাবে ব্যবহার করা এবং এটি ঠিক আছে যে আমি এটিকে গুরুত্বপূর্ণ কোনও কিছুর জন্য ব্যবহার করছি না, এটি বিপথগামী।
jbtule

1
@ কোরি চিৎকার করছে না, এবং স্ট্যাক ওভারফ্লো উত্তরের সুরক্ষা সংক্রান্ত সমস্যাগুলি মোকাবেলার জন্য সেরা অনুশীলনটি অনুসরণ করেছিল। আপনি যদি একটি লিঙ্ক চান, এটি প্রশ্ন মন্তব্য পোস্ট করা হয়েছে। কিন্তু আমি এটা আপনার জন্য এখানে পাশাপাশি রেখে দেব stackoverflow.com/a/10366194/637783
jbtule

12

চিহ্নের একটি বৈকল্পিক (দুর্দান্ত) উত্তরের

  • "ব্যবহার করে" গুলি যোগ করুন
  • ক্লাসটি আইডিস্পোজেবল করুন
  • উদাহরণটিকে আরও সহজ করতে URL এনকোডিং কোডটি সরান।
  • ব্যবহার দেখানোর জন্য একটি সাধারণ পরীক্ষার দৃxture়তা যুক্ত করুন

আশাকরি এটা সাহায্য করবে

[TestFixture]
public class RijndaelHelperTests
{
    [Test]
    public void UseCase()
    {
        //These two values should not be hard coded in your code.
        byte[] key = {251, 9, 67, 117, 237, 158, 138, 150, 255, 97, 103, 128, 183, 65, 76, 161, 7, 79, 244, 225, 146, 180, 51, 123, 118, 167, 45, 10, 184, 181, 202, 190};
        byte[] vector = {214, 11, 221, 108, 210, 71, 14, 15, 151, 57, 241, 174, 177, 142, 115, 137};

        using (var rijndaelHelper = new RijndaelHelper(key, vector))
        {
            var encrypt = rijndaelHelper.Encrypt("StringToEncrypt");
            var decrypt = rijndaelHelper.Decrypt(encrypt);
            Assert.AreEqual("StringToEncrypt", decrypt);
        }
    }
}

public class RijndaelHelper : IDisposable
{
    Rijndael rijndael;
    UTF8Encoding encoding;

    public RijndaelHelper(byte[] key, byte[] vector)
    {
        encoding = new UTF8Encoding();
        rijndael = Rijndael.Create();
        rijndael.Key = key;
        rijndael.IV = vector;
    }

    public byte[] Encrypt(string valueToEncrypt)
    {
        var bytes = encoding.GetBytes(valueToEncrypt);
        using (var encryptor = rijndael.CreateEncryptor())
        using (var stream = new MemoryStream())
        using (var crypto = new CryptoStream(stream, encryptor, CryptoStreamMode.Write))
        {
            crypto.Write(bytes, 0, bytes.Length);
            crypto.FlushFinalBlock();
            stream.Position = 0;
            var encrypted = new byte[stream.Length];
            stream.Read(encrypted, 0, encrypted.Length);
            return encrypted;
        }
    }

    public string Decrypt(byte[] encryptedValue)
    {
        using (var decryptor = rijndael.CreateDecryptor())
        using (var stream = new MemoryStream())
        using (var crypto = new CryptoStream(stream, decryptor, CryptoStreamMode.Write))
        {
            crypto.Write(encryptedValue, 0, encryptedValue.Length);
            crypto.FlushFinalBlock();
            stream.Position = 0;
            var decryptedBytes = new Byte[stream.Length];
            stream.Read(decryptedBytes, 0, decryptedBytes.Length);
            return encoding.GetString(decryptedBytes);
        }
    }

    public void Dispose()
    {
        if (rijndael != null)
        {
            rijndael.Dispose();
        }
    }
}

ভাল উত্তর. ডিসপোজ পদ্ধতিতে একটি জিনিস আপনাকে আইডিজ্পোজেবলের জন্য রিজেন্ডেল নিক্ষেপ করতে হবে বা ডিসপোজ কল করে আপনি সুরক্ষা স্তরের ত্রুটি পাবেন
জন ক্লিয়ারজেড

8
স্থির সূচনা ভেক্টরটি কখনই ব্যবহার করবেন না, এটি সম্পর্কে আরও তথ্যের জন্য দেখুন: crypto.stackexchange.com/questions/66/…। পরিবর্তে, প্রতিটি এনক্রিপশনের জন্য একটি নতুন আইভি তৈরি করুন এবং এটি ক্রিপ্টোটেক্সটে সংযুক্ত করুন, আরও ভাল এবং শক্ত নয়।
টম হিয়ার্ড

5
@Chalky উপর এনক্রিপ্ট, আপনি Rijndael বর্গ ব্যবহার (জন্য একটি র্যান্ডম চতুর্থ জেনারেট করতে msdn.microsoft.com/en-us/library/... ), আপনার এনক্রিপ্ট না, এবং তারপর চতুর্থ সম্পত্তি ব্যবহার Rijndael উদাহরণস্বরূপ থেকে চতুর্থ দখল । তারপরে আপনি আপনার ক্রিপ্টো পাঠ্যে প্রিপেন্ড (বা সংযোজন, ততক্ষণ কাজ করেন যতক্ষণ আপনার ডিক্রিপ্ট এটিকে একই দিক থেকে ধরে ফেলেন)। ডিক্রিপ্টে আপনি তারপরে প্রাপ্ত ডেটা থেকে আইভি টানুন (আইভি সম্পত্তির আকার 8 দিয়ে বিভক্ত ব্লকসাইজ সম্পত্তি হিসাবে সমান), তারপরে ডিক্রিপ্টের আগে এটি আপনার ডিক্রিপ্টের উদাহরণে দিন।
টম হিয়ার্ড

2
@ চ্যালকি নোট করুন আইভির গোপনীয়তার দরকার নেই, প্রতিটি বার্তা প্রেরণের জন্য এটি কেবল অনন্য হওয়া দরকার।
টম হিয়ার্ড

20
সুরক্ষা সতর্কতা: এই কোডটি ব্যবহার করবেন না উপরের মন্তব্যগুলি দেখুন টমহাইড
jbtule

8

[সম্পাদনা] বছর পরে, আমি ফিরে এসেছি বলে: এটি করবেন না! এক্সওর এনক্রিপশনে কী হয়েছে দেখুন ? বিস্তারিত জানার জন্য.

খুব সরল, সহজ দ্বিমুখী এনক্রিপশনটি হল এক্সওর এনক্রিপশন।

  1. একটি পাসওয়ার্ড নিয়ে আসুন। আসুন এটি করা যাক mypass
  2. পাসওয়ার্ডটিকে বাইনারি রূপান্তর করুন (এএসসিআইআই অনুসারে)। পাসওয়ার্ডটি 01101101 01111001 01110000 01100001 01110011 01110011 হয়।
  3. আপনি যে বার্তাটি এনকোড করতে চান তা নিন। এটিকেও বাইনারি রূপান্তর করুন।
  4. বার্তার দৈর্ঘ্য দেখুন। যদি বার্তার দৈর্ঘ্য 400 বাইট হয় তবে বার বার বার বার করে পাসওয়ার্ডটি 400 বাইট স্ট্রিংয়ে পরিণত করুন। এটি হয়ে উঠবে 01101101 01111001 01110000 01100001 01110011 01110011 01101101 01111001 01110000 01100001 01110011 01110011 01101101 01111001 01110000 01100001 01110011 01110011 ... (বা mypassmypassmypass...)
  5. দীর্ঘ পাসওয়ার্ড সহ বার্তাটি XOR করুন।
  6. ফলাফল প্রেরণ করুন।
  7. আর একবার, একই পাসওয়ার্ড ( mypassmypassmypass...) এর সাথে এনক্রিপ্ট করা বার্তা XOR ।
  8. আপনার বার্তা আছে!

10
@ রায়ান প্রতিটি পরিস্থিতিতে ক্রিপ্টোগ্রাফিক সুরক্ষিত হ্যাশ বা রিজান্ডেল সিফারগুলির প্রয়োজন হয় না। "সিম্পল 2 ওয়ে এনক্রিপশন" এর অর্থ আসলে সহজ হতে পারে , যা জোর বা এমনকি ROT13 প্রস্তাব দেয়।

1
@ রায়ান: স্ট্যাটিক এনক্রিপশন কী সহ এইএস, কোনও আরম্ভকরণ ভেক্টর এবং কোনও ব্লক চেইনিং ফাংশন এক্সওর এনক্রিপশনের জন্য অভিনব নাম নয়, আপনি কেবল অভিনব কেডিএফ ব্যবহার করছেন ...
হুবার্ট কারিও

17
সুরক্ষা সতর্কতা: এই কোডটি ব্যবহার করবেন না পুনরাবৃত্তি কী দ্বারা XOR এনক্রিপশনটি তুচ্ছভাবে ক্র্যাক হয়ে গেছে।
jbtule

7

বেশ কয়েকটি উত্তর এবং মন্তব্য থেকে আমি যা ভাল পেয়েছি তা একত্রিত করেছি।

  • এলোমেলো সূচনা ভেক্টর ক্রিপ্টো পাঠ্যে সংশোধন করেছে (@ জবিটিউল)
  • মেমোরিস্ট্রিম (@ রেনিপিট) এর পরিবর্তে ট্রান্সফর্মফাইনালব্লক () ব্যবহার করুন
  • দুর্যোগের অনুলিপি বা কাস্টিং কাউকে এড়ানোর জন্য কোনও প্রাক ভরাট কী নেই
  • সঠিক নিষ্পত্তি এবং নিদর্শন ব্যবহার

কোড:

/// <summary>
/// Simple encryption/decryption using a random initialization vector
/// and prepending it to the crypto text.
/// </summary>
/// <remarks>Based on multiple answers in http://stackoverflow.com/questions/165808/simple-two-way-encryption-for-c-sharp </remarks>
public class SimpleAes : IDisposable
{
    /// <summary>
    ///     Initialization vector length in bytes.
    /// </summary>
    private const int IvBytes = 16;

    /// <summary>
    ///     Must be exactly 16, 24 or 32 bytes long.
    /// </summary>
    private static readonly byte[] Key = Convert.FromBase64String("FILL ME WITH 24 (2 pad chars), 32 OR 44 (1 pad char) RANDOM CHARS"); // Base64 has a blowup of four-thirds (33%)

    private readonly UTF8Encoding _encoder;
    private readonly ICryptoTransform _encryptor;
    private readonly RijndaelManaged _rijndael;

    public SimpleAes()
    {
        _rijndael = new RijndaelManaged {Key = Key};
        _rijndael.GenerateIV();
        _encryptor = _rijndael.CreateEncryptor();
        _encoder = new UTF8Encoding();
    }

    public string Decrypt(string encrypted)
    {
        return _encoder.GetString(Decrypt(Convert.FromBase64String(encrypted)));
    }

    public void Dispose()
    {
        _rijndael.Dispose();
        _encryptor.Dispose();
    }

    public string Encrypt(string unencrypted)
    {
        return Convert.ToBase64String(Encrypt(_encoder.GetBytes(unencrypted)));
    }

    private byte[] Decrypt(byte[] buffer)
    {
        // IV is prepended to cryptotext
        byte[] iv = buffer.Take(IvBytes).ToArray();
        using (ICryptoTransform decryptor = _rijndael.CreateDecryptor(_rijndael.Key, iv))
        {
            return decryptor.TransformFinalBlock(buffer, IvBytes, buffer.Length - IvBytes);
        }
    }

    private byte[] Encrypt(byte[] buffer)
    {
        // Prepend cryptotext with IV
        byte [] inputBuffer = _encryptor.TransformFinalBlock(buffer, 0, buffer.Length); 
        return _rijndael.IV.Concat(inputBuffer).ToArray();
    }
}

2015-07-18 আপডেট করুন: @pilver এবং @Evereq এর মন্তব্যে ব্যক্তিগত এনক্রিপ্ট () পদ্ধতিতে স্থির ভুল। চতুর্থটি দুর্ঘটনাক্রমে এনক্রিপ্ট করা হয়েছিল, এখন ডিক্রিপ্ট () দ্বারা প্রত্যাশা অনুযায়ী স্পষ্ট পাঠ্যে প্রতিস্থাপন করা হয়েছে।


আপনার পুরো ইনপুট বাফারটি আইভি প্রেন্টেন্ড সহ এনক্রিপ্ট করা উচিত অন্যথায় স্ট্রিং-টু-এনক্রিপ্টের প্রথম 16 টি অক্ষর হারিয়ে গেছে। সুতরাং আপনার কোডটি পড়তে হবে:return _encryptor.TransformFinalBlock(inputBuffer, 0, inputBuffer.Length);
বিপিসিলভার

2
byte [] inputBuffer = _encryptor.TransformFinalBlock(buffer, 0, buffer.Length); return _rijndael.IV.Concat(inputBuffer).ToArray();
সেক্ষেত্রে

1
এটি বর্তমান বাস্তবায়নের মতো একই কাজ করবে, তাই না?
অ্যাঙ্গুলারসেন

1
"আমাকে 16, 24 বা 32 অক্ষরের সাথে পূরণ করুন" ভাল, না, বেস 64 ডিকোডিংয়ের আগে নয় । এবং একটি কী এলোমেলো হওয়া উচিত। সত্যিই এলোমেলো।
মার্টেন বোদেউয়েস

1
আমি লক্ষ্য করেছি যে @ বিবিসিবার ঠিক আছে, এবং প্রদত্ত কোড তার ফিক্স ব্যতীত কাজ করবে না: এনক্রিপ্ট পদ্ধতি আইভি ব্যতীত এনক্রিপ্ট হওয়া ডেটা ফেরত দেয় (এটি প্রথমে ইনপুটবার্টে আইভি যোগ করে, তবে পরবর্তী এনক্রিপ্ট করে এবং এটি ছাড়া ডেটা ফেরত দেয়)। সুতরাং যদি সম্ভব হয় তবে তার কোড সহ উত্তরটি আপডেট করুন। (দ্রষ্টব্য: আমি কেবল বাইট [] পরামিতিগুলির সাথে পদ্ধতিগুলি পরীক্ষা করি, স্ট্রিং নয়)। ধন্যবাদ!
এভেরিক

6

আপনি যদি কেবল সহজ এনক্রিপশন চান (যেমন, একটি নির্ধারিত ক্র্যাকার ভেঙে ফেলা সম্ভব, তবে বেশিরভাগ নৈমিত্তিক ব্যবহারকারীদের লক করা), কেবল সমান দৈর্ঘ্যের দুটি পাসফ্রেজ বেছে নিন, বলুন:

deoxyribonucleicacid
while (x>0) { x-- };

এবং তাদের উভয় দিয়ে আপনার ডেটাটি এক্সওর করুন (প্রয়োজনীয় হলে পাসফ্রেসগুলি লুপিং করা) (ক) । উদাহরণ স্বরূপ:

1111-2222-3333-4444-5555-6666-7777
deoxyribonucleicaciddeoxyribonucle
while (x>0) { x-- };while (x>0) { 

আপনার বাইনারি সন্ধানকারী কেউ হয়ত ডিএনএ স্ট্রিংকে একটি মূল বলে মনে করতে পারে তবে সি বাইনারিটি আপনার বাইনারি দিয়ে সংরক্ষণ করা অবিচ্ছিন্ন মেমরি ছাড়া অন্য কিছু বলে তারা সম্ভবত ভাবেন না।


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

প্রথম বাক্যে যেমন বলা হয়েছে, নৈমিত্তিক আক্রমণকারীদের পক্ষে তারা যে এগিয়ে চলেছে তাদের পক্ষে এটি যথেষ্ট কঠিন করার একটি উপায়। এটি আপনার বাড়িতে চুরি ঠেকানোর অনুরূপ - আপনার এটি দুর্ভেদ্য করা দরকার হয় না, আপনার কেবল পাশের বাড়ির চেয়ে কম গর্ভবতী করা দরকার :-)


3
আকর্ষণীয় ধারণা। আমি নিশ্চিত নই যে আমি বাইনারিটিতে সোর্স কোডটি "বিশ্বাস" করব - তবে পাসওয়ার্ড হিসাবে ত্রুটি বার্তাটি ব্যবহার করার ধারণাটি কীভাবে অভিযোজিত হবে?
জন স্কিটি

1
আমি কিছু ক্লিয়ারটেক্সট স্ট্রিংয়ের এমডি 5 হ্যাশ ব্যবহার করতে পছন্দ করি যা ইতিমধ্যে অ্যাপ্লিকেশনটিতে রয়েছে (ত্রুটির বার্তা বা তাই)।
ট্রেব

2
তাদের সমান দৈর্ঘ্যের হওয়া দরকার কেন? এগুলির দৈর্ঘ্য আলাদা হলে এটি আরও ভাল বলে মনে হয়। এইভাবে, আপনার কার্যকর এক্সওআর অপারেন্ডের দৈর্ঘ্য হ'ল এলসিএম (দৈর্ঘ্য 1, দৈর্ঘ্য 2), কেবল দৈর্ঘ্য 1 (= দৈর্ঘ্য 2) এর পরিবর্তে। দৈর্ঘ্য তুলনামূলকভাবে প্রধান হলে অবশ্যই দৈর্ঘ্য 1 * দৈর্ঘ্য 2 হয়ে যায়।
ফ্যানটিয়াস

15
সুরক্ষা সতর্কতা: এই কোডটি ব্যবহার করবেন না কী এক্সওর পুনরাবৃত্তি করা তথ্য সহজেই এনক্রিপ্ট হওয়ার সাধারণ জ্ঞানের সাথে সহজেই ক্র্যাকযোগ্য।
jbtule

3
@ জবিটুল, যদি আপনি প্রশ্নটি পড়েন, আপনি বুঝতে পেরেছেন যে আরও সুরক্ষিত এনক্রিপশন কোনওভাবেই প্রয়োজন নেই। বিশেষত 'সাধারণ এনক্রিপশন', 'মিশন সমালোচনা নয়' এবং কেবল 'সৎ লোকদের সৎ রাখার' উল্লেখ to আপনার আমার প্রথম অনুচ্ছেদটিও পড়তে হবে যা স্পষ্টভাবে বলে দেয় যে এটি নির্ধারিত আক্রমণকারীদের লক আউট করবে না।
paxdiablo

5

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

তবে ডিক্রিপশনও সহজ। আপনার কাছে থাকা সমস্যাটি এনক্রিপশন অ্যালগরিদম নয়, তবে ডিক্রিপশন-এর জন্য ব্যবহৃত কীটিতে অ্যাক্সেস রক্ষা করতে পারে।

আমি নিম্নলিখিত সমাধানগুলির মধ্যে একটি ব্যবহার করব:

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

  • ডিপিএপিআই লোকালমাচিন স্কোপ সহ সুরক্ষিত ডেটা ক্লাস ব্যবহার করে। যেমন একটি একক সুরক্ষিত সার্ভারে কনফিগারেশন ডেটা রক্ষার জন্য ভাল। তবে যে কেউ মেশিনে লগইন করতে পারেন তারা এটিকে এনক্রিপ্ট করতে পারবেন, তাই সার্ভারটি সুরক্ষিত না হলে কোনও লাভ হবে না।

  • যে কোনও প্রতিসম আলগরিদম। আমি সাধারণত স্ট্যাটিক সিমেট্রিক অ্যালগোরিদম.ক্রিয়েট () পদ্ধতিটি ব্যবহার করি যদি আমি অ্যালগরিদম কী ব্যবহৃত হয় তা যত্নশীল না করি (আসলে এটি ডিফল্টরূপে রিজান্ডেল)। এক্ষেত্রে আপনার কীটি কোনওরকম রক্ষা করা দরকার। উদাহরণস্বরূপ আপনি এটিকে কোনও উপায়ে আবদ্ধ করতে পারেন এবং এটি আপনার কোডে লুকিয়ে রাখতে পারেন। তবে জেনে রাখুন যে আপনার কোডটি ছড়িয়ে দেওয়ার মতো যথেষ্ট স্মার্ট তিনি সম্ভবত কীটি খুঁজে পেতে সক্ষম হবেন।


5

আমি আমার সমাধানটি পোস্ট করতে চেয়েছিলাম কারণ উপরের সমাধানগুলির কোনওটিই আমার মতো সহজ নয় simple আমার সম্পর্কে আপনি কী মনে করেন জানি:

 // This will return an encrypted string based on the unencrypted parameter
 public static string Encrypt(this string DecryptedValue)
 {
      HttpServerUtility.UrlTokenEncode(MachineKey.Protect(Encoding.UTF8.GetBytes(DecryptedValue.Trim())));
 }

 // This will return an unencrypted string based on the parameter
 public static string Decrypt(this string EncryptedValue)
 {
      Encoding.UTF8.GetString(MachineKey.Unprotect(HttpServerUtility.UrlTokenDecode(EncryptedValue)));
 }

ঐচ্ছিক

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


নোট করুন যে এই পদ্ধতিকে কেবল ASP.NET অ্যাপ্লিকেশানের জন্য ব্যবহার করা যেতে পারে।
ফেরু

2

নেমস্পেসে ক্লাস এবং ক্লাস System.Security.Cryptographyরয়েছেTripleDESCryptoServiceProviderRijndaelManaged

System.Securityসমাবেশে একটি রেফারেন্স যুক্ত করতে ভুলবেন না ।


8
আমি যে হ্রাস পেয়েছি তা নয়, তবে ভোট দেওয়ার সময় কেন একটি প্রশ্নবোধের বয়স হওয়া উচিত?
ব্যবহারকারী 247702

2

ট্রিপলডিসক্রিপ্টো সার্ভিস প্রোভাইডারটি সিস্টেমে.সিকিউরিটি.ক্রিপোগ্রাফিটিতে ব্যবহার করা :

public static class CryptoHelper
{
    private const string Key = "MyHashString";
    private static TripleDESCryptoServiceProvider GetCryproProvider()
    {
        var md5 = new MD5CryptoServiceProvider();
        var key = md5.ComputeHash(Encoding.UTF8.GetBytes(Key));
        return new TripleDESCryptoServiceProvider() { Key = key, Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 };
    }

    public static string Encrypt(string plainString)
    {
        var data = Encoding.UTF8.GetBytes(plainString);
        var tripleDes = GetCryproProvider();
        var transform = tripleDes.CreateEncryptor();
        var resultsByteArray = transform.TransformFinalBlock(data, 0, data.Length);
        return Convert.ToBase64String(resultsByteArray);
    }

    public static string Decrypt(string encryptedString)
    {
        var data = Convert.FromBase64String(encryptedString);
        var tripleDes = GetCryproProvider();
        var transform = tripleDes.CreateDecryptor();
        var resultsByteArray = transform.TransformFinalBlock(data, 0, data.Length);
        return Encoding.UTF8.GetString(resultsByteArray);
    }
}

1

আমি পরিবর্তন এই :

public string ByteArrToString(byte[] byteArr)
{
    byte val;
    string tempStr = "";
    for (int i = 0; i <= byteArr.GetUpperBound(0); i++)
    {
        val = byteArr[i];
        if (val < (byte)10)
            tempStr += "00" + val.ToString();
        else if (val < (byte)100)
            tempStr += "0" + val.ToString();
        else
            tempStr += val.ToString();
    }
    return tempStr;
}

এটি:

    public string ByteArrToString(byte[] byteArr)
    {
        string temp = "";
        foreach (byte b in byteArr)
            temp += b.ToString().PadLeft(3, '0');
        return temp;
    }

1

বিল্টিন। নেট ক্রিপ্টোগ্রাফি লাইব্রেরি ব্যবহার করে, এই উদাহরণটি অ্যাডভান্সড এনক্রিপশন স্ট্যান্ডার্ড (এইএস) কীভাবে ব্যবহার করতে হয় তা দেখায়।

using System;
using System.IO;
using System.Security.Cryptography;

namespace Aes_Example
{
    class AesExample
    {
        public static void Main()
        {
            try
            {

                string original = "Here is some data to encrypt!";

                // Create a new instance of the Aes
                // class.  This generates a new key and initialization 
                // vector (IV).
                using (Aes myAes = Aes.Create())
                {

                    // Encrypt the string to an array of bytes.
                    byte[] encrypted = EncryptStringToBytes_Aes(original, myAes.Key, myAes.IV);

                    // Decrypt the bytes to a string.
                    string roundtrip = DecryptStringFromBytes_Aes(encrypted, myAes.Key, myAes.IV);

                    //Display the original data and the decrypted data.
                    Console.WriteLine("Original:   {0}", original);
                    Console.WriteLine("Round Trip: {0}", roundtrip);
                }

            }
            catch (Exception e)
            {
                Console.WriteLine("Error: {0}", e.Message);
            }
        }
        static byte[] EncryptStringToBytes_Aes(string plainText, byte[] Key,byte[] IV)
        {
            // Check arguments.
            if (plainText == null || plainText.Length <= 0)
                throw new ArgumentNullException("plainText");
            if (Key == null || Key.Length <= 0)
                throw new ArgumentNullException("Key");
            if (IV == null || IV.Length <= 0)
                throw new ArgumentNullException("Key");
            byte[] encrypted;
            // Create an Aes object
            // with the specified key and IV.
            using (Aes aesAlg = Aes.Create())
            {
                aesAlg.Key = Key;
                aesAlg.IV = IV;

                // Create a decrytor to perform the stream transform.
                ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

                // Create the streams used for encryption.
                using (MemoryStream msEncrypt = new MemoryStream())
                {
                    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                    {
                        using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                        {

                            //Write all data to the stream.
                            swEncrypt.Write(plainText);
                        }
                        encrypted = msEncrypt.ToArray();
                    }
                }
            }


            // Return the encrypted bytes from the memory stream.
            return encrypted;

        }

        static string DecryptStringFromBytes_Aes(byte[] cipherText, byte[] Key, byte[] IV)
        {
            // Check arguments.
            if (cipherText == null || cipherText.Length <= 0)
                throw new ArgumentNullException("cipherText");
            if (Key == null || Key.Length <= 0)
                throw new ArgumentNullException("Key");
            if (IV == null || IV.Length <= 0)
                throw new ArgumentNullException("Key");

            // Declare the string used to hold
            // the decrypted text.
            string plaintext = null;

            // Create an Aes object
            // with the specified key and IV.
            using (Aes aesAlg = Aes.Create())
            {
                aesAlg.Key = Key;
                aesAlg.IV = IV;

                // Create a decrytor to perform the stream transform.
                ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);

                // Create the streams used for decryption.
                using (MemoryStream msDecrypt = new MemoryStream(cipherText))
                {
                    using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                    {
                        using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                        {

                            // Read the decrypted bytes from the decrypting stream
                            // and place them in a string.
                            plaintext = srDecrypt.ReadToEnd();
                        }
                    }
                }

            }

            return plaintext;

        }
    }
}

0

আমি আপনি বলেন আপনি কিভাবে নিরাপদ এটা যত্ন সম্পর্কে না জানেন, কিন্তু আপনি যদি বেছে নেওয়া হয়েছে DES ভাল হিসাবে আপনি সময় নিতে পারে হবে AES এটি আরো আপ-টু-ডেট এনক্রিপশন পদ্ধতি।


0

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

  1. প্রতিটি বার্তার জন্য পৃথক চতুর্থ - হেক্স প্রাপ্তির আগে সাইফার বাইটগুলিতে চতুর্থ বাইট প্রতিযোগিতা করে। অবশ্যই এটি একটি সম্মেলন যা সাইফার পাঠ্য প্রাপ্ত পক্ষগুলিতে পৌঁছে দেওয়া দরকার।
  2. দুটি কনস্ট্রাক্টরকে মঞ্জুরি দেয় - একটি ডিফল্ট RijndaelManagedমানগুলির জন্য, এবং এক যেখানে সম্পত্তি মানগুলি নির্দিষ্ট করা যায় (এনক্রিপ্টিং এবং ডিক্রিপ্টিং পক্ষগুলির মধ্যে পারস্পরিক চুক্তির ভিত্তিতে)

এখানে ক্লাসটি রয়েছে (শেষে পরীক্ষার নমুনা):

/// <summary>
/// Based on https://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndaelmanaged(v=vs.110).aspx
/// Uses UTF8 Encoding
///  http://security.stackexchange.com/a/90850
/// </summary>
public class AnotherAES : IDisposable
{
    private RijndaelManaged rijn;

    /// <summary>
    /// Initialize algo with key, block size, key size, padding mode and cipher mode to be known.
    /// </summary>
    /// <param name="key">ASCII key to be used for encryption or decryption</param>
    /// <param name="blockSize">block size to use for AES algorithm. 128, 192 or 256 bits</param>
    /// <param name="keySize">key length to use for AES algorithm. 128, 192, or 256 bits</param>
    /// <param name="paddingMode"></param>
    /// <param name="cipherMode"></param>
    public AnotherAES(string key, int blockSize, int keySize, PaddingMode paddingMode, CipherMode cipherMode)
    {
        rijn = new RijndaelManaged();
        rijn.Key = Encoding.UTF8.GetBytes(key);
        rijn.BlockSize = blockSize;
        rijn.KeySize = keySize;
        rijn.Padding = paddingMode;
        rijn.Mode = cipherMode;
    }

    /// <summary>
    /// Initialize algo just with key
    /// Defaults for RijndaelManaged class: 
    /// Block Size: 256 bits (32 bytes)
    /// Key Size: 128 bits (16 bytes)
    /// Padding Mode: PKCS7
    /// Cipher Mode: CBC
    /// </summary>
    /// <param name="key"></param>
    public AnotherAES(string key)
    {
        rijn = new RijndaelManaged();
        byte[] keyArray = Encoding.UTF8.GetBytes(key);
        rijn.Key = keyArray;
    }

    /// <summary>
    /// Based on https://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndaelmanaged(v=vs.110).aspx
    /// Encrypt a string using RijndaelManaged encryptor.
    /// </summary>
    /// <param name="plainText">string to be encrypted</param>
    /// <param name="IV">initialization vector to be used by crypto algorithm</param>
    /// <returns></returns>
    public byte[] Encrypt(string plainText, byte[] IV)
    {
        if (rijn == null)
            throw new ArgumentNullException("Provider not initialized");

        // Check arguments.
        if (plainText == null || plainText.Length <= 0)
            throw new ArgumentNullException("plainText cannot be null or empty");
        if (IV == null || IV.Length <= 0)
            throw new ArgumentNullException("IV cannot be null or empty");
        byte[] encrypted;

        // Create a decrytor to perform the stream transform.
        using (ICryptoTransform encryptor = rijn.CreateEncryptor(rijn.Key, IV))
        {
            // Create the streams used for encryption.
            using (MemoryStream msEncrypt = new MemoryStream())
            {
                using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                    {
                        //Write all data to the stream.
                        swEncrypt.Write(plainText);
                    }
                    encrypted = msEncrypt.ToArray();
                }
            }
        }
        // Return the encrypted bytes from the memory stream.
        return encrypted;
    }//end EncryptStringToBytes

    /// <summary>
    /// Based on https://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndaelmanaged(v=vs.110).aspx
    /// </summary>
    /// <param name="cipherText">bytes to be decrypted back to plaintext</param>
    /// <param name="IV">initialization vector used to encrypt the bytes</param>
    /// <returns></returns>
    public string Decrypt(byte[] cipherText, byte[] IV)
    {
        if (rijn == null)
            throw new ArgumentNullException("Provider not initialized");

        // Check arguments.
        if (cipherText == null || cipherText.Length <= 0)
            throw new ArgumentNullException("cipherText cannot be null or empty");
        if (IV == null || IV.Length <= 0)
            throw new ArgumentNullException("IV cannot be null or empty");

        // Declare the string used to hold the decrypted text.
        string plaintext = null;

        // Create a decrytor to perform the stream transform.
        using (ICryptoTransform decryptor = rijn.CreateDecryptor(rijn.Key, IV))
        {
            // Create the streams used for decryption.
            using (MemoryStream msDecrypt = new MemoryStream(cipherText))
            {
                using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                {
                    using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                    {
                        // Read the decrypted bytes from the decrypting stream and place them in a string.
                        plaintext = srDecrypt.ReadToEnd();
                    }
                }
            }
        }

        return plaintext;
    }//end DecryptStringFromBytes

    /// <summary>
    /// Generates a unique encryption vector using RijndaelManaged.GenerateIV() method
    /// </summary>
    /// <returns></returns>
    public byte[] GenerateEncryptionVector()
    {
        if (rijn == null)
            throw new ArgumentNullException("Provider not initialized");

        //Generate a Vector
        rijn.GenerateIV();
        return rijn.IV;
    }//end GenerateEncryptionVector


    /// <summary>
    /// Based on https://stackoverflow.com/a/1344255
    /// Generate a unique string given number of bytes required.
    /// This string can be used as IV. IV byte size should be equal to cipher-block byte size. 
    /// Allows seeing IV in plaintext so it can be passed along a url or some message.
    /// </summary>
    /// <param name="numBytes"></param>
    /// <returns></returns>
    public static string GetUniqueString(int numBytes)
    {
        char[] chars = new char[62];
        chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".ToCharArray();
        byte[] data = new byte[1];
        using (RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider())
        {
            data = new byte[numBytes];
            crypto.GetBytes(data);
        }
        StringBuilder result = new StringBuilder(numBytes);
        foreach (byte b in data)
        {
            result.Append(chars[b % (chars.Length)]);
        }
        return result.ToString();
    }//end GetUniqueKey()

    /// <summary>
    /// Converts a string to byte array. Useful when converting back hex string which was originally formed from bytes.
    /// </summary>
    /// <param name="hex"></param>
    /// <returns></returns>
    public static byte[] StringToByteArray(String hex)
    {
        int NumberChars = hex.Length;
        byte[] bytes = new byte[NumberChars / 2];
        for (int i = 0; i < NumberChars; i += 2)
            bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
        return bytes;
    }//end StringToByteArray

    /// <summary>
    /// Dispose RijndaelManaged object initialized in the constructor
    /// </summary>
    public void Dispose()
    {
        if (rijn != null)
            rijn.Dispose();
    }//end Dispose()
}//end class

এবং..

পরীক্ষার নমুনা এখানে:

class Program
{
    string key;
    static void Main(string[] args)
    {
        Program p = new Program();

        //get 16 byte key (just demo - typically you will have a predetermined key)
        p.key = AnotherAES.GetUniqueString(16);

        string plainText = "Hello World!";

        //encrypt
        string hex = p.Encrypt(plainText);

        //decrypt
        string roundTrip = p.Decrypt(hex);

        Console.WriteLine("Round Trip: {0}", roundTrip);
    }

    string Encrypt(string plainText)
    {
        Console.WriteLine("\nSending (encrypt side)...");
        Console.WriteLine("Plain Text: {0}", plainText);
        Console.WriteLine("Key: {0}", key);
        string hex = string.Empty;
        string ivString = AnotherAES.GetUniqueString(16);
        Console.WriteLine("IV: {0}", ivString);
        using (AnotherAES aes = new AnotherAES(key))
        {
            //encrypting side
            byte[] IV = Encoding.UTF8.GetBytes(ivString);

            //get encrypted bytes (IV bytes prepended to cipher bytes)
            byte[] encryptedBytes = aes.Encrypt(plainText, IV);
            byte[] encryptedBytesWithIV = IV.Concat(encryptedBytes).ToArray();

            //get hex string to send with url
            //this hex has both IV and ciphertext
            hex = BitConverter.ToString(encryptedBytesWithIV).Replace("-", "");
            Console.WriteLine("sending hex: {0}", hex);
        }

        return hex;
    }

    string Decrypt(string hex)
    {
        Console.WriteLine("\nReceiving (decrypt side)...");
        Console.WriteLine("received hex: {0}", hex);
        string roundTrip = string.Empty;
        Console.WriteLine("Key " + key);
        using (AnotherAES aes = new AnotherAES(key))
        {
            //get bytes from url
            byte[] encryptedBytesWithIV = AnotherAES.StringToByteArray(hex);

            byte[] IV = encryptedBytesWithIV.Take(16).ToArray();

            Console.WriteLine("IV: {0}", System.Text.Encoding.Default.GetString(IV));

            byte[] cipher = encryptedBytesWithIV.Skip(16).ToArray();

            roundTrip = aes.Decrypt(cipher, IV);
        }
        return roundTrip;
    }
}

এখানে চিত্র বর্ণনা লিখুন


-2

আমি মনে করি এটি বিশ্বের সবচেয়ে সহজ!

string encrypted = "Text".Aggregate("", (c, a) => c + (char) (a + 2));

পরীক্ষা

 Console.WriteLine(("Hello").Aggregate("", (c, a) => c + (char) (a + 1)));
            //Output is Ifmmp
 Console.WriteLine(("Ifmmp").Aggregate("", (c, a) => c + (char)(a - 1)));
            //Output is Hello

রট ... 1? সত্যি? এমনকি তিনি কী করতে চান না তার একটি উদাহরণ হিসাবে ওপি এমনকি ROT13 বলেছিল ।
ব্যবহারকারী 812786
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.