জাভাতে স্ট্রিং কীভাবে এনক্রিপ্ট করা যায়


150

আমার যা দরকার তা হল স্ট্রিং এনক্রিপ্ট করা যা 2 ডি বারকোডে প্রদর্শিত হবে (পিডিএফ-417) সুতরাং যখন কেউ স্ক্যান করার জন্য ধারণা পেয়ে যায় তখন কিছুই পাঠযোগ্য হয় না।

অন্যান্য প্রয়োজনীয়তা:

  • জটিল হতে হবে না
  • এটিতে আরএসএ, পিকেআই অবকাঠামো, কী জোড়া ইত্যাদি থাকা উচিত নয়

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

সম্ভবত companies সংস্থাগুলি বিভিন্ন প্রযুক্তি ব্যবহার করতে পারে তাই কিছু স্ট্যান্ডার্ড যা কোনও বিশেষ প্ল্যাটফর্ম বা প্রযুক্তির সাথে আবদ্ধ নয় তার সাথে লেগে থাকা ভাল।

আপনি কি পরামর্শ দিচ্ছেন? কিছু জাভা করছেন ক্লাস হয় encrypt()& decrypt()উচ্চ নিরাপত্তা মান অর্জনের অনেক জটিলতা ছাড়া?



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

উত্তর:


156

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

এছাড়াও, নোট করুন যে প্রদত্ত পরিস্থিতির জন্য অনেকগুলি বাস্তবায়ন সুরক্ষিত হতে পারে তবে কেন সেগুলি ব্যবহার করুন এবং সম্ভবত ঘটনাক্রমে কোনও ভুল করবেন? আপনার কাছে উপলব্ধ শক্তিশালী সরঞ্জামগুলি ব্যবহার করুন যদি না আপনার কাছে নির্দিষ্ট কারণ না থাকে। সামগ্রিকভাবে আমি একটি গ্রন্থাগার ব্যবহার এবং আপনি যদি পারেন তবে কট্টর কৌতুকপূর্ণ বিবরণ থেকে দূরে থাকার পরামর্শ দিচ্ছি।

আপডেট 4/5/18: আমি জেসিপ্ট থেকে গুগলের নতুন লাইব্রেরি টিঙ্কে প্রস্তাবিত লাইব্রেরিটি বোঝার জন্য আরও সহজ করার জন্য কিছু অংশ পুনরায় লিখেছিলাম , আমি জ্যাসিপটিকে একটি বিদ্যমান সেটআপ থেকে সম্পূর্ণ অপসারণের পরামর্শ দেব ।

ভূমিকা

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

এখন আপনি যদি জাভাতে কীভাবে এনক্রিপ্ট করবেন সে বিষয়ে কট্টর কৌতুকপূর্ণ বিবরণ শিখতে চাইলে :)

ব্লক সাইফার্স

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

এখন আজ উপলভ্য ব্লক সাইফার অ্যালগরিদম সম্পর্কিত, কখনই নিশ্চিত হন না , আমি কখনই ডিইএস ব্যবহার করি না, এমনকি আমি এমনকি 3DES ব্যবহারের আগে কখনও বলব । এমনকি একমাত্র ব্লক সাইফার যা এমনকি স্নোডেনের এনএসএ রিলিজ সম্ভব হিসাবে সিউডো-র্যান্ডমের খুব কাছাকাছি থাকার বিষয়টি যাচাই করতে সক্ষম হয়েছিল এটি হচ্ছে এএস 256 । এছাড়াও রয়েছে এএস 128; পার্থক্যটি হ'ল এএস 256 256-বিট ব্লকে কাজ করে, যখন এএস 128 128 ব্লকে কাজ করে। সব মিলিয়ে, এইএস 128 কে নিরাপদ হিসাবে বিবেচনা করা হয় যদিও কিছু দুর্বলতাগুলি সনাক্ত করা হয়েছে, তবে 256 যত শক্তিশালী হয় ততই শক্ত।

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

এনক্রিপশন মোড

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

এখানে একটি এনক্রিপশন মোড এবং ইসিবি হিসাবে সর্বাধিক সহজ মোডের উদাহরণ রয়েছে যাতে আপনি কী ঘটছে তা দৃশ্যত বুঝতে পারবেন:

ইসিবি মোড

আপনি অনলাইনে সাধারণত যে এনক্রিপশন মোডগুলি দেখতে পাবেন তা নিম্নলিখিত:

ইসিবি সিটিআর, সিবিসি, জিসিএম

তালিকাভুক্তের বাইরে অন্যান্য মোড রয়েছে এবং গবেষকরা সর্বদা বিদ্যমান সমস্যাগুলি উন্নত করতে নতুন মোডের দিকে কাজ করছেন।

এখন আসুন বাস্তবায়নের দিকে এগিয়ে চলুন এবং কী নিরাপদ। ইসিবি কখনও ব্যবহার করবেন না এটি বিখ্যাত লিনাক্স পেঙ্গুইনের মতো পুনরাবৃত্তি তথ্য লুকিয়ে রাখা খারাপ ।লিনাক্স পেঙ্গুইনের উদাহরণ

জাভাতে প্রয়োগের সময়, নোট করুন যে আপনি নিম্নলিখিত কোডটি ব্যবহার করেন, ইসিবি মোড ডিফল্ট হিসাবে সেট করা আছে:

Cipher cipher = Cipher.getInstance("AES");

... বিপদটি এটি একটি অসামান্যতা! এবং দুর্ভাগ্যক্রমে, এটি স্ট্যাকওভারফ্লো জুড়ে এবং টিউটোরিয়াল এবং উদাহরণগুলিতে অনলাইনে দেখা যায়।

ননসেস এবং আইভি

ইসিবি মোডের সাথে পাওয়া ইস্যুটির জবাবে আইওএস হিসাবে পরিচিত এনওনস তৈরি হয়েছিল। ধারণাটি হ'ল আমরা একটি নতুন এলোমেলো ভেরিয়েবল তৈরি করি এবং এটি প্রতিটি এনক্রিপশনে সংযুক্ত করি যাতে আপনি দুটি বার্তা একই রকম এনক্রিপ্ট করার সময় সেগুলি আলাদা হয়। এর পিছনে সৌন্দর্য হ'ল চতুর্থ বা ননস হ'ল জনসাধারণের জ্ঞান। এর অর্থ একটি আক্রমণকারী এর এতে অ্যাক্সেস করতে পারে তবে যতক্ষণ না তাদের কাছে আপনার চাবি নেই, তারা সেই জ্ঞান দিয়ে কিছু করতে পারে না can

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

একটি এলোমেলো উত্পাদন করা হয় IV

SecureRandom randomSecureRandom = SecureRandom.getInstance("SHA1PRNG");
byte[] iv = new byte[cipher.getBlockSize()];
randomSecureRandom.nextBytes(iv);
IvParameterSpec ivParams = new IvParameterSpec(iv);

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

সিটিআর বাস্তবায়ন

সিটিআর মোডের জন্য কোনও প্যাডিংয়ের প্রয়োজন নেই।

 Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");

সিবিসি বাস্তবায়ন

আপনি যদি সিবিসি মোড বাস্তবায়ন করতে চান তবে পিকেসিএস 7 পেডিংয়ের সাহায্যে এটি করুন:

 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");

সিবিসি এবং সিটিআর দুর্বলতা এবং আপনার জিসিএম কেন ব্যবহার করা উচিত

যদিও অন্যান্য কিছু মোড যেমন সিবিসি এবং সিটিআর নিরাপদ তারা এটিকে চালিত করে যেখানে আক্রমণকারী এনক্রিপ্ট করা ডেটা ফ্লিপ করতে পারে এবং ডিক্রিপ্ট হওয়ার পরে এর মান পরিবর্তন করে। সুতরাং আসুন আমরা বলি আপনি একটি কল্পিত ব্যাঙ্ক বার্তা "সেল 100" এনক্রিপ্ট করেছেন, আপনার এনক্রিপ্ট করা বার্তাটি এই "eu23ng" দেখে মনে হচ্ছে আক্রমণকারী কিছুটা "eu53ng" তে পরিবর্তিত হয় এবং হঠাৎ আপনার বার্তাটি ডিক্রিপ্ট করার পরে এটি "বিক্রয় 900" হিসাবে পড়ে।

এটি এড়াতে বেশিরভাগ ইন্টারনেট জিসিএম ব্যবহার করে এবং আপনি যখনই এইচটিটিপিএস দেখেন তারা সম্ভবত জিসিএম ব্যবহার করছেন। জিসিএম এনক্রিপ্ট করা বার্তাকে হ্যাশ দিয়ে স্বাক্ষর করে এবং এই স্বাক্ষরটি ব্যবহার করে বার্তাটি পরিবর্তন করা হয়নি তা যাচাই করতে পরীক্ষা করে।

আমি জিসিএম এর জটিলতার কারণে বাস্তবায়ন এড়াতে চাই। আপনি গুগলসের নতুন লাইব্রেরি টিঙ্ক ব্যবহার করা ভাল, কারণ এখানে আবার যদি আপনি ঘটনাক্রমে কোনও আইভি পুনরায় করেন তবে আপনি জিসিএমের সাথে কীটির সাথে আপস করছেন, যা চূড়ান্ত সুরক্ষার ত্রুটি। নতুন গবেষকরা আইভি পুনরাবৃত্তি প্রতিরোধী এনক্রিপশন মোডের দিকে কাজ করছেন যেখানে আপনি চতুর্থ পুনরাবৃত্তি করলেও কী বিপদজনক নয় তবে এটি এখনও মূল ধারায় আসতে পারে নি।

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

Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");

কী বনাম পাসওয়ার্ড

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

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

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

অ্যান্ড্রয়েড বিকাশকারীরা

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

2013 থেকে একটি আকর্ষণীয় পাঠ্য : পয়েন্টগুলি দেখায় যে অ্যান্ড্রয়েডে ক্রিপ্টোর 88% বাস্তবায়ন ভুলভাবে করা হয়েছিল।

সর্বশেষ ভাবনা

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

আপনার যদি কোন প্রশ্ন বা মতামত থাকে তবে নির্দ্বিধায় মন্তব্য করুন! সুরক্ষা সর্বদা পরিবর্তিত হয় এবং এটি চালিয়ে যাওয়ার জন্য আপনার যথাসাধ্য চেষ্টা করা প্রয়োজন :)


15
এটি আমি দেখতে সবচেয়ে পরিষ্কার জিনিস।
সেরাফ

1
@ সাবিরখান এটি উদ্বেগের কারণ হতে পারে তবে মূল অ্যালগরিদমগুলি এখনও ভাঙা হয়নি তাই আমি সে সম্পর্কে খুব বেশি চিন্তিত হব না। আপনি যেখানে বিশ্বাস করেন না সে ক্ষেত্রে github.com/google/keyczar দেখুন , এটি গুগলস সুরক্ষা দল দ্বারা বিকাশ করা হয়েছিল।
কনস্ট্যান্টিনো স্পারাকিস

1
@KonstantinoSparakis: আমি Jasypt এর BasicTextEncryptor এবং StrongTextEncryptor ডকুমেন্টেশন ভুল ব্যাখ্যা না করে থাকেন, সেই শ্রেণীর ব্যবহার DES এবং 3DES এনক্রিপ্ট, যা ঠিক কি আপনি ব্যবহার করতে না পাঠকদের জানান জন্য। আইএমও আপনার দেওয়া কোড উদাহরণগুলির সাথে জেসিপ্টের স্ট্যান্ডার্ড পিবিএসটিআরইংক্রিপটরটি ব্যবহার করে এবং কোনও AES অ্যালগরিদম ম্যানুয়ালি ব্যবহারের জন্য সংজ্ঞায়িত করে should
xpages-noob

1
@ xpages-noob আমি পোস্টটি আপডেট করেছি। আমি আসলে গুগল টিঙ্ককে পেয়েছি, যা ক্রিপ্টোর জন্য সর্বাধিক নতুন সমর্থিত গ্রন্থাগার তাই আপনার এটি পরীক্ষা করা উচিত!
কনস্টান্টিনো স্পারাকিস

2
এইএস ব্লকের আকার 128 বিট। এইএস 256-তে, মূল আকারটি 256 বিট। অনুরূপভাবে, হবে AES 192 এবং AES 128. এছাড়াও, জাভা 8 সাল থেকে getInstanceStrong()পদ্ধতি CipherSHA1PRNG উপর preferrable হয়
সপ্তর্ষি বসু

110

আমি এমন কিছু স্ট্যান্ডার্ড প্রতিসম সাইফার ব্যবহার করার পরামর্শ দেব যা DES , 3DES বা AES এর মতো ব্যাপকভাবে উপলভ্য । যদিও এটি সর্বাধিক সুরক্ষিত অ্যালগরিদম নয়, বাস্তবায়নগুলি প্রচুর পরিমাণে রয়েছে এবং আপনার যে কারও কাছে বারকোডের তথ্য ডিক্রিপ্ট করার কথা রয়েছে তার জন্য আপনাকে কীটি দিতে হবে। javax.crypto.Cipher আপনি এখানে কাজ করতে চান কি।

ধরা যাক এনক্রিপ্ট করার জন্য বাইটগুলি রয়েছে

byte[] input;

এর পরে, আপনার কী এবং প্রারম্ভিক ভেক্টর বাইটগুলি দরকার

byte[] keyBytes;
byte[] ivBytes;

আপনি যে অ্যালগরিদমটি নির্বাচন করেছেন তার জন্য আপনি সিফারটি শুরু করতে পারেন:

// wrap key data in Key/IV specs to pass to cipher
SecretKeySpec key = new SecretKeySpec(keyBytes, "DES");
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
// create the cipher with the algorithm you choose
// see javadoc for Cipher class for more info, e.g.
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");

এনক্রিপশনটি এরকম হবে:

cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
byte[] encrypted= new byte[cipher.getOutputSize(input.length)];
int enc_len = cipher.update(input, 0, input.length, encrypted, 0);
enc_len += cipher.doFinal(encrypted, enc_len);

এবং এর মতো ডিক্রিপশন:

cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);
byte[] decrypted = new byte[cipher.getOutputSize(enc_len)];
int dec_len = cipher.update(encrypted, 0, enc_len, decrypted, 0);
dec_len += cipher.doFinal(decrypted, dec_len);

9
DESedeঅ্যালগরিদম রেফারেন্স করার জন্য আমি কি এই উদাহরণটি আপডেট করার পরামর্শ দিতে পারি ? যেহেতু এটি একটি জনপ্রিয় প্রশ্ন (এবং উত্তর), তাই লোকেরা ডিইএস ব্যবহার করতে উত্সাহিত করা লজ্জার বিষয় হবে, যেহেতু আজকের মানদণ্ডে সাইফার এতটাই দুর্বল।
ডানকান জোন্স

javax.crypto.BadPaddingException সঙ্গে কিছু ভুল: চূড়ান্ত ব্লক দেওয়া সঠিকভাবে padded না যখন decript
curiousity

2
: @Duncan প্রকৃতপক্ষে DES দুর্বল কিন্তু আমি অনুমান হবে AES DESede উপর বাঞ্ছনীয় হবে (TipleDES ওরফে) http://security.stackexchange.com/a/26181/69785
Piovezan

2
এটিএস / জিসিএম / নোপ্যাডিংয়ের জন্য আপডেট করা উচিত, ডিইএস নিষ্ঠুর আক্রমণে ঝুঁকিপূর্ণ, ট্রিপলডিসেরও প্রস্তাব দেওয়া হয় না
কনস্ট্যান্টিনো স্পারাকিস

1
নীচে কনস্ট্যান্টিনো স্পারাকিসের উত্তরটি এর চেয়ে অনেক ভাল is
স্টিভ

22

সতর্কতা

এটি কোনও ধরণের সুরক্ষা পরিমাপ হিসাবে ব্যবহার করবেন না।

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

মোছা দ্বারা প্রেরিত


আমি সান এর বেস 64 এএনকোডার / ডিকোডার ব্যবহার করছি যা সান এর জেআরই তে পাওয়া যাবে, অন্য কোনও জেআর এড়িয়ে চলার জন্য। ওপেনজেডিকে বা অন্য কোনও জেআরই ব্যবহারের দিক থেকে এটি বিপজ্জনক। তদ্ব্যতীত, এনকোডার / ডিকোডারের সাথে অ্যাপাচি কমন্স লাইব ব্যবহার করার জন্য আমার অন্য কোনও কারণ বিবেচনা করা উচিত?

public class EncryptUtils {
    public static final String DEFAULT_ENCODING = "UTF-8"; 
    static BASE64Encoder enc = new BASE64Encoder();
    static BASE64Decoder dec = new BASE64Decoder();

    public static String base64encode(String text) {
        try {
            return enc.encode(text.getBytes(DEFAULT_ENCODING));
        } catch (UnsupportedEncodingException e) {
            return null;
        }
    }//base64encode

    public static String base64decode(String text) {
        try {
            return new String(dec.decodeBuffer(text), DEFAULT_ENCODING);
        } catch (IOException e) {
            return null;
        }
    }//base64decode

    public static void main(String[] args) {
        String txt = "some text to be encrypted";
        String key = "key phrase used for XOR-ing";
        System.out.println(txt + " XOR-ed to: " + (txt = xorMessage(txt, key)));

        String encoded = base64encode(txt);       
        System.out.println(" is encoded to: " + encoded + " and that is decoding to: " + (txt = base64decode(encoded)));
        System.out.print("XOR-ing back to original: " + xorMessage(txt, key));
    }

    public static String xorMessage(String message, String key) {
        try {
            if (message == null || key == null) return null;

            char[] keys = key.toCharArray();
            char[] mesg = message.toCharArray();

            int ml = mesg.length;
            int kl = keys.length;
            char[] newmsg = new char[ml];

            for (int i = 0; i < ml; i++) {
                newmsg[i] = (char)(mesg[i] ^ keys[i % kl]);
            }//for i

            return new String(newmsg);
        } catch (Exception e) {
            return null;
        }
    }//xorMessage
}//class

1
আমি এই সমাধান প্রস্তাবটি sun.misc.BASE64E এনকোডার এর মাধ্যমেও ব্যবহার করেছি তবে এনকোড করার পরিবর্তে বড় বড় স্ট্রিংগুলি ব্যবহার করার সময় এনকোডারটি ছিঁড়ে যাওয়া স্ট্রিংগুলি (প্রতিটি 76 টি অক্ষর) ফিরে পেয়েছিল। আমি তখন অ্যাপাচি কমন্স কোডেক বেস 64 এ স্যুইচ করেছি যা নন-চুনকিং এনকোডিং পদ্ধতি সরবরাহ করে!
বাসজিরো

78
আপনি বর্ণিত এনক্রিপশন প্রক্রিয়াটি একাধিকবার ব্যবহার করা হলে খুব বিপজ্জনক। এ কারণেই এটিকে ওয়ান-টাইম প্যাড বলা হয়। আক্রমণকারী দ্বারা 2 টি এনক্রিপ্ট করা বার্তা ব্যবহার করে গোপন কীটি সহজেই পুনরুদ্ধার করা যায়। xor 2 এনক্রিপ্ট করা বার্তা এবং আপনি কীটি পান। এটা সহজ!
xtrem

3
এর ধারণাটি ভারী হওয়া নয়, পিডিএফ -১১7 ২ ডি বারকোডে যা লেখা আছে তা পড়ার চেষ্টা থেকে মানুষকে বাউস করে দেওয়া। যাইহোক, কেবলমাত্র কিছু সূচি কারও পক্ষে গুরুত্বপূর্ণ নয় ...
ante.sabo

2
ঠিক আছে. কেউ উদ্বিগ্ন যে এটিকে একটি এনক্রিপশন প্রক্রিয়া হিসাবে ব্যবহার করে।
xtrem

এনক্রিপশনের জন্য, এনকোডার (উদা।
জাগ্রত ডালওয়াদি

13

ধন্যবাদ ive আপনার কোডটি ব্যবহার করে এই শ্রেণিটি তৈরি করেছে সম্ভবত কেউ এটির ব্যবহারকারীর মতো দেখতে পেয়েছে

অবজেক্ট ক্রিপ্টার

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.ShortBufferException;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;


public class ObjectCrypter {

private Cipher deCipher;
private Cipher enCipher;
private SecretKeySpec key;
private IvParameterSpec ivSpec;


public ObjectCrypter(byte[] keyBytes,   byte[] ivBytes) {
    // wrap key data in Key/IV specs to pass to cipher


     ivSpec = new IvParameterSpec(ivBytes);
    // create the cipher with the algorithm you choose
    // see javadoc for Cipher class for more info, e.g.
    try {
         DESKeySpec dkey = new  DESKeySpec(keyBytes);
          key = new SecretKeySpec(dkey.getKey(), "DES");
         deCipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
         enCipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
    } catch (NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NoSuchPaddingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InvalidKeyException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
public byte[] encrypt(Object obj) throws InvalidKeyException, InvalidAlgorithmParameterException, IOException, IllegalBlockSizeException, ShortBufferException, BadPaddingException {
    byte[] input = convertToByteArray(obj);
    enCipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);

    return enCipher.doFinal(input);




//  cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
//  byte[] encypted = new byte[cipher.getOutputSize(input.length)];
//  int enc_len = cipher.update(input, 0, input.length, encypted, 0);
//  enc_len += cipher.doFinal(encypted, enc_len);
//  return encypted;


}
public Object decrypt( byte[]  encrypted) throws InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, IOException, ClassNotFoundException {
    deCipher.init(Cipher.DECRYPT_MODE, key, ivSpec);

    return convertFromByteArray(deCipher.doFinal(encrypted));

}



private Object convertFromByteArray(byte[] byteObject) throws IOException,
        ClassNotFoundException {
    ByteArrayInputStream bais;

    ObjectInputStream in;
    bais = new ByteArrayInputStream(byteObject);
    in = new ObjectInputStream(bais);
    Object o = in.readObject();
    in.close();
    return o;

}



private byte[] convertToByteArray(Object complexObject) throws IOException {
    ByteArrayOutputStream baos;

    ObjectOutputStream out;

    baos = new ByteArrayOutputStream();

    out = new ObjectOutputStream(baos);

    out.writeObject(complexObject);

    out.close();

    return baos.toByteArray();

}


}

এখানে একটি সম্পর্কিত প্রশ্ন পোস্ট !
ব্যবহারকারী 2023507

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

6

12-ডিসি -2018 এ আপডেট

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

চতুর্থ হিসাবে সিক্যুয়েন্স বা টাইমস্ট্যাম্প ব্যবহার করাও সম্ভব তবে এটি যতটা তুচ্ছ তত শব্দ ততটা তুচ্ছ হতে পারে না। উদাহরণস্বরূপ, যদি সিস্টেমটি একটি ধ্রুবক স্টোরে IV হিসাবে ইতিমধ্যে ব্যবহৃত ক্রমগুলি সঠিকভাবে না রাখে, একটি অনুরোধ সিস্টেম পুনরায় বুটের পরে IV পুনরাবৃত্তি করতে পারে। তেমনি, কোনও নিখুঁত ঘড়ি নেই। কম্পিউটার ক্লক রিডজাস্ট ইত্যাদি

এছাড়াও, প্রতি 2 ^ 32 নিমন্ত্রণের পরে কীটি ঘোরানো উচিত। চতুর্থ প্রয়োজনীয়তার বিষয়ে আরও তথ্যের জন্য, এই উত্তরটি এবং এনআইএসটি সুপারিশগুলি দেখুন


এই এনক্রিপশন এবং ডিক্রিপশন কোডটি আমি নীচের বিষয়গুলি বিবেচনা করে জাভা 8 তে লিখেছি wrote আশা করি যে কেউ এই দরকারী পাবেন:

  1. এনক্রিপশন অ্যালগরিদম : 256 বিট কী সহ ব্লক সিফার এইএসকে যথেষ্ট নিরাপদ বলে মনে করা হয়। একটি সম্পূর্ণ বার্তা এনক্রিপ্ট করতে একটি মোড নির্বাচন করা দরকার needs প্রমাণীকৃত এনক্রিপশন (যা উভয় গোপনীয়তা এবং অখণ্ডতা সরবরাহ করে) প্রস্তাবিত। GCM, সিসিএম এবং EAX সর্বাধিক ব্যবহৃত প্রমাণীকৃত এনক্রিপশন মোড। জিসিএম সাধারণত পছন্দসই হয় এবং এটি ইন্টেল আর্কিটেকচারগুলিতে ভাল সম্পাদন করে যা জিসিএমের জন্য নিবেদিত নির্দেশনা সরবরাহ করে। এই তিনটি মোডই সিটিআর-ভিত্তিক (কাউন্টার-ভিত্তিক) মোড এবং তাই তাদের প্যাডিংয়ের দরকার নেই। ফলস্বরূপ তারা প্যাডিং সম্পর্কিত আক্রমণগুলিতে ঝুঁকিপূর্ণ নয়

  2. জিসিএমের জন্য একটি প্রাথমিককরণ ভেক্টর (আইভি) প্রয়োজন। চতুর্থটি কোনও গোপন বিষয় নয়। এটির প্রয়োজন কেবলমাত্র এলোমেলো বা অনাকাঙ্ক্ষিত হতে পারে। জাভাতে,SecuredRandom ক্লাসটি বোঝানো হয়েছে ক্রিপ্টোগ্রাফিকভাবে শক্তিশালী সিউডো এলোমেলো সংখ্যা তৈরি করা। সিউডো-এলোমেলো সংখ্যা জেনারেশন অ্যালগরিদম getInstance()পদ্ধতিতে নির্দিষ্ট করা যেতে পারে । তবে জাভা 8-এর পর থেকে, প্রস্তাবিত উপায়টি হ'ল getInstanceStrong()পদ্ধতিটি ব্যবহার করা হবে যা কনফিগার করা এবং সরবরাহ করা শক্তিশালী অ্যালগরিদম ব্যবহার করবেProvider

  3. এনআইএসটি আন্তঃব্যবহারযোগ্যতা, দক্ষতা এবং ডিজাইনের সরলতার প্রচার করতে জিসিএমের জন্য 96 বিট চতুর্থের প্রস্তাব দেয়

  4. নিম্নলিখিত প্রয়োগে অতিরিক্ত সুরক্ষা নিশ্চিত করতে SecureRandom 2 টি সিউডো র্যান্ডম বাইট জেনারেশনের প্রতি 2 ^ 16 বাইট উত্পাদনের পরে পুনরায় বীজ দেওয়া হয়

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

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

  7. কোনও সুপারিশকারী সাধারণ সুপারিশ অনুসরণ করে কোডগুলিতে হার্ড কোডড হয় না

  8. অবশেষে নেটওয়ার্ক বা স্টোরেজ ট্রান্সমিশনের জন্য, বেস 64 টি এনকোডিং ব্যবহার করে কী বা সিফার পাঠ্য এনকোড করা উচিত। বেস 64 এর বিশদ এখানে পাওয়া যাবে । জাভা 8 পদ্ধতির অনুসরণ করা উচিত

বাইট অ্যারে ব্যবহার করে সাফ করা যেতে পারে:

Arrays.fill(clearTextMessageByteArray, Byte.MIN_VALUE);

যাইহোক, জাভা 8 হিসাবে, পরিষ্কার করার সহজ কোনও উপায় নেই SecretKeyspecএবং SecretKeyএই দুটি ইন্টারফেসের প্রয়োগগুলি destroy()ইন্টারফেসের পদ্ধতিটি কার্যকর করেছে বলে মনে হয় না Destroyable। নিম্নলিখিত কোড, একটি পৃথক পদ্ধতি পরিষ্কার লেখা আছে SecretKeySpecএবংSecretKey প্রতিফলন ব্যবহার করে।

নীচে উল্লিখিত দুটি পদ্ধতির মধ্যে একটি ব্যবহার করে কী তৈরি করা উচিত।

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

package com.sapbasu.javastudy;

import java.lang.reflect.Field;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.Optional;

import javax.crypto.Cipher;
import javax.crypto.spec.GCMParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class Crypto {

  private static final int AUTH_TAG_SIZE = 128; // bits

  // NIST recommendation: "For IVs, it is recommended that implementations
  // restrict support to the length of 96 bits, to
  // promote interoperability, efficiency, and simplicity of design."
  private static final int IV_LEN = 12; // bytes

  // number of random number bytes generated before re-seeding
  private static final double PRNG_RESEED_INTERVAL = Math.pow(2, 16);

  private static final String ENCRYPT_ALGO = "AES/GCM/NoPadding";

  private static final List<Integer> ALLOWED_KEY_SIZES = Arrays
      .asList(new Integer[] {128, 192, 256}); // bits

  private static SecureRandom prng;

  // Used to keep track of random number bytes generated by PRNG
  // (for the purpose of re-seeding)
  private static int bytesGenerated = 0;

  public byte[] encrypt(byte[] input, SecretKeySpec key) throws Exception {

    Objects.requireNonNull(input, "Input message cannot be null");
    Objects.requireNonNull(key, "key cannot be null");

    if (input.length == 0) {
      throw new IllegalArgumentException("Length of message cannot be 0");
    }

    if (!ALLOWED_KEY_SIZES.contains(key.getEncoded().length * 8)) {
      throw new IllegalArgumentException("Size of key must be 128, 192 or 256");
    }

    Cipher cipher = Cipher.getInstance(ENCRYPT_ALGO);

    byte[] iv = getIV(IV_LEN);

    GCMParameterSpec gcmParamSpec = new GCMParameterSpec(AUTH_TAG_SIZE, iv);

    cipher.init(Cipher.ENCRYPT_MODE, key, gcmParamSpec);
    byte[] messageCipher = cipher.doFinal(input);

    // Prepend the IV with the message cipher
    byte[] cipherText = new byte[messageCipher.length + IV_LEN];
    System.arraycopy(iv, 0, cipherText, 0, IV_LEN);
    System.arraycopy(messageCipher, 0, cipherText, IV_LEN,
        messageCipher.length);
    return cipherText;
  }

  public byte[] decrypt(byte[] input, SecretKeySpec key) throws Exception {
    Objects.requireNonNull(input, "Input message cannot be null");
    Objects.requireNonNull(key, "key cannot be null");

    if (input.length == 0) {
      throw new IllegalArgumentException("Input array cannot be empty");
    }

    byte[] iv = new byte[IV_LEN];
    System.arraycopy(input, 0, iv, 0, IV_LEN);

    byte[] messageCipher = new byte[input.length - IV_LEN];
    System.arraycopy(input, IV_LEN, messageCipher, 0, input.length - IV_LEN);

    GCMParameterSpec gcmParamSpec = new GCMParameterSpec(AUTH_TAG_SIZE, iv);

    Cipher cipher = Cipher.getInstance(ENCRYPT_ALGO);
    cipher.init(Cipher.DECRYPT_MODE, key, gcmParamSpec);

    return cipher.doFinal(messageCipher);
  }

  public byte[] getIV(int bytesNum) {

    if (bytesNum < 1) throw new IllegalArgumentException(
        "Number of bytes must be greater than 0");

    byte[] iv = new byte[bytesNum];

    prng = Optional.ofNullable(prng).orElseGet(() -> {
      try {
        prng = SecureRandom.getInstanceStrong();
      } catch (NoSuchAlgorithmException e) {
        throw new RuntimeException("Wrong algorithm name", e);
      }
      return prng;
    });

    if (bytesGenerated > PRNG_RESEED_INTERVAL || bytesGenerated == 0) {
      prng.setSeed(prng.generateSeed(bytesNum));
      bytesGenerated = 0;
    }

    prng.nextBytes(iv);
    bytesGenerated = bytesGenerated + bytesNum;

    return iv;
  }

  private static void clearSecret(Destroyable key)
      throws IllegalArgumentException, IllegalAccessException,
      NoSuchFieldException, SecurityException {
    Field keyField = key.getClass().getDeclaredField("key");
    keyField.setAccessible(true);
    byte[] encodedKey = (byte[]) keyField.get(key);
    Arrays.fill(encodedKey, Byte.MIN_VALUE);
  }
}

এনক্রিপশন কীটি প্রাথমিকভাবে দুটি উপায়ে উত্পন্ন করা যেতে পারে:

  • কোনও পাসওয়ার্ড ছাড়াই

    KeyGenerator keyGen = KeyGenerator.getInstance("AES");
    keyGen.init(KEY_LEN, SecureRandom.getInstanceStrong());
    SecretKey secretKey = keyGen.generateKey();
    SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getEncoded(),
        "AES");
    Crypto.clearSecret(secretKey);
    // After encryption or decryption with key
    Crypto.clearSecret(secretKeySpec);
  • পাসওয়ার্ড সহ

    SecureRandom random = SecureRandom.getInstanceStrong();
    byte[] salt = new byte[32];
    random.nextBytes(salt);
    PBEKeySpec keySpec = new PBEKeySpec(password, salt, iterations, 
       keyLength);
    SecretKeyFactory keyFactory = 
        SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
    SecretKey secretKey = keyFactory.generateSecret(keySpec);
    SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getEncoded(),
        "AES");
    Crypto.clearSecret(secretKey);
    // After encryption or decryption with key
    Crypto.clearSecret(secretKeySpec);

মন্তব্য উপর ভিত্তি করে আপডেট

@ মার্টেনবোডওয়েস দ্বারা চিহ্নিত হিসাবে, আমার উত্তর Stringপ্রশ্নের প্রয়োজন অনুযায়ী কোনও হ্যান্ডেল করে না। অতএব, আমি এই ফাঁকটি পূরণ করার চেষ্টা করব ঠিক তখনই যদি কেউ এই উত্তরটিতে হোঁচট খায় এবং সামলানোর বিষয়ে ভাবছেন leavesString

উত্তরে যেমন ইঙ্গিত করা হয়েছে String, সাধারণভাবে সংবেদনশীল তথ্য হ্যান্ডলিং করা ভাল ধারণা নয় কারণ Stringঅপরিবর্তনীয় এবং সুতরাং আমরা ব্যবহারের পরে এটিকে সাফ করতে পারি না। এবং যেমনটি আমরা জানি, এমনকি যখন Stringকারও কাছে শক্তিশালী রেফারেন্স না থাকে, আবর্জনা সংগ্রহকারী তাৎক্ষণিকভাবে এটি গাদা থেকে সরাতে ছুটে যায় না। সুতরাং, Stringপ্রোগ্রামটির অ্যাক্সেসযোগ্য না হওয়া সত্ত্বেও সময়ের অজানা উইন্ডোটির জন্য স্মৃতিচারণ প্রায় অবিরত থাকে। সমস্যাটি হ'ল, সেই সময় ফ্রেমের সময় একটি হিপ ডাম্প সংবেদনশীল তথ্য প্রকাশ করবে। সুতরাং, বাইট অ্যারে বা চর অ্যারেতে সমস্ত সংবেদনশীল তথ্য হ্যান্ডেল করা ভাল এবং তার উদ্দেশ্যটি সম্পাদিত হয়ে গেলে 0s দিয়ে অ্যারে পূরণ করুন।

যাইহোক, সমস্ত জ্ঞানের সাথে, যদি আমরা এখনও এমন পরিস্থিতিতে শেষ করি যেখানে সংবেদনশীল তথ্য এনক্রিপ্ট করা উচিত String, তবে আমাদের প্রথমে এটি একটি বাইট অ্যারেতে রূপান্তর করা এবং উপরে বর্ণিত encryptএবং decryptফাংশনগুলি অনুরোধ করা উচিত। (উপরে প্রদত্ত কোড স্নিপেট ব্যবহার করে অন্যান্য ইনপুট কী তৈরি করা যেতে পারে)।

একজন Stringনিম্নলিখিত পদ্ধতিতে বাইট রূপান্তরিত করা যেতে পারে:

byte[] inputBytes = inputString.getBytes(StandardCharsets.UTF_8);

জাভা 8 হিসাবে, Stringঅভ্যন্তরীণভাবে UTF-16এনকোডিং সহ হিপে সংরক্ষণ করা হয় । তবে, আমরা UTF-8সাধারণত এখানে UTF-16ASCII অক্ষরের চেয়ে কম জায়গা লাগে বলে এখানে ব্যবহার করেছি ।

তেমনি, এনক্রিপ্ট করা বাইট অ্যারেও নীচে হিসাবে একটি স্ট্রিং রূপান্তর করা যেতে পারে:

String encryptedString = new String(encryptedBytes, StandardCharsets.UTF_8);

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

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

5

এটি সম্পর্কে:

private static byte[] xor(final byte[] input, final byte[] secret) {
    final byte[] output = new byte[input.length];
    if (secret.length == 0) {
        throw new IllegalArgumentException("empty security key");
    }
    int spos = 0;
    for (int pos = 0; pos < input.length; ++pos) {
        output[pos] = (byte) (input[pos] ^ secret[spos]);
        ++spos;
        if (spos >= secret.length) {
            spos = 0;
        }
    }
    return output;
}

আমার জন্য ভাল কাজ করে এবং কমপ্যাক্ট।


এন্ট্রি পরামিতি গোপন == নাল বা ইনপুট == নাল হলে কী হবে? তারপরে তারপরে স্ট্রিং দিয়ে বাইট দিয়ে কাজ করা ঠিক আছে, তবে আমার ক্ষেত্রে এটি অপ্রাসঙ্গিক ছিল .. কেবলমাত্র বিষয়টি হ'ল এটি অবশ্যই কোনও ডিভাইসের সাথে পাঠযোগ্য এবং ডিকোডেবল হতে হবে, যে কোনও চরিত্রের এনকোডিং সম্ভব ...
ante.sabo

@ ante.sabo স্পষ্টতই, এটি একটি এনপিই ফেলবে। এটিই NUL গুলি করার একমাত্র জিনিস।
মিহা_এক্স 64

যতক্ষণ ধরে input.length <= secret.lengthরাখা হয় এবং কখনই secretপুনরায় ব্যবহৃত হয় না এটি নিরাপদ এবং এটিকে বলা হয় one-time-pad। এর ক্ষেত্রে ভিজেনের সাইফারেরinput.length > secret.length একটি রূপ এবং এটি খুব দুর্বল বলে মনে করা হয়।
ট্রাইচনার

5

আপনি জ্যাসিপ ব্যবহার করতে পারেন

জ্যাসিপ্টের সাহায্যে এনক্রিপ্ট করা এবং একটি পাসওয়ার্ড পরীক্ষা করা যতটা সহজ ...

StrongTextEncryptor textEncryptor = new StrongTextEncryptor();
textEncryptor.setPassword(myEncryptionPassword);

জোড়া লাগানো:

String myEncryptedText = textEncryptor.encrypt(myText);

ডিক্রিপশন:

String plainText = textEncryptor.decrypt(myEncryptedText);

Gradle:

compile group: 'org.jasypt', name: 'jasypt', version: '1.9.2'

বৈশিষ্ট্য:

জ্যাসিপ্ট আপনাকে সহজ একমুখী (ডাইজেস্ট) এবং দ্বি নির্দেশমূলক এনক্রিপশন কৌশল সরবরাহ করে।

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

আপনার ব্যবহারকারীর পাসওয়ার্ডগুলির জন্য উচ্চ সুরক্ষা। আরও জানুন।

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

সংখ্যা এনক্রিপশন সমর্থন। পাঠ্য এবং বাইনারিগুলির পাশাপাশি, এটি সংখ্যার মানগুলি হজম এবং এনক্রিপশনকে অনুমতি দেয় (হাইবারনেট অধ্যবসায়ের জন্য এনক্রিপ্ট করার সময় অন্যান্য সংখ্যার প্রকারগুলি সমর্থিত হয়) Big আরও জানুন।

সম্পূর্ণ থ্রেড-নিরাপদ।

মাল্টি-প্রসেসর / মাল্টি-কোর সিস্টেমে উচ্চ কার্যকারিতা অর্জনের জন্য এনক্রিপটর / ডাইজেস্টর পুলিংয়ের জন্য সমর্থন।

মোবাইল প্ল্যাটফর্মের মতো আকার-সীমাবদ্ধ পরিবেশে আরও ভাল পরিচালনার জন্য গ্রন্থাগারের একটি লাইটওয়েট ("লাইট") সংস্করণ অন্তর্ভুক্ত।

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

এনক্রিপ্ট করা পদ্ধতিতে আপনার ম্যাপযুক্ত সত্তাগুলির ক্ষেত্র অব্যাহত রাখতে হাইবারনেট 3 এবং 4 andচ্ছিক সংহতকরণ হাইবারনেট ম্যাপিং ফাইলগুলিতে ক্ষেত্রগুলির এনক্রিপশনকে সংজ্ঞায়িত করা হয় এবং এটি বাকী অ্যাপ্লিকেশনের জন্য স্বচ্ছ থাকে (সংবেদনশীল ব্যক্তিগত ডেটা, অনেকগুলি পঠন-সক্ষম ব্যবহারকারীদের সাথে ডাটাবেসগুলির জন্য দরকারী ...)। পাঠ্য, বাইনারি, সংখ্যা, বুলিয়ানস, তারিখগুলি এনক্রিপ্ট করুন ... আরও জানুন।

স্প্রিং 2, স্প্রিং 3.0 এবং স্প্রিং 3.1 এর সুনির্দিষ্ট একীকরণ বৈশিষ্ট্য সহ একরকম বসন্ত অ্যাপ্লিকেশনটিতে সংহত করে। জ্যাসিপ্টে থাকা সমস্ত হজমকারী এবং এনক্রিপটরগুলি বসন্ত থেকে সহজেই ব্যবহারের জন্য (তাত্ক্ষণিক, নির্ভরতা-ইনজেকশন ...) ডিজাইন করা হয়েছে। এবং, তাদের থ্রেড-নিরাপদ হওয়ার কারণে, তারা স্প্রিংয়ের মতো একক-ওরিয়েন্টেড পরিবেশে সিঙ্ক্রোনাইজেশন উদ্বেগ ছাড়াই ব্যবহার করতে পারে। আরও জানুন: স্প্রিং 2, স্প্রিং 3.0, স্প্রিং 3.1।

সুরক্ষা কাঠামোর জন্য পাসওয়ার্ড এনক্রিপশন সম্পাদন এবং কার্যকারিতা মিলে যাওয়ার জন্য নিরাপদ পাসওয়ার্ড এনক্রিপশন পদ্ধতি ব্যবহার করে এবং আপনার কনফিগারেশন এবং নিয়ন্ত্রণের উচ্চতর ডিগ্রি সরবরাহ করে আপনার ব্যবহারকারীর পাসওয়ার্ডগুলির সুরক্ষা উন্নত করার জন্য স্প্রিং সিকিউরিটি (পূর্বে এসিগি সুরক্ষা) alচ্ছিক সংহতকরণ integ আরও জানুন।

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

বিকাশকারীদের তাদের এনক্রিপ্ট করা ডেটা সূচনা করতে এবং রক্ষণাবেক্ষণের কার্যগুলিতে বা স্ক্রিপ্টগুলিতে এনক্রিপশন / ডিক্রিপশন / ডাইজেস্ট ক্রিয়াকলাপ অন্তর্ভুক্ত করার জন্য সি এল এল (কমান্ড লাইন ইন্টারফেস) সরঞ্জামগুলি সহজেই সরবরাহ করে। আরও জানুন।

আপনার সুরক্ষিত অ্যাপ্লিকেশনগুলিতে আরও বেশি শক্তিশালী এনক্রিপশনের জন্য অ্যাপাচি উইকেটে একীভূত হয়।

বিকাশকারীদের তাদের ডেটাতে কী করছে তা আরও ভালভাবে বুঝতে দেওয়ার জন্য বিস্তৃত গাইড এবং জাভাদোক ডকুমেন্টেশন।

মূল চরসেটটি যাহা হ'ল পাঠ্য পর্যাপ্ত এনক্রিপ্ট এবং ডাইজেস্ট করার জন্য ডিজাইন করা শক্তিশালী চারসেট সমর্থন। কোনও এনকোডিং বা প্ল্যাটফর্ম সমস্যা না করে জাপানি, কোরিয়ান, আরবি ... এর মতো ভাষার সম্পূর্ণ সমর্থন।

কনফিগারেশন ক্ষমতাগুলির খুব উচ্চ স্তরের: বিকাশকারী কোনও এনক্রিপটরকে জিজ্ঞাসা করার জন্য নির্দেশ দেওয়ার মতো কৌশল প্রয়োগ করতে পারে, উদাহরণস্বরূপ, এনক্রিপশনের জন্য পাসওয়ার্ডটির জন্য পাসওয়ার্ডের জন্য দূরবর্তী এইচটিটিপিএস সার্ভার। এটি আপনাকে আপনার সুরক্ষার প্রয়োজনগুলি পূরণ করতে দেয়।


1
তবে কী সুরক্ষা সরবরাহ করে Jasypt? আমি তাদের ওয়েবসাইট থেকে এটি বের করতে পারি না। এটি কি নির্বাচিত-প্লেইস্টেক্সট আক্রমণের অধীনে আলাদা করা যায়? অখণ্ডতা? গোপনীয়তা?
ট্রাইচনার

4

বসন্ত সিঙ্গলটন হিসাবে meta64.com থেকে আমার বাস্তবায়ন এখানে। আপনি যদি প্রতিটি কলের জন্য একটি সিপার উদাহরণ তৈরি করতে চান যা এটিও কার্যকর হবে এবং তারপরে আপনি 'সিঙ্ক্রোনাইজড' কলগুলি সরিয়ে ফেলতে পারেন তবে সাবধান থাকুন 'সিফার' থ্রেড-সেফ নয়।

import java.security.Key;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component
@Scope("singleton")
public class Encryptor {

    @Value("${aeskey}")
    private String keyStr;

    private Key aesKey = null;
    private Cipher cipher = null;

    synchronized private void init() throws Exception {
        if (keyStr == null || keyStr.length() != 16) {
            throw new Exception("bad aes key configured");
        }
        if (aesKey == null) {
            aesKey = new SecretKeySpec(keyStr.getBytes(), "AES");
            cipher = Cipher.getInstance("AES");
        }
    }

    synchronized public String encrypt(String text) throws Exception {
        init();
        cipher.init(Cipher.ENCRYPT_MODE, aesKey);
        return toHexString(cipher.doFinal(text.getBytes()));
    }

    synchronized public String decrypt(String text) throws Exception {
        init();
        cipher.init(Cipher.DECRYPT_MODE, aesKey);
        return new String(cipher.doFinal(toByteArray(text)));
    }

    public static String toHexString(byte[] array) {
        return DatatypeConverter.printHexBinary(array);
    }

    public static byte[] toByteArray(String s) {
        return DatatypeConverter.parseHexBinary(s);
    }

    /*
     * DO NOT DELETE
     * 
     * Use this commented code if you don't like using DatatypeConverter dependency
     */
    // public static String toHexStringOld(byte[] bytes) {
    // StringBuilder sb = new StringBuilder();
    // for (byte b : bytes) {
    // sb.append(String.format("%02X", b));
    // }
    // return sb.toString();
    // }
    //
    // public static byte[] toByteArrayOld(String s) {
    // int len = s.length();
    // byte[] data = new byte[len / 2];
    // for (int i = 0; i < len; i += 2) {
    // data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i +
    // 1), 16));
    // }
    // return data;
    // }
}

3
এটি ইসিবি মোডের সাথে এনক্রিপ্ট করবে যা ভয়ঙ্কর। আপনার কমপক্ষে সিবিসি মোড বা জিসিএম মোড স্থাপন করা উচিত
কনস্টান্টিনো স্পারাকিস

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

হ্যাঁ কোনও উদ্বেগ নেই, ক্রিপ্টো একটি জটিল বিষয়। দুঃখের বিষয় এই পৃষ্ঠায় প্রতিটি প্রয়োগই নষ্ট হয়ে গেছে এবং দুঃখের বিষয় এটি "প্রথম জাভা এনক্রিপশন কীভাবে করবেন" অনুসন্ধান করতে গুগল ব্যবহার করার সময় পপ আপ হয়। আমি যখন সুযোগ পাবো তখন আমি তাদের সবগুলি ঠিক করার চেষ্টা করব।
কনস্টান্টিনো স্পারাকিস

আমার উদাহরণটি এর সমান: ডকস.ওরাকল. com/javase/8/docs/technotes/guides/security/crypto/ ব্যতীত আমার সাইফার.জেটআইনস্ট্যান্সের প্রয়োজন ছিল ("এইএস / ইসিবি / পিকেসিএস 5 প্যাডিং"); আমার কোডটি ধরে নিয়েছে যে নিখুঁতভাবে 16 বাইট দীর্ঘ এনক্রিপশন কী সহ কিছু সম্পত্তি ফাইল রয়েছে তবে কোনও 'ব্যবহারকারী সরবরাহিত' পাসওয়ার্ড থেকে একটি স্ট্রিং এনক্রিপ্ট করার জন্য ওরাকল পৃষ্ঠা (উপরে লিঙ্ক করা) এটি করার উপায়ও দেখায়।

1
সুতরাং ইসিবির সমস্যা হ'ল এটি ফ্রিকোয়েন্সি বিশ্লেষণের জন্য অত্যন্ত চঞ্চল। লিনাক্স পেঙ্গুইনের বিখ্যাত উদাহরণ রয়েছে, ব্লগ.ফিলিপ.ইও / ফিলিপো.ইন / তি.সি.বি.-স্পেনগুইন দেখুন কীভাবে চিত্রটি এনক্রিপ্ট করা হয়েছে আপনি এখনও বলতে পারেন যে এটি একটি পেঙ্গুইন। আমি এগিয়ে যান এবং নিচের :) বিষয় নিচে আমার চিন্তা লিখেছিলেন stackoverflow.com/a/43779197/2607972
Konstantino Sparakis

4

গোপনীয়তা এবং অখণ্ডতা সরবরাহ করে বাইটগুলি এনক্রিপশন করার জন্য কেবল java.*এবং javax.crypto.*নির্ভরতার সাথে একটি সহজ সমাধান । কিলোবাইটের ক্রমে সংক্ষিপ্ত বার্তাগুলির জন্য এটি বেছে বেছে প্লেইনেক্সট আক্রমণের অধীনে পৃথক পৃথক হতে পারে ।

এটি কোনও প্যাডিং ছাড়াই মোডে ব্যবহার AESকরে GCM, একটি 128 বিট কীটি PBKDF2প্রচুর পরিমাণে পুনরাবৃত্তি এবং সরবরাহিত পাসওয়ার্ড থেকে একটি স্ট্যাটিক লবণের সাহায্যে উত্পন্ন হয় । এটি নিশ্চিত করে যে ব্রুট জোর করে পাসওয়ার্ডগুলি শক্ত এবং পুরো কীতে এনট্রপি বিতরণ করে।

একটি র্যান্ডম ইনিশিয়েশন ভেক্টর (চতুর্থ) উত্পন্ন হয় এবং সিফারেক্সট এ প্রিপেন্ড করা হবে। তদুপরি, স্ট্যাটিক বাইটটি 0x01প্রথম সংস্করণ হিসাবে 'সংস্করণ' হিসাবে যুক্ত করা হয়।

পুরো বার্তাটি মেসেজের প্রমাণীকরণ কোড (ম্যাক) এর মাধ্যমে তৈরি হয় AES/GCM

এখানে যায়, শূন্য বাহ্যিক নির্ভরতা এনক্রিপশন শ্রেণি গোপনীয়তা এবং অখণ্ডতা সরবরাহ করে :

package ch.n1b.tcrypt.utils;

import java.nio.charset.StandardCharsets;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;

import javax.crypto.*;
import javax.crypto.spec.GCMParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;

/**
 * This class implements AES-GCM symmetric key encryption with a PBKDF2 derived password.
 * It provides confidentiality and integrity of the plaintext.
 *
 * @author Thomas Richner
 * @created 2018-12-07
 */
public class AesGcmCryptor {

    // /crypto/26783/ciphertext-and-tag-size-and-iv-transmission-with-aes-in-gcm-mode
    private static final byte VERSION_BYTE = 0x01;
    private static final int VERSION_BYTE_LENGTH = 1;
    private static final int AES_KEY_BITS_LENGTH = 128;


    // fixed AES-GCM constants
    private static final String GCM_CRYPTO_NAME = "AES/GCM/NoPadding";
    private static final int GCM_IV_BYTES_LENGTH = 12;
    private static final int GCM_TAG_BYTES_LENGTH = 16;

    // can be tweaked, more iterations = more compute intensive to brute-force password
    private static final int PBKDF2_ITERATIONS = 1024;

    // protects against rainbow tables
    private static final byte[] PBKDF2_SALT = hexStringToByteArray("4d3fe0d71d2abd2828e7a3196ea450d4");

    public String encryptString(char[] password, String plaintext) throws CryptoException {

        byte[] encrypted = null;
        try {
            encrypted = encrypt(password, plaintext.getBytes(StandardCharsets.UTF_8));
        } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException //
                | InvalidAlgorithmParameterException | IllegalBlockSizeException | BadPaddingException //
                | InvalidKeySpecException e) {
            throw new CryptoException(e);
        }
        return byteArrayToHexString(encrypted);
    }

    public String decryptString(char[] password, String ciphertext)
            throws CryptoException {

        byte[] ct = hexStringToByteArray(ciphertext);
        byte[] plaintext = null;
        try {
            plaintext = decrypt(password, ct);
        } catch (AEADBadTagException e) {
            throw new CryptoException(e);
        } catch ( //
                NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeySpecException //
                        | InvalidKeyException | InvalidAlgorithmParameterException | IllegalBlockSizeException //
                        | BadPaddingException e) {
            throw new CryptoException(e);
        }
        return new String(plaintext, StandardCharsets.UTF_8);
    }

    /**
     * Decrypts an AES-GCM encrypted ciphertext and is
     * the reverse operation of {@link AesGcmCryptor#encrypt(char[], byte[])}
     *
     * @param password   passphrase for decryption
     * @param ciphertext encrypted bytes
     * @return plaintext bytes
     * @throws NoSuchPaddingException
     * @throws NoSuchAlgorithmException
     * @throws NoSuchProviderException
     * @throws InvalidKeySpecException
     * @throws InvalidAlgorithmParameterException
     * @throws InvalidKeyException
     * @throws BadPaddingException
     * @throws IllegalBlockSizeException
     * @throws IllegalArgumentException           if the length or format of the ciphertext is bad
     * @throws CryptoException
     */
    public byte[] decrypt(char[] password, byte[] ciphertext)
            throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeySpecException,
            InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {

        // input validation
        if (ciphertext == null) {
            throw new IllegalArgumentException("ciphertext cannot be null");
        }

        if (ciphertext.length <= VERSION_BYTE_LENGTH + GCM_IV_BYTES_LENGTH + GCM_TAG_BYTES_LENGTH) {
            throw new IllegalArgumentException("ciphertext too short");
        }

        // the version must match, we don't decrypt other versions
        if (ciphertext[0] != VERSION_BYTE) {
            throw new IllegalArgumentException("wrong version: " + ciphertext[0]);
        }

        // input seems legit, lets decrypt and check integrity

        // derive key from password
        SecretKey key = deriveAesKey(password, PBKDF2_SALT, AES_KEY_BITS_LENGTH);

        // init cipher
        Cipher cipher = Cipher.getInstance(GCM_CRYPTO_NAME);
        GCMParameterSpec params = new GCMParameterSpec(GCM_TAG_BYTES_LENGTH * 8,
                ciphertext,
                VERSION_BYTE_LENGTH,
                GCM_IV_BYTES_LENGTH
        );
        cipher.init(Cipher.DECRYPT_MODE, key, params);

        final int ciphertextOffset = VERSION_BYTE_LENGTH + GCM_IV_BYTES_LENGTH;

        // add version and IV to MAC
        cipher.updateAAD(ciphertext, 0, ciphertextOffset);

        // decipher and check MAC
        return cipher.doFinal(ciphertext, ciphertextOffset, ciphertext.length - ciphertextOffset);
    }

    /**
     * Encrypts a plaintext with a password.
     * <p>
     * The encryption provides the following security properties:
     * Confidentiality + Integrity
     * <p>
     * This is achieved my using the AES-GCM AEAD blockmode with a randomized IV.
     * <p>
     * The tag is calculated over the version byte, the IV as well as the ciphertext.
     * <p>
     * Finally the encrypted bytes have the following structure:
     * <pre>
     *          +-------------------------------------------------------------------+
     *          |         |               |                             |           |
     *          | version | IV bytes      | ciphertext bytes            |    tag    |
     *          |         |               |                             |           |
     *          +-------------------------------------------------------------------+
     * Length:     1B        12B            len(plaintext) bytes            16B
     * </pre>
     * Note: There is no padding required for AES-GCM, but this also implies that
     * the exact plaintext length is revealed.
     *
     * @param password  password to use for encryption
     * @param plaintext plaintext to encrypt
     * @throws NoSuchAlgorithmException
     * @throws NoSuchProviderException
     * @throws NoSuchPaddingException
     * @throws InvalidAlgorithmParameterException
     * @throws InvalidKeyException
     * @throws BadPaddingException
     * @throws IllegalBlockSizeException
     * @throws InvalidKeySpecException
     */
    public byte[] encrypt(char[] password, byte[] plaintext)
            throws NoSuchAlgorithmException, NoSuchPaddingException,
            InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException,
            InvalidKeySpecException {

        // initialise random and generate IV (initialisation vector)
        SecretKey key = deriveAesKey(password, PBKDF2_SALT, AES_KEY_BITS_LENGTH);
        final byte[] iv = new byte[GCM_IV_BYTES_LENGTH];
        SecureRandom random = SecureRandom.getInstanceStrong();
        random.nextBytes(iv);

        // encrypt
        Cipher cipher = Cipher.getInstance(GCM_CRYPTO_NAME);
        GCMParameterSpec spec = new GCMParameterSpec(GCM_TAG_BYTES_LENGTH * 8, iv);
        cipher.init(Cipher.ENCRYPT_MODE, key, spec);

        // add IV to MAC
        final byte[] versionBytes = new byte[]{VERSION_BYTE};
        cipher.updateAAD(versionBytes);
        cipher.updateAAD(iv);

        // encrypt and MAC plaintext
        byte[] ciphertext = cipher.doFinal(plaintext);

        // prepend VERSION and IV to ciphertext
        byte[] encrypted = new byte[1 + GCM_IV_BYTES_LENGTH + ciphertext.length];
        int pos = 0;
        System.arraycopy(versionBytes, 0, encrypted, 0, VERSION_BYTE_LENGTH);
        pos += VERSION_BYTE_LENGTH;
        System.arraycopy(iv, 0, encrypted, pos, iv.length);
        pos += iv.length;
        System.arraycopy(ciphertext, 0, encrypted, pos, ciphertext.length);

        return encrypted;
    }

    /**
     * We derive a fixed length AES key with uniform entropy from a provided
     * passphrase. This is done with PBKDF2/HMAC256 with a fixed count
     * of iterations and a provided salt.
     *
     * @param password passphrase to derive key from
     * @param salt     salt for PBKDF2 if possible use a per-key salt, alternatively
     *                 a random constant salt is better than no salt.
     * @param keyLen   number of key bits to output
     * @return a SecretKey for AES derived from a passphrase
     * @throws NoSuchAlgorithmException
     * @throws InvalidKeySpecException
     */
    private SecretKey deriveAesKey(char[] password, byte[] salt, int keyLen)
            throws NoSuchAlgorithmException, InvalidKeySpecException {

        if (password == null || salt == null || keyLen <= 0) {
            throw new IllegalArgumentException();
        }
        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
        KeySpec spec = new PBEKeySpec(password, salt, PBKDF2_ITERATIONS, keyLen);
        SecretKey pbeKey = factory.generateSecret(spec);

        return new SecretKeySpec(pbeKey.getEncoded(), "AES");
    }

    /**
     * Helper to convert hex strings to bytes.
     * <p>
     * May be used to read bytes from constants.
     */
    private static byte[] hexStringToByteArray(String s) {

        if (s == null) {
            throw new IllegalArgumentException("Provided `null` string.");
        }

        int len = s.length();
        if (len % 2 != 0) {
            throw new IllegalArgumentException("Invalid length: " + len);
        }

        byte[] data = new byte[len / 2];
        for (int i = 0; i < len - 1; i += 2) {
            byte b = (byte) toHexDigit(s, i);
            b <<= 4;
            b |= toHexDigit(s, i + 1);
            data[i / 2] = b;
        }
        return data;
    }

    private static int toHexDigit(String s, int pos) {
        int d = Character.digit(s.charAt(pos), 16);
        if (d < 0) {
            throw new IllegalArgumentException("Cannot parse hex digit: " + s + " at " + pos);
        }
        return d;
    }

    private static String byteArrayToHexString(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02X", b));
        }
        return sb.toString();
    }

    public class CryptoException extends Exception {

        public CryptoException(Throwable cause) {
            super(cause);
        }
    }
}

এখানে একটি দুর্দান্ত সিএলআই সহ পুরো প্রকল্প: https://github.com/trichner/tcrypt

সম্পাদনা করুন: এখন উপযুক্ত encryptStringএবং সাথে anddecryptString


এই অবিশ্বাস্য. ধন্যবাদ! আমি আপনার কোড থেকে অনেক কিছু শিখেছি এবং BadVersionException ব্যতিক্রম ক্লাস তৈরির পরে, আপনার কোডটি প্রথমবারে পুরোপুরি কাজ করেছিল। চমৎকার !!
মোরকাস

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

ঠিক আছে, আমি এটি আরও কিছুটা পরিষ্কার করে অনুরোধ করেছি encryptStringএবং decryptString:)
ট্রাইচনার

এটি খুব ভাল কাজ করেছে; কোডের জন্য টাই। এটি লক্ষ করা উচিত যে এই কোডটির যথাযথভাবে কাজ করার জন্য API 19 (কিট ক্যাট) বা তার বেশি প্রয়োজন।
পিজিম্যাকডিজাইন

3

আমি https://www.bouncycastle.org/ এর মতো কিছু ব্যবহার করার কথা বিবেচনা করব এটি একটি পূর্বনির্মাণ গ্রন্থাগার যা আপনাকে বিভিন্ন সাইফারদের সাথে আপনি যা খুশি তাই এনক্রিপ্ট করতে দেয় আমি বুঝতে পেরেছি যে আপনি কেবল স্নুপিং থেকে রক্ষা করতে চান তবে আপনি যদি সত্যিই হন তথ্য 64 রক্ষা করতে চান, বেস 64 ব্যবহার করা আসলে আপনাকে রক্ষা করবে না।


1
কেবল সাইফারগুলির সাথে একটি এলোমেলো ক্রিপ্টো লাইব্রেরি সুপারিশ করা প্রশ্নের উত্তর নয়। তা ছাড়া, বিল্ড-ইন সাইফারগুলি ব্যবহার করবেন না কেন?
মার্টেন বোদেউয়েস

2

জাভা সমর্থন করে এমন কিছু লিঙ্ক এখানে আপনি পড়তে পারেন

ডেটা স্ট্রিম এনক্রিপ্ট / ডিক্রিপ্ট করা।

এই উদাহরণটি দেখায় যে কীভাবে এনক্রিপ্ট করা যায় (সংমিত এনক্রিপশন অ্যালগরিদম যেমন এইএস, ব্লোফিশ, আরসি 2, 3DES ইত্যাদি) ব্যবহার করে amount এনক্রিপ্ট পদ্ধতিগুলির একটিতে তথ্যগুলিকে কিছু অংশে স্থান দেওয়া হয়: এনক্রিপটাইটস, এনক্রিপস্ট্রিং, এনক্রিপটাইটসইএনসি, বা এনক্রিপ্টস্ট্রিংএনসি। (পদ্ধতির নামটি ইনপুট (স্ট্রিং বা বাইট অ্যারে) এবং রিটার্নের ধরণ (এনকোডড স্ট্রিং বা বাইট অ্যারে) নির্দেশ করে First ডিফল্টরূপে, ফার্স্টচঙ্ক এবং লাস্টচঙ্ক উভয়ই সমান সত্য - যার অর্থ পাস করা ডেটা সম্পূর্ণ পরিমাণ।

JCERefGuide

জাভা এনক্রিপশন উদাহরণ


হ্যাঁ, জাভা দ্বারা সমর্থিত ক্রিপ্টোগ্রাফি রয়েছে। কোনও স্ট্রিমের এনক্রিপশন কোনওটির জন্যই বলা হয়েছিল তা নয়।
মার্টেন বোদেউয়েস

2

ইতিমধ্যে অনেক লোক ইতিমধ্যে জানিয়েছে, আপনার একটি স্ট্যান্ডার্ড সাইফার ব্যবহার করা উচিত যা ডিইএস বা এএসএস এর মতো অতিরিক্ত ব্যবহৃত হয়।

আপনি কীভাবে জাএস-এ এএস ব্যবহার করে একটি স্ট্রিং এনক্রিপ্ট করতে এবং ডিক্রিপ্ট করতে পারবেন তার একটি সহজ উদাহরণ ।

import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class EncryptorDemo {

    public static String encrypt(String key, String randomVector, String value) {
        try {
            IvParameterSpec iv = new IvParameterSpec(randomVector.getBytes("UTF-8"));
            SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
            byte[] encrypted = cipher.doFinal(value.getBytes());
            System.out.println("encrypted text: "  + Base64.encodeBase64String(encrypted));
            return Base64.encodeBase64String(encrypted);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static String decrypt(String key, String randomVector, String encrypted) {
        try {
            IvParameterSpec iv = new IvParameterSpec(randomVector.getBytes("UTF-8"));
            SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
            cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
            byte[] originalText = cipher.doFinal(Base64.decodeBase64(encrypted));
            System.out.println("decrypted text: "  + new String(originalText));
            return new String(originalText);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) {
        String key = "JavasEncryptDemo"; // 128 bit key
        String randomVector = "RandomJavaVector"; // 16 bytes IV
        decrypt(key, randomVector, encrypt(key, randomVector, "Anything you want to encrypt!"));

    }
}

সিবিসি আর নিরাপদ মোড নয়। প্যাডিং প্যাডিং ওরাকল আক্রমণে ঝুঁকিপূর্ণ। এছাড়াও, স্ট্রিংয়ে কী এবং বার্তাগুলি পরিচালনা করা নিরাপদ নয়। তারা স্ট্রিং পুলে
লম্বা

2
মন্তব্য প্রশংসা। এটি জাভার এনক্রিপ্ট এবং ডিক্রিপ্ট পদ্ধতিগুলির সাধারণ উদাহরণ হিসাবে ব্যবহারকারী জিজ্ঞাসা করছে। প্রশ্নটি প্রায় 9 বছর আগে জিজ্ঞাসা করা হয়েছিল এবং তার ভিত্তিতে উত্তর দেওয়া হয়েছিল। ধন্যবাদ।
বিবেকানস্কর

2
হ্যাঁ এটি এনক্রিপ্ট / ডিক্রিপ্ট প্রবর্তনের একটি সহজ উপায় বলে মনে হচ্ছে। আমার জন্য একটি মোহন মত কাজ .... ধন্যবাদ।
কোডউইপার

0

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

    public static String encrypt(String s) {
        try {
            byte[] input = s.getBytes("UTF-8");
            String keyString = System.getProperty("SECRET_KEY_BASE", System.getenv("SECRET_KEY_BASE"));
            if (keyString == null || keyString.length() == 0) {
                Logger.error(Utils.class, "encrypt()", "$SECRET_KEY_BASE is not set.");
                return null;
            }
            byte[] keyBytes = keyString.getBytes("UTF-8");
            SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
            // generate IV
            SecureRandom secureRandom = SecureRandom.getInstanceStrong();
            Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
            byte[] ivBytes = new byte[cipher.getBlockSize()];
            secureRandom.nextBytes(ivBytes);
            GCMParameterSpec gcmSpec = new GCMParameterSpec(96, ivBytes); // 96 bit tag length
            cipher.init(Cipher.ENCRYPT_MODE, keySpec, gcmSpec);
            // generate AAD
//          byte[] aadBytes = new byte[cipher.getBlockSize()];
//          secureRandom.nextBytes(aadBytes);
//          cipher.updateAAD(aadBytes);
            // encrypt
            byte[] encrypted = cipher.doFinal(input);
            byte[] returnBytes = new byte[ivBytes.length + encrypted.length];
//          byte[] returnBytes = new byte[ivBytes.length + aadBytes.length + encrypted.length];
            System.arraycopy(ivBytes, 0, returnBytes, 0, ivBytes.length);
//          System.arraycopy(aadBytes, 0, returnBytes, ivBytes.length, aadBytes.length);
            System.arraycopy(encrypted, 0, returnBytes, ivBytes.length, encrypted.length);
//          System.arraycopy(encrypted, 0, returnBytes, ivBytes.length+aadBytes.length, encrypted.length);
            String encryptedString = Base64.getEncoder().encodeToString(returnBytes);
            return encryptedString;
        } catch (UnsupportedEncodingException | NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | 
                InvalidAlgorithmParameterException | IllegalBlockSizeException | BadPaddingException e) {
            Logger.error(Utils.class, "encrypt()", "Could not encrypt string: " + e.getMessage());
            return null;
        }
    }

    public static String decrypt(String s) {
        if (s == null || s.length() == 0) return "";
        try {
            byte[] encrypted = Base64.getDecoder().decode(s);
            String keyString = System.getProperty("SECRET_KEY_BASE", System.getenv("SECRET_KEY_BASE"));
            if (keyString == null || keyString.length() == 0) {
                Logger.error(Utils.class, "encrypt()", "$SECRET_KEY_BASE is not set.");
                return null;
            }
            byte[] keyBytes = keyString.getBytes("UTF-8");
            SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
            Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
            byte[] ivBytes = new byte[cipher.getBlockSize()];
            System.arraycopy(encrypted, 0, ivBytes, 0, ivBytes.length);
            GCMParameterSpec gcmSpec = new GCMParameterSpec(96, ivBytes);
            cipher.init(Cipher.DECRYPT_MODE, keySpec, gcmSpec);
//          cipher.updateAAD(encrypted, ivBytes.length, cipher.getBlockSize());
            byte[] decrypted = cipher.doFinal(encrypted, cipher.getBlockSize(), encrypted.length - cipher.getBlockSize());
//          byte[] decrypted = cipher.doFinal(encrypted, cipher.getBlockSize()*2, encrypted.length - cipher.getBlockSize()*2);
            String decryptedString = new String(decrypted, "UTF-8");
            return decryptedString;
        } catch (NoSuchAlgorithmException | NoSuchPaddingException | UnsupportedEncodingException | InvalidKeyException | 
                InvalidAlgorithmParameterException | IllegalBlockSizeException | BadPaddingException e) {
            Logger.error(Utils.class, "decrypt()", "Could not decrypt string: " + e.getMessage());
            return null;
        }
    }

এখানে একটি উদাহরণ:

    String s = "This is a test.";
    String enc = Utils.encrypt(s);
    System.out.println(enc);
    // fQHfYjbD+xAuN5XzH2ojk/EWNeKXUrKRSfx8LU+5dpuKkM/pueCMBjKCZw==
    String dec = Utils.decrypt(enc);
    System.out.println(dec);
    // This is a test.

-4

এনক্রিপশন / ডিক্রিপশন কোড জেনারেশন করতে আপনি কিছু স্বয়ংক্রিয় সরঞ্জাম বিবেচনা করতে চাইতে পারেন eg https://www.stringencrypt.com/java-encryption/

এটি স্ট্রিং বা ফাইল এনক্রিপশনের জন্য প্রতিটি সময় বিভিন্ন এনক্রিপশন এবং ডিক্রিপশন কোড উত্পন্ন করতে পারে।

আরএসএ, এইএস ইত্যাদি ব্যবহার না করে দ্রুত স্ট্রিং এনক্রিপশনের ক্ষেত্রে এটি খুব সহজ

নমুনা ফলাফল:

// encrypted with https://www.stringencrypt.com (v1.1.0) [Java]
// szTest = "Encryption in Java!"
String szTest = "\u9E3F\uA60F\uAE07\uB61B\uBE1F\uC62B\uCE2D\uD611" +
                "\uDE03\uE5FF\uEEED\uF699\uFE3D\u071C\u0ED2\u1692" +
                "\u1E06\u26AE\u2EDC";

for (int iatwS = 0, qUJQG = 0; iatwS < 19; iatwS++)
{
        qUJQG = szTest.charAt(iatwS);
        qUJQG ++;
        qUJQG = ((qUJQG << 5) | ( (qUJQG & 0xFFFF) >> 11)) & 0xFFFF;
        qUJQG -= iatwS;
        qUJQG = (((qUJQG & 0xFFFF) >> 6) | (qUJQG << 10)) & 0xFFFF;
        qUJQG ^= iatwS;
        qUJQG -= iatwS;
        qUJQG = (((qUJQG & 0xFFFF) >> 3) | (qUJQG << 13)) & 0xFFFF;
        qUJQG ^= 0xFFFF;
        qUJQG ^= 0xB6EC;
        qUJQG = ((qUJQG << 8) | ( (qUJQG & 0xFFFF) >> 8)) & 0xFFFF;
        qUJQG --;
        qUJQG = (((qUJQG & 0xFFFF) >> 5) | (qUJQG << 11)) & 0xFFFF;
        qUJQG ++;
        qUJQG ^= 0xFFFF;
        qUJQG += iatwS;
        szTest = szTest.substring(0, iatwS) + (char)(qUJQG & 0xFFFF) + szTest.substring(iatwS + 1);
}

System.out.println(szTest);

আমরা আমাদের সংস্থায় এটি সর্বদা ব্যবহার করি।


এটি অস্পষ্টতার মাধ্যমে সুরক্ষা এবং সত্যই নিরাপদ নয়।
ক্লো

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

-4
String s1="arshad"; 
char[] s2=s1.toCharArray(); 
int s3= s2.length; 

  System.out.println(s3);
 int i=0; 

// for(int j=0;j<s3;j++) 
// System.out.println(s2[j]); 

for(i=0;i<((s3)/2);i++) { 

char z,f=10; 
z=(char) (s2[i] * f); 
s2[i]=s2[(s3-1)-i]; 
s2[(s3-1)-i]=z; 

String b=new String(s2);

 print(b);  }

সাধারণত এটি ডেটা অপঠনযোগ্য বিন্যাসে এনক্রিপ্ট করে। ডিক্রিপ্ট করতে একই কোড ব্যবহার করুন। এবং s [i] * f কে s [I] / f এ পরিবর্তন করুন।
আরশাদ শাইখ

এটি অস্পষ্টতার মাধ্যমে সুরক্ষা এবং সত্যই নিরাপদ নয়।
ক্লো

-5
public static String encryptParams(String myTextInput) {

        String myKey = "40674244454045cb9a70040a30e1c007";
        String myVector = "@1B2c3D4e5F6g7H8";

        String encData = "";

        try{
            JavaEncryprtionUtil encUtil = new JavaEncryprtionUtil();
            encData = Base64.encodeToString(encUtil.encrypt(myTextInput.getBytes("UTF-8"), myKey.getBytes("UTF-8"), myVector.getBytes("UTF-8")),Base64.DEFAULT);
            System.out.println(encData);
        }catch(NoSuchAlgorithmException ex){
            ex.printStackTrace();
        }catch(NoSuchPaddingException ex){
            ex.printStackTrace();
        }catch(InvalidKeyException ex){
            ex.printStackTrace();
        }catch(InvalidAlgorithmParameterException ex){
            ex.printStackTrace();
        }catch(IllegalBlockSizeException ex){
            ex.printStackTrace();
        }catch(BadPaddingException ex){
            ex.printStackTrace();
        }catch(UnsupportedEncodingException ex){
            ex.printStackTrace();
        }

        return encData;
    }

1
জাভাএনক্রিপ্রেশনটি জেডিকে এপিআই-র অংশ? না হলে আপনার লাইব্রেরির নাম বানান করা উচিত।
ফার্মেটের ছোট শিক্ষার্থী

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