এই উত্তরে আমি "সিম্পল জাভা এইএস এনক্রিপ্ট / ডিক্রিপ্ট উদাহরণ" মূল থিমের কাছে যেতে বেছে নিয়েছি এবং নির্দিষ্ট ডিবাগিং প্রশ্নটি নয়, কারণ আমি মনে করি এটি বেশিরভাগ পাঠককে উপকৃত করবে।
এটি জাভাতে এইএস এনক্রিপশন সম্পর্কে আমার ব্লগ পোস্টের একটি সাধারণ সংক্ষিপ্তসার তাই আমি কিছু প্রয়োগ করার আগে এটির মাধ্যমে পড়ার পরামর্শ দিই। যাইহোক আমি এখনও ব্যবহার করার জন্য একটি সাধারণ উদাহরণ প্রদান করব এবং কিছু পয়েন্টারকে কী কী সন্ধান করা উচিত তা দেওয়ার জন্য।
এই উদাহরণে আমি গ্যালোইস / কাউন্টার মোড বা জিসিএম মোডের সাথে অনুমোদিত এনক্রিপশন ব্যবহার করতে পছন্দ করব । কারণটি হ'ল বেশিরভাগ ক্ষেত্রে আপনি গোপনীয়তার সাথে সম্মতিতে সততা এবং সত্যতা চান ( ব্লগে আরও পড়ুন )।
AES-GCM এনক্রিপশন / ডিক্রিপশন টিউটোরিয়াল
জাভা ক্রিপ্টোগ্রাফি আর্কিটেকচার (জেসিএ) এর সাথে এইএস-জিসিএম এর সাথে এনক্রিপ্ট / ডিক্রিপ্ট করার প্রয়োজনীয় পদক্ষেপগুলি এখানে রয়েছে । অন্যান্য উদাহরণগুলির সাথে মিশ্রণ করবেন না , কারণ সূক্ষ্ম পার্থক্যগুলি আপনার কোডটিকে একেবারে সুরক্ষিত করে তুলতে পারে।
1. কী তৈরি করুন
এটি আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে, তাই আমি সবচেয়ে সহজ কেসটি গ্রহণ করব: একটি এলোমেলো গোপন কী।
SecureRandom secureRandom = new SecureRandom();
byte[] key = new byte[16];
secureRandom.nextBytes(key);
SecretKey secretKey = SecretKeySpec(key, "AES");
গুরুত্বপূর্ণ:
2. সূচনা ভেক্টর তৈরি করুন
একটি সূচনা ভেক্টর (IV) ব্যবহার করা হয় যাতে একই গোপন কীটি বিভিন্ন সাইফার পাঠ্য তৈরি করে ।
byte[] iv = new byte[12]; //NEVER REUSE THIS IV WITH SAME KEY
secureRandom.nextBytes(iv);
গুরুত্বপূর্ণ:
3. IV এবং কী দিয়ে এনক্রিপ্ট করুন
final Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
GCMParameterSpec parameterSpec = new GCMParameterSpec(128, iv); //128 bit auth tag length
cipher.init(Cipher.ENCRYPT_MODE, secretKey, parameterSpec);
byte[] cipherText = cipher.doFinal(plainText);
গুরুত্বপূর্ণ:
- 16 বাইট / 128 বিট প্রমাণীকরণ ট্যাগ ব্যবহার করুন (অখণ্ডতা / সত্যতা যাচাই করতে ব্যবহৃত হয়)
- প্রমাণীকরণ ট্যাগটি স্বয়ংক্রিয়ভাবে সিফার পাঠ্যে সংযুক্ত হবে (জেসিএ প্রয়োগে)
- যেহেতু জিসিএম স্ট্রিম সাইফারের মতো আচরণ করে, তাই কোনও প্যাডিং প্রয়োজন হয় না
CipherInputStream
ডেটা বড় অংশগুলি এনক্রিপ্ট করার সময় ব্যবহার করুন
- অতিরিক্ত (অ গোপনীয়) ডেটা পরিবর্তন করা হয়েছে কিনা তা পরীক্ষা করতে চান? আপনি এখানে আরও সাথে যুক্ত ডেটা ব্যবহার করতে চাইতে পারেন
cipher.updateAAD(associatedData);
।
৩. একক বার্তায় সিরিয়াল করুন
কেবলমাত্র চতুর্থ এবং সিফেরেক্সট যুক্ত করুন। উপরে উল্লিখিত হিসাবে, চতুর্থ গোপনীয় প্রয়োজন হয় না।
ByteBuffer byteBuffer = ByteBuffer.allocate(iv.length + cipherText.length);
byteBuffer.put(iv);
byteBuffer.put(cipherText);
byte[] cipherMessage = byteBuffer.array();
আপনার যদি স্ট্রিং প্রতিনিধিত্বের প্রয়োজন হয় তবে বেস 64 এর সাথে বিকল্পভাবে এনকোড করুন । হয় অ্যান্ড্রয়েড বা জাভা 8 এর অন্তর্নির্মিত বাস্তবায়ন ব্যবহার করুন (অ্যাপাচি কমন্স কোডেক ব্যবহার করবেন না - এটি একটি ভয়াবহ বাস্তবায়ন)। এনকোডিংটি ASCII নিরাপদ করতে বাইট অ্যারেগুলিকে স্ট্রিং উপস্থাপনায় "রূপান্তর" করতে ব্যবহৃত হয় যেমন:
String base64CipherMessage = Base64.getEncoder().encodeToString(cipherMessage);
৪) ডিক্রিপশন প্রস্তুত করুন: ডিসরিওলাইজ করুন
আপনি যদি বার্তাটি এনকোড করেছেন, প্রথমে এটি বাইট অ্যারেতে ডিকোড করুন:
byte[] cipherMessage = Base64.getDecoder().decode(base64CipherMessage)
গুরুত্বপূর্ণ:
5. ডিক্রিপ্ট
সাইফারটি আরম্ভ করুন এবং এনক্রিপশন সহ একই পরামিতিগুলি সেট করুন:
final Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
//use first 12 bytes for iv
AlgorithmParameterSpec gcmIv = new GCMParameterSpec(128, cipherMessage, 0, 12);
cipher.init(Cipher.DECRYPT_MODE, secretKey, gcmIv);
//use everything from 12 bytes on as ciphertext
byte[] plainText = cipher.doFinal(cipherMessage, 12, cipherMessage.length - 12);
গুরুত্বপূর্ণ:
- আপনি যদি এনক্রিপশন চলাকালীন এটি যুক্ত করেন
cipher.updateAAD(associatedData);
তবে এর সাথে যুক্ত ডেটা যুক্ত করতে ভুলবেন না ।
একটি কার্যকারী কোড স্নিপেট এই টুকরোটিতে পাওয়া যাবে।
নোট করুন যে সর্বাধিক সাম্প্রতিক Android (SDK 21+) এবং জাভা (7+) বাস্তবায়নগুলিতে AES-GCM থাকা উচিত। পুরানো সংস্করণ এর অভাব হতে পারে। আমি এখনও এই মোডটি বেছে নিই, যেহেতু এনক্রিপ্ট-তত্কালীন ম্যাকের (যেমন এইএস-সিবিসি + এইচএমএসি সহ ) অনুরূপ মোডের তুলনায় আরও দক্ষ হওয়ার সাথে সাথে প্রয়োগ করা আরও সহজ । এইচএমএসি দিয়ে কীভাবে এইএস-সিবিসি বাস্তবায়ন করবেন সে সম্পর্কে এই নিবন্ধটি দেখুন ।