এক সমমিত এনক্রিপশন
সিমেট্রিক এনক্রিপশন ও অ্যাসিমেট্রিক এনক্রিপশন দুটি ভিন্ন এনক্রিপশন পদ্ধতি,ডেটার নিরাপত্তা ও তথ্য আদানপ্রদানে এগুলি গুরুত্বপূর্ণ ভূমিকা পালন করে।নিচে আমি এই দুটি এনক্রিপশন প্রযুক্তি আলাদাভাবে পরিচয় করিয়ে দেব:
1.1 প্রতিসম এনক্রিপশন (Symmetric Encryption)
প্রতিসম এনক্রিপশনে এনক্রিপ্ট ও ডিক্রিপ্ট করার জন্য একই কী ব্যবহার করা হয়। অর্থাৎ, এনক্রিপশন ও ডিক্রিপশনের কাজ করতে প্রেরক ও প্রাপক উভয়ের কাছেই এই কী থাকতে হবে।
প্রচলিত সিমেট্রিক এনক্রিপশন অ্যালগরিদম:
AES(উন্নত এনক্রিপশন মান)
DES(ডেটা এনক্রিপশন মান)
3DES(ত্রিস্তরীয় ডেটা এনক্রিপশন অ্যালগরিদম)
1.2 প্রতিসম এনক্রিপশনের বৈশিষ্ট্য
সাধারণভাবে, সিমেট্রিক এনক্রিপশনের নিম্নলিখিত বৈশিষ্ট্য রয়েছে:
তুলনামূলকভাবে দ্রুত: এনক্রিপশন ও ডিক্রিপশনে একই কী ব্যবহৃত হওয়ায়, প্রতিসম এনক্রিপশন সাধারণত অসমমিত এনক্রিপশনের চেয়ে দ্রুত হয়।
কী ব্যবস্থাপনা:সমমিত এনক্রিপশনের প্রধান চ্যালেঞ্জ হলো কী বিতরণ ও ব্যবস্থাপনা। কী ফাঁস হয়ে গেলে,এনক্রিপশনের নিরাপত্তা হুমকির মুখে পড়বে।
বিপুল পরিমাণ তথ্যের জন্য উপযোগী: দ্রুত হওয়ার কারণে, প্রতিসম এনক্রিপশন বিপুল পরিমাণ ডেটা এনক্রিপ্ট করার উপযোগী।
এখান থেকে দেখা যায়, সিমেট্রিক এনক্রিপশনের প্রধানত দুটি সুবিধা রয়েছে:প্রথমত, গণনার গতি বেশি;দ্বিতীয়ত, বিপুল পরিমাণ ডেটার জন্য উপযুক্ত।
তবে প্রতিসম এনক্রিপশনের একটি মারাত্মক সমস্যা হলো কী ব্যবস্থাপনা। সার্ভার থেকে ক্লায়েন্টে কী কীভাবে নিরাপদে পাঠানো যায়, সেটিই একটি সমস্যা!এ ছাড়া, এক থেকে একাধিক পক্ষের যোগাযোগে কী ফাঁস হওয়া ঠেকিয়ে সঠিকভাবে পরিচালনা করাও একটি চ্যালেঞ্জ। এটি প্রতিসম এনক্রিপশনের দুর্বলতা।

1.3 কোডের উদাহরণ
এবার সং দাদা আপনাদের দেখাবেন Java কোড দিয়ে কীভাবে সিমেট্রিক এনক্রিপশন ও ডিক্রিপশন করতে হয়।
Java-তে সমমিত এনক্রিপশন বাস্তবায়নে সাধারণত Java Cryptography Architecture(JCA)প্রদত্ত ক্লাস ও ইন্টারফেস ব্যবহার করা হয়।
নিচে AES(অ্যাডভান্সড এনক্রিপশন স্ট্যান্ডার্ড)অ্যালগরিদম ব্যবহার করে সমমিত এনক্রিপশন ও ডিক্রিপশনের একটি সহজ উদাহরণ দেওয়া হলো:
public class SymmetricEncryptionExample { // 生成密钥
public static SecretKey generateKey() throws Exception {
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128); // 可以是128, 192或256位
return keyGenerator.generateKey();
}
// 加密方法
public static String encrypt(String data, SecretKey key) throws Exception {
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encryptedBytes = cipher.doFinal(data.getBytes());
return Base64.getEncoder().encodeToString(encryptedBytes);
}
// 解密方法
public static String decrypt(String encryptedData, SecretKey key) throws Exception {
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
return new String(decryptedBytes);
}
public static void main(String[] args) {
try {
// 生成密钥
SecretKey key = generateKey();
// 原始数据
String originalData = "Hello, JavaBoy!";
// 加密
String encryptedData = encrypt(originalData, key);
System.out.println("加密数据: " + encryptedData);
// 解密
String decryptedData = decrypt(encryptedData, key);
System.out.println("解密数据: " + decryptedData);
} catch (Exception e) {
e.printStackTrace();
}
}
}কী তৈরি:ব্যবহার করুন
KeyGeneratorএকটি AES কী তৈরি করুন।এনক্রিপশন:ব্যবহার করুন
Cipherক্লাস দিয়ে এনক্রিপ্ট করা হয়, তথ্যকে বাইটে রূপান্তর করে এনক্রিপ্ট করা হয়, তারপর Base64 এনকোডিং দিয়ে স্ট্রিংয়ে রূপান্তর করা হয়, যাতে সংরক্ষণ বা প্রেরণ সহজ হয়।ডিক্রিপশন:এনক্রিপ্ট করা স্ট্রিংকে ডিকোড করে আবার বাইটে রূপান্তর করুন, তারপর একই কী ব্যবহার করে ডিক্রিপ্ট করুন।
ওপরের কোডে আপনাদের যে বিষয়টি খেয়াল করতে হবে:
চাবির দৈর্ঘ্য(যেমন 128 বিট)নিরাপত্তার প্রয়োজন অনুযায়ী বেছে নেওয়া উচিত।
কী নিরাপদে সংরক্ষণ নিশ্চিত করুন; কোডের মধ্যে কী হার্ডকোড করবেন না।
প্রোডাকশন পরিবেশের জন্য,আরও নিরাপদ কী ব্যবস্থাপনার কৌশল ব্যবহারের কথা বিবেচনা করা উচিত।
নিরাপত্তার কথা বিবেচনা করে,আমরা সাধারণত ওপরের পদ্ধতিতে কী তৈরি করি। এই পদ্ধতিতে তৈরি কী-এর একটি বৈশিষ্ট্য হলো সিস্টেম প্রতিবার পুনরায় চালু হলে এটি বদলে যায়। আপনি যদি কী তৈরির প্রক্রিয়া নিজে নিয়ন্ত্রণ করতে চান,তাহলে নিচের পদ্ধতিতে কী তৈরি করতে পারেন:
public static SecretKey generateKeyFromPassword(String password, int keySize) throws NoSuchAlgorithmException, InvalidKeySpecException {
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
KeySpec spec = new PBEKeySpec(password.toCharArray(), "salt".getBytes(), 65536, keySize);
return new SecretKeySpec(factory.generateSecret(spec).getEncoded(), "AES");
}এভাবে নিজের দেওয়া প্যারামিটারের মাধ্যমে কী নিয়ন্ত্রণ করা যায়।
1.4 ফ্রন্টএন্ড ও ব্যাকএন্ডের সমন্বয়
ভিন্ন ভাষায়(যেমন JavaScript ও Java)AES অ্যালগরিদম ব্যবহার করে এনক্রিপশন ও ডিক্রিপশন করার সময়, মূল বিষয় হলো উভয় দিকে একই কী, অ্যালগরিদম মোড(যেমন CBC, ECB ইত্যাদি), প্যাডিং মোড(যেমন PKCS5Padding, PKCS7Padding ইত্যাদি)এবং ইনিশিয়ালাইজেশন ভেক্টর(IV, যদি CBC-এর মতো IV প্রয়োজন এমন মোড ব্যবহার করা হয়)ব্যবহার করা নিশ্চিত করা।
আগে এক পাঠক বলেছিলেন, ফ্রন্টএন্ডে এনক্রিপ্ট করার পর ব্যাকএন্ডে কিছুতেই ডিক্রিপ্ট করতে পারছেন না, তাই সং দাদা এখানে ফ্রন্টএন্ড ও ব্যাকএন্ড মিলিয়ে একটি উদাহরণও দিচ্ছেন।
ফ্রন্টএন্ডে এনক্রিপশন, ব্যাকএন্ডে ডিক্রিপশন
ফ্রন্টএন্ডের কোড:
<!DOCTYPE html><html lang="en"><head>
<meta charset="UTF-8">
<title>AES加密示例</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>
</head>
<body>
<script>
function encryptAES(text, secretKey) {
const key = CryptoJS.enc.Utf8.parse(secretKey);
const iv = CryptoJS.lib.WordArray.random(128 / 8);
// 对于CBC模式,需要IV
const encrypted = CryptoJS.AES.encrypt(text, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
// 返回加密后的文本和IV(Base64格式),实际使用中可能需要安全地传输这些值
return {
ciphertext: encrypted.toString(),
iv: iv.toString(CryptoJS.enc.Base64)
};
}
const secretKey = 'helloworldhelloworldhelloworld11'; /
/ 确保密钥是32个字符长(256位)
const text = 'Hello, javaboy!';
const result = encryptAES(text, secretKey);
console.log(result);
</script>
</body>
</html>ব্যাকএন্ড কোড:
import javax.crypto.Cipher;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;import java.util.Base64;public class AESDecrypt { public static String decryptAES(String encryptedData, String secretKey, String iv) throws Exception { IvParameterSpec ivParameterSpec = new IvParameterSpec(Base64.getDecoder().decode(iv)); SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes("UTF-8"), "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec); byte[] decodedValue = Base64.getDecoder().decode(encryptedData); byte[] decryptedValue = cipher.doFinal(decodedValue); return new String(decryptedValue, "UTF-8");
} public static void main(String[] args) { try { //前端加密后的文本
String encryptedText = "PYANpAjMsRnBIEhovtEXQw=="; String secretKey = "helloworldhelloworldhelloworld11"; //前端 IV,要和加密后的文本一起传到后端
String iv = "y/jUHcgSOpOiyNlsfjNUBg=="; String decryptedText = decryptAES(encryptedText, secretKey, iv);
System.out.println("解密文本: " + decryptedText);
} catch (Exception e) {
e.printStackTrace();
}
}
}খেয়াল রাখুন,এখানে ফ্রন্টএন্ডে এনক্রিপশনের সময় একটি iv প্যারামিটার তৈরি হয়,সেটিকে ফ্রন্টএন্ডের এনক্রিপ্ট করা ফলাফলের সঙ্গে ব্যাকএন্ডে পাঠাতে হবে।
ব্যাকএন্ডে এনক্রিপশন, ফ্রন্টএন্ডে ডিক্রিপশন
Java-তে AES এনক্রিপশন করে JavaScript-এ ডিক্রিপ্ট করার সময়ও নিশ্চিত করতে হবে যে দুই প্রান্তে একই কী, অ্যালগরিদম মোড(যেমন CBC, ECB ইত্যাদি), প্যাডিং মোড(যেমন PKCS5Padding, PKCS7Padding ইত্যাদি)এবং(প্রযোজ্য হলে)একই ইনিশিয়ালাইজেশন ভেক্টর(IV)ব্যবহৃত হচ্ছে।
ব্যাকএন্ড কোড:
public class AESEncrypt { public static String encryptAES(String plainText, String secretKey, String iv) throws Exception { KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(256); // 对于AES-256
SecretKey secret = new SecretKeySpec(secretKey.getBytes("UTF-8"), "AES"); IvParameterSpec ivParameterSpec = new IvParameterSpec(Base64.getDecoder().decode(iv)); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secret, ivParameterSpec); byte[] encrypted = cipher.doFinal(plainText.getBytes("UTF-8")); return Base64.getEncoder().encodeToString(encrypted);
} public static void main(String[] args) { try { String plainText = "Hello, 江南一点雨!"; String secretKey = "helloworldhelloworldhelloworld11"; // 确保密钥是32个字符长(256位)
String iv = Base64.getEncoder().encodeToString(new byte[16]); // 示例IV,实际应用中应更安全地生成
String encryptedText = encryptAES(plainText, secretKey, iv);
System.out.println("Encrypted text: " + encryptedText);
System.out.println("IV (Base64): " + iv); // 确保将IV发送给解密方
} catch (Exception e) {
e.printStackTrace();
}
}
}ফ্রন্টএন্ডের কোড:
<!DOCTYPE html><html lang="en"><head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>
<script>
function decryptAES(ciphertext, secretKey, iv) { const key = CryptoJS.enc.Utf8.parse(secretKey); const ivParsed = CryptoJS.enc.Base64.parse(iv); const decrypted = CryptoJS.AES.decrypt(
{ ciphertext: CryptoJS.enc.Base64.parse(ciphertext)
},
key,
{ iv: ivParsed, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7
}
); return decrypted.toString(CryptoJS.enc.Utf8);
} const secretKey = 'helloworldhelloworldhelloworld11'; const iv = 'AAAAAAAAAAAAAAAAAAAAAA=='; // 从Java代码获取
const ciphertext = '1lPNVF1injas78KUWeKp5FusEr6f0pGgcrLAg9ELFr8='; // 从Java代码获取
const decryptedText = decryptAES(ciphertext, secretKey, iv); console.log(decryptedText); </script></head><body></body></html>উপরের ফ্রন্টএন্ড ও ব্যাকএন্ডের আদানপ্রদানে এনক্রিপশন ও ডিক্রিপশনের কোড সং ভাই নিজে পরীক্ষা করে দেখেছেন, কোনো সমস্যা নেই। এ ধরনের প্রয়োজন থাকলে লেখাটি সংরক্ষণ করে রাখতে ভুলবেন না, এটি参考 হিসেবে ব্যবহার করতে পারবেন।
দুই অসমমিত এনক্রিপশন
2.1 অ্যাসিমেট্রিক এনক্রিপশন কী
অসমমিত এনক্রিপশন,যাকে পাবলিক কী এনক্রিপশনও বলা হয়,এমন একটি এনক্রিপশন পদ্ধতি যাতে দুটি ভিন্ন কী(পাবলিক কী ও প্রাইভেট কী)ব্যবহার করা হয়。
সাধারণভাবে, অসমমিত এনক্রিপশনের নিম্নলিখিত পৃথক বৈশিষ্ট্য রয়েছে:
পাবলিক কী ও প্রাইভেট কী
পাবলিক কী ও প্রাইভেট কী তৈরি:অসমমিত এনক্রিপশনে এক জোড়া কী ব্যবহৃত হয়, পাবলিক কী উন্মুক্ত থাকে, যে কেউ তা ব্যবহার করতে পারে, আর প্রাইভেট কী গোপন থাকে, শুধু কীটির অধিকারী তা ব্যবহার করতে পারেন। এই দুটি কী গাণিতিক অ্যালগরিদম দিয়ে তৈরি হয়, এবং পরস্পর সম্পর্কযুক্ত হলেও একটি থেকে অন্যটি নির্ণয় করা যায় না।
উচ্চ নিরাপত্তা
ভাঙা কঠিন:পাবলিক কী ও প্রাইভেট কী-এর জটিল গাণিতিক সম্পর্কের কারণে,অসমমিত এনক্রিপশনের নিরাপত্তা তুলনামূলকভাবে বেশি。আক্রমণকারীর পক্ষে পাবলিক কী থেকে প্রাইভেট কী নির্ণয় করা খুব কঠিন,ফলে এনক্রিপ্ট করা তথ্যের নিরাপত্তা নিশ্চিত হয়。
কোয়ান্টাম কম্পিউটিং আক্রমণ প্রতিরোধ:কিছু ব্লকচেইন প্রকল্প ভবিষ্যতের কোয়ান্টাম কম্পিউটিংয়ের হুমকি মোকাবিলায় কোয়ান্টাম আক্রমণ প্রতিরোধী এনক্রিপশন অ্যালগরিদম ব্যবহার শুরু করেছে, যেমন এলিপটিক কার্ভ ডিজিটাল সিগনেচার অ্যালগরিদম(ECDSA)-এর কোয়ান্টাম-নিরাপদ রূপ।
প্রকাশ্য কী বিতরণ করা সহজ
পাবলিক কী-এর উন্মুক্ততা:পাবলিক কী যে কাউকে দেওয়া যায়, তাই এটি বিতরণ করা খুবই সুবিধাজনক। যে কেউ পাবলিক কী দিয়ে তথ্য এনক্রিপ্ট করতে পারে, কিন্তু কেবল প্রাইভেট কী-এর অধিকারীই তা ডিক্রিপ্ট করতে পারে।
পরিচয় যাচাই ও ডিজিটাল স্বাক্ষর
পরিচয় যাচাই:পাবলিক কি ব্যবহারকারীর পরিচয়চিহ্ন হিসেবে ব্যবহার করা যায়,অন্যরা তাঁর প্রাইভেট কি না জেনেই ব্যবহারকারীর পরিচয় যাচাই করতে পারেন। এটি ব্লকচেইনের মতো বিকেন্দ্রীভূত নেটওয়ার্কে বিশ্বস্ত পরিচয় প্রতিষ্ঠায় সাহায্য করে।
ডিজিটাল স্বাক্ষর:ব্যক্তিগত চাবির অধিকারী সেই চাবি দিয়ে বার্তায় স্বাক্ষর করতে পারেন,অন্যরা সর্বজনীন চাবি ব্যবহার করে স্বাক্ষরের সত্যতা যাচাই করতে পারেন。এটি বার্তার অখণ্ডতা ও উৎসের নির্ভরযোগ্যতা নিশ্চিত করে。
নিরাপদ যোগাযোগ
এনক্রিপ্ট করা যোগাযোগ:পাবলিক কী দিয়ে বার্তা এনক্রিপ্ট করা যায়, আর কেবল সংশ্লিষ্ট প্রাইভেট কীধারী ব্যক্তিই তা ডিক্রিপ্ট করতে পারেন। এটি যোগাযোগের সময় ডেটার নিরাপত্তা নিশ্চিত করে এবং অননুমোদিত ব্যক্তিদের তথ্যের প্রবেশাধিকার পেতে বাধা দেয়।
ডিজিটাল সম্পদের নিয়ন্ত্রণ
ব্লকচেইন ঠিকানা ও ব্যক্তিগত চাবি:ব্লকচেইন ঠিকানা সাধারণত সর্বজনীন চাবি থেকে উদ্ভূত হয়,ব্যবহারকারী ব্যক্তিগত চাবির মাধ্যমে সেই ঠিকানার সঙ্গে যুক্ত ডিজিটাল সম্পদ নিয়ন্ত্রণ করেন。ডিজিটাল সম্পদের নিরাপত্তার জন্য ব্যক্তিগত চাবির নিরাপত্তা অত্যন্ত গুরুত্বপূর্ণ。
এনক্রিপশন ও ডিক্রিপশনের গতি
তুলনামূলকভাবে ধীর:অসমমিত এনক্রিপশনের এনক্রিপ্ট ও ডিক্রিপ্ট করার গতি সমমিত এনক্রিপশনের তুলনায় অনেক ধীর,কারণ এতে আরও জটিল গাণিতিক হিসাব করতে হয়। তবে,নিরাপদ যোগাযোগ、পরিচয় যাচাই ইত্যাদি ক্ষেত্রে এর প্রয়োগে এটি বাধা হয়ে দাঁড়ায় না।
2.2 অসমমিত এনক্রিপশনের ব্যবহার
অসমমিত এনক্রিপশনের দুটি প্রচলিত ব্যবহারিক ক্ষেত্র রয়েছে।
এনক্রিপশন:এটি আমাদের সবচেয়ে পরিচিত ব্যবহার—পাবলিক কী দিয়ে এনক্রিপ্ট করা এবং প্রাইভেট কী দিয়ে ডিক্রিপ্ট করা।
স্বাক্ষর: নেটওয়ার্ককে বিশ্বাসযোগ্য ধরা যায় না এবং সংবহনের সময় তথ্য বিকৃত হতে পারে বলে, এ ক্ষেত্রে পাবলিক ও প্রাইভেট কী বিপরীত ভূমিকায় ব্যবহার করা যায়। প্রাইভেট কী দিয়ে তথ্যে স্বাক্ষর করা হয় এবং পাবলিক কী দিয়ে স্বাক্ষর যাচাই করা হয়, যাতে তথ্যের নিরাপত্তা ও অখণ্ডতা নিশ্চিত থাকে।
দ্বিতীয় ব্যবহারটি নিয়ে কেউ কেউ বলেন প্রাইভেট কী দিয়ে এনক্রিপ্ট করা এবং পাবলিক কী দিয়ে ডিক্রিপ্ট করা, যাই হোক, সবাই বোঝেন যে একই বিষয়ের কথাই বলা হচ্ছে।
অসমমিত এনক্রিপশন অ্যালগরিদম তাত্ত্বিকভাবে তথ্য এনক্রিপশন ও ডিজিটাল স্বাক্ষরের জন্য ব্যবহার করা গেলেও,বাস্তবে এর উচ্চ গণনাগত জটিলতা ও কম দক্ষতাই প্রধান বাধা হয়ে দাঁড়ায়।
সমমিত এনক্রিপশন অ্যালগরিদমের তুলনায়,অসমমিত এনক্রিপশনের গণনাগতি কয়েক মাত্রার ঘাত পরিমাণ ধীর,যা বিপুল পরিমাণ তথ্য প্রক্রিয়াকরণের সক্ষমতাকে ব্যাপকভাবে প্রভাবিত করে。এছাড়া,অসমমিত এনক্রিপশন অ্যালগরিদমের এনক্রিপশন ও ডিক্রিপশন প্রক্রিয়া কী-এর দৈর্ঘ্যের সঙ্গে ঘনিষ্ঠভাবে সম্পর্কিত,এবং এটি ব্লক এনক্রিপশন মোড সমর্থন করে না,ফলে এটি কেবল কী-এর দৈর্ঘ্যের বেশি নয় এমন অল্প পরিমাণ তথ্য প্রক্রিয়াকরণ করতে পারে,বিপুল পরিমাণ তথ্য এনক্রিপ্ট করতে পারে না。
অপ্রতিসম এনক্রিপশনের কর্মক্ষমতার সীমাবদ্ধতা কাটাতে আধুনিক এনক্রিপশন ব্যবস্থা সাধারণত মিশ্র এনক্রিপশন কৌশল ব্যবহার করে, অর্থাৎ প্রতিসম ও অপ্রতিসম এনক্রিপশনের সুবিধাগুলিকে একত্র করে। এই কৌশলে অপ্রতিসম এনক্রিপশন মূলত অন্য পক্ষের কাছে একটি প্রতিসম এনক্রিপশন কী নিরাপদে পাঠাতে ব্যবহৃত হয়(অর্থাৎ “কী সমঝোতা”)。দুই পক্ষ নিরাপদে এই প্রতিসম কী ভাগ করে নেওয়ার পর, দক্ষ প্রতিসম এনক্রিপশন অ্যালগরিদম দিয়ে বিপুল পরিমাণ ডেটা এনক্রিপ্ট ও ডিক্রিপ্ট করা যায়। এই যৌথ পদ্ধতি এনক্রিপশনের দক্ষতা বাড়ানোর পাশাপাশি যোগাযোগের নিরাপত্তাও বাড়ায় এবং SSL/TLS-এর মতো বিভিন্ন নিরাপদ যোগাযোগ প্রোটোকলে ব্যাপকভাবে ব্যবহৃত হয়।
ডিজিটাল স্বাক্ষরের ক্ষেত্রে,অসমমিত এনক্রিপশনের দক্ষতা বাড়াতেও কিছু অভিযোজন করা হয়েছে। নির্দিষ্ট পদ্ধতিটি হলো,প্রথমে মূল ডেটার ডাইজেস্ট তৈরি করা হয়(MD5、SHA ইত্যাদি ব্যবহার করা যায়),যাতে নির্দিষ্ট দৈর্ঘ্যের একটি ডাইজেস্ট মান পাওয়া যায়। এরপর,অসমমিত এনক্রিপশন অ্যালগরিদম দিয়ে এই ডাইজেস্ট মান এনক্রিপ্ট করে,ডিজিটাল স্বাক্ষর তৈরি করা হয়। ডাইজেস্ট অ্যালগরিদম যেকোনো দৈর্ঘ্যের ডেটাকে দক্ষভাবে নির্দিষ্ট দৈর্ঘ্যের ডাইজেস্টে সংকুচিত করতে পারে বলে,মূল ডেটা যত বড়ই হোক,ডাইজেস্ট ডেটার দৈর্ঘ্য একই থাকে,ফলে স্বাক্ষর তৈরির প্রক্রিয়াও দক্ষ থাকে। স্বাক্ষর যাচাইয়ের সময়,শুধু মূল ডেটার ডাইজেস্ট আবার গণনা করে,ডিক্রিপ্ট করা স্বাক্ষরের সঙ্গে তুলনা করলেই,দ্রুত বোঝা যায় ডেটা পরিবর্তন করা হয়েছে কি না।
2.3 এনক্রিপশনের উদাহরণ
Java কোডে RSA দিয়ে এনক্রিপশন ও ডিক্রিপশনের উদাহরণ:
public class RsaDemo { public static void main(String[] args) { try { KeyPair keyPair = generateRSAKeyPair(); PublicKey publicKey = keyPair.getPublic(); PrivateKey privateKey = keyPair.getPrivate(); String originalData = "Hello, 江南一点雨!"; String encryptedData = encrypt(publicKey, originalData); String decryptedData = decrypt(privateKey, encryptedData);
System.out.println("加密后的数据: " + encryptedData);
System.out.println("解密后的数据: " + decryptedData);
} catch (Exception e) {
e.printStackTrace();
}
} public static String decrypt(PrivateKey privateKey, String encryptedData) throws Exception { Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedData)); return new String(decryptedBytes);
} public static String encrypt(PublicKey publicKey, String data) throws Exception { Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] bytes = cipher.doFinal(data.getBytes()); return Base64.getEncoder().encodeToString(bytes);
} public static KeyPair generateRSAKeyPair() throws NoSuchAlgorithmException { KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048); // 可以指定密钥长度,如2048位
return keyGen.generateKeyPair();
}
}2.4 ফ্রন্টএন্ড ও ব্যাকএন্ডের সমন্বয়
ফ্রন্টএন্ডে এনক্রিপশন, ব্যাকএন্ডে ডিক্রিপশন
ব্যাকএন্ডের কোড ওপরের উদাহরণের মতোই, পার্থক্য হলো, পাবলিক কী পাওয়ার পর আমরা সেটি প্রিন্ট করতে পারি; এই পাবলিক কী পরে ফ্রন্টএন্ডে পাঠাতে হবে:
public static void main(String[] args) { try { KeyPair keyPair = generateRSAKeyPair(); PublicKey publicKey = keyPair.getPublic(); PrivateKey privateKey = keyPair.getPrivate();
System.out.println("公钥: " + Base64.getEncoder().encodeToString(publicKey.getEncoded())); String originalData = "Hello, 江南一点雨!"; String encryptedData = encrypt(publicKey, originalData); String decryptedData = decrypt(privateKey, encryptedData);
System.out.println("加密后的数据: " + encryptedData);
System.out.println("解密后的数据: " + decryptedData);
} catch (Exception e) {
e.printStackTrace();
}
}ফ্রন্টএন্ডের কোড নিচে দেওয়া হলো:
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>RSA Encryption Example</title> <!-- 引入jsencrypt库 --> <script src="https://cdn.jsdelivr.net/npm/[email protected]/bin/jsencrypt.min.js"></script></head><body><script> // 重写前端加密方法 function encryptData(publicKey, data) { // 创建一个新的JSEncrypt对象 var encryptor = new JSEncrypt(); // 设置公钥 encryptor.setPublicKey(publicKey); // 加密数据 var encrypted = encryptor.encrypt(data); return encrypted; } // 示例公钥(实际使用时应该替换为服务器提供的公钥) var publicKey = `MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnP5FOXIghidLDE2FgFwzi4Y+qTdYjnc0eMoiL5i4gdOeTE+7Uu9YvDB51GcBWKD9lvmZr5rX8z0OBpwe526qsTekNpXoIVk9DB34US0HOrAXEEwpUTVuSR656cJGAwmWBkVaalQynEz4Dlzrm53zExVYueruYUuzFyuZDaQcFnl3rWUH/XDkCIe23z0R1TfT3Q2OYNKft0u56r0S/ko99utXuYJK9yowe7QGT6q4cSJwsITQTomCARAq9q+bSNuGEYa4FlYCKIKWIhKbMhz0FYIMB2fJN10GyZbbvKASqeMkuCoD2Efgd8/6uMwOaMcx9LgEkcFaQ3qgDutsPXNUswIDAQAB`; // 要加密的数据 var data = 'Hello, javaboy!'; // 调用加密方法 var encryptedData = encryptData(publicKey, data); // 输出加密后的数据 console.log('Encrypted Data:', encryptedData);</script></body></html>
ব্যাকএন্ডে এনক্রিপশন, ফ্রন্টএন্ডে ডিক্রিপশন
Java-তে RSA অ্যালগরিদম দিয়ে তথ্য এনক্রিপ্ট করে JavaScript-এ সেই তথ্য ডিক্রিপ্ট করার অর্থ হলো সার্ভার ফ্রন্টএন্ডের পাবলিক কী দিয়ে এনক্রিপ্ট করে, আর ফ্রন্টএন্ড নিজের প্রাইভেট কী দিয়ে ডিক্রিপ্ট করে, এই পরিস্থিতিতে ফ্রন্টএন্ডের প্রাইভেট কী খুব সহজেই চুরি হতে পারে, তাই এই ব্যবহার সুপারিশ করা হয় না। আমিও তাই উদাহরণ দিচ্ছি না।
আচ্ছা, বন্ধুরা, সিমেট্রিক এনক্রিপশন ও অ্যাসিমেট্রিক এনক্রিপশন নিয়ে আবারও কথা হলো, ওপরের উদাহরণের কোডগুলো আমি, সং গে, পরীক্ষা করেছি এবং সবই সফল হয়েছে, আপনারা এগুলো参考 হিসেবে ব্যবহার করতে পারেন।