อัลกอริทึมการเข้ารหัส DES
DES เป็นมาตรฐานการเข้ารหัสข้อมูลชื่อเต็มซึ่งเป็นอัลกอริทึมบล็อกที่ใช้การเข้ารหัสคีย์ มันถูกพิจารณาว่าเป็นมาตรฐานการประมวลผลข้อมูลของรัฐบาลกลาง (FIPS) โดยสำนักงานมาตรฐานแห่งชาติของรัฐบาลกลางสหรัฐอเมริกาในปี 1976 และต่อมาได้รับการเผยแพร่อย่างกว้างขวางในระดับสากล
มีพารามิเตอร์รายการสามรายการของอัลกอริทึม DES: คีย์ข้อมูลและโหมด ในหมู่พวกเขาคีย์คือ 7 ไบต์ทั้งหมด 56 บิตซึ่งเป็นกุญแจสำคัญในการทำงานของอัลกอริทึม DES; ข้อมูลคือ 8 ไบต์รวม 64 บิตซึ่งเป็นข้อมูลที่จะเข้ารหัสหรือถอดรหัส โหมดคือโหมดการทำงานของ DES: การเข้ารหัสหรือถอดรหัส
อัลกอริทึม DES จะเปลี่ยนบล็อกอินพุตแบบธรรมดา 64 บิตเป็นบล็อกเอาต์พุต Ciphertext 64 บิต กุญแจสำคัญที่ใช้คือ 56 บิต อัลกอริทึมของมันส่วนใหญ่แบ่งออกเป็นสองขั้นตอน:
1) ฟังก์ชั่นการเปลี่ยนแปลงเริ่มต้นคือการรวมบล็อกข้อมูล 64 บิตอินพุตในบิตและแบ่งเอาต์พุตออกเป็นสองส่วน: L0 และ R0 แต่ละส่วนมีความยาว 32 บิต กฎการเปลี่ยนแปลงคือการสลับบิตที่ 58 ของอินพุตเป็นบิตแรกบิตที่ 50 เป็นบิตที่สอง ... และอื่น ๆ บิตสุดท้ายคือบิตที่ 7 ดั้งเดิม L0 และ R0 เป็นสองส่วนหลังจากเอาท์พุทการขนย้าย L0 คือเอาต์พุต 32 บิตซ้ายและ R0 เป็น 32 บิตที่ถูกต้อง ตัวอย่าง: ตั้งค่าอินพุตก่อนการขนย้ายเป็น D1D2D3 ... D64 จากนั้นผลลัพธ์หลังจากการเปลี่ยนแปลงเริ่มต้นคือ: L0 = D58D50 ... D8; R0 = D57D49 ... D7
กฎการเปลี่ยนจะแสดงในตารางต่อไปนี้:
58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,62,54,46,38,30,22,14,64,64,56,48,40,32,38,38,38,22,14,64,62,54,54,54,54,54,54,54,54,38, , 57,49,41,33,25,17,9,1,1,59,51,43,35,27,19,11,11,3,61,53,45,37,29,29,13,5,63,55,55,47,39,31,31,23,15,77,15,15,15
2) หลังจากการดำเนินการวนซ้ำ 16 ครั้งจะได้รับ L16 และ R16 ใช้สิ่งนี้เป็นอินพุตและดำเนินการเปลี่ยนแปลงแบบผกผัน การเปลี่ยนแปลงแบบผกผันคือการดำเนินการผกผันของการเปลี่ยนแปลงเริ่มต้นดังนั้นจึงได้รับเอาต์พุต Ciphertext
อัลกอริทึมนี้เป็นตัวแทนของระบบอัลกอริทึมการเข้ารหัสแบบสมมาตรและใช้กันอย่างแพร่หลายในระบบเครือข่ายคอมพิวเตอร์
การใช้งาน Java ขั้นพื้นฐาน
แพ็คเกจ com.stone.security; นำเข้า java.security.key; นำเข้า Java.security.Securerandom; นำเข้า Javax.crypto.cipher; นำเข้า Javax.crypto.keyenerator; นำเข้า Javax.crypto.secretkey; นำเข้า Javax.crypto.secretkeyFactory; นำเข้า Javax.crypto.spec.deskeyspec; นำเข้า Javax.crypto.spec.ivparameterspec; / *** อัลกอริทึม DES 1972 พัฒนาโดย IBM ในสหรัฐอเมริกาอัลกอริทึมการเข้ารหัสแบบสมมาตร*/ คลาสสาธารณะ DES {// อัลกอริทึมชื่อสาธารณะคงที่สตริงสุดท้าย key_algorithm = "DES"; // อัลกอริทึมชื่อ/โหมดการเข้ารหัส/วิธีการเติมระบบสาธารณะคงที่สตริงสุดท้าย cipher_algorithm_ecb = "des/ecb/pkcs5padding"; สาธารณะคงที่สตริงสุดท้าย cipher_algorithm_cbc = "des/cbc/pkcs5padding"; โมฆะคงที่สาธารณะหลัก (สตริง [] args) พ่นข้อยกเว้น { / * * ใช้โหมด ECB * คีย์เครื่องกำเนิดคีย์เพื่อสร้างคีย์ * โหมด ECB ไม่สามารถใช้ IV * / byte [] key = generateKey (); ไบต์ [] encrypt = encrypt ("gasculitis f#*(x)". getBytes (), key); System.out.println (สตริงใหม่ (decrypt (เข้ารหัส, ปุ่ม))); / * * ใช้โหมด CBC * ใช้โรงงานคีย์เพื่อสร้างคีย์เข้ารหัสและถอดรหัส * IV: DES ในโหมด CBC และ RSA ciphers ด้วยการดำเนินการเข้ารหัส OAEP */ deskeyspec dks = ใหม่ deskeyspec (generateKey ()); SecretKeyFactory Factory = SecretKeyFactory.GetInstance (key_algorithm); SecretKey SecretKey = Factory.GenerAtesecret (DKS); cipher cipher = cipher.getInstance (cipher_algorithm_cbc); CIPHER.INIT (CIPHER.ENCRYPT_MODE, SECRETEKY, IVPARAMETERSPEC ใหม่ (getiv ())); ไบต์ [] enc = cipher.dofinal ("Gasculitis a%f#*(x)". getBytes ()); // เข้ารหัส cipher.init (cipher.decrypt_mode, SecretKey, IVParameterspec ใหม่ (getiv ())); ไบต์ [] dec = cipher.dofinal (ENC); // decrypt system.out.println (สตริงใหม่ (ธ.ค. )); } byte คงที่ [] getiv () {string iv = "asdfivh7"; // ความยาว iv: ต้องเป็น 8 ไบต์กลับไปที่ IV.getBytes (); } / ** * สร้างคีย์ * * @return * @throws Exception * / Private Static byte [] generateKey () โยนข้อยกเว้น {keygenerator keygenerator = keygenerator.getInstance (key_algorithm); keygenerator.init (56); // DES ต้องเป็น 56 วิธีเริ่มต้นนี้ไม่จำเป็นต้องเรียก SecretKey SecretKey = KeyGenerator.generateKey (); return secretkey.getEncoded (); } / ** * คีย์กู้คืน * * @param คีย์ * @return * @throws Exception * / คีย์คงที่ส่วนตัว tokey (รหัสไบต์ []) พ่นข้อยกเว้น {deskeyspec des = ใหม่ deskeyspec (คีย์); secretKeyFactory keyFactory = secretKeyFactory.getInstance (key_algorithm); SecretKey SecretKey = KeyFactory.GenerAtesecret (DES); กลับ secretkey; } / *** เข้ารหัส* @param ข้อมูลข้อความต้นฉบับ* @param คีย์* @return ciphertext* @throws Exception* / public Static byte [] encrypt (byte [] data, byte [] คีย์) โยนข้อยกเว้น {key k = tokey (คีย์); cipher cipher = cipher.getInstance (cipher_algorithm_ecb); cipher.init (cipher.encrypt_mode, K, ใหม่ securerandom ()); ส่งคืน cipher.dofinal (ข้อมูล); } / *** decrypt* @param data password* @param key* @return ข้อความธรรมดาข้อความต้นฉบับ* @throws ยกเว้น* / public Static byte [] decrypt (byte [] data, byte [] คีย์) โยนข้อยกเว้น {key k = tokey (คีย์); cipher cipher = cipher.getInstance (cipher_algorithm_ecb); cipher.init (cipher.decrypt_mode, K, ใหม่ securerandom ()); ส่งคืน cipher.dofinal (ข้อมูล); - การใช้งาน Java Triple des:
แพ็คเกจ com.stone.security; นำเข้า Javax.crypto.cipher; นำเข้า Javax.crypto.keyenerator; นำเข้า Javax.crypto.secretkey; นำเข้า Javax.crypto.secretkeyFactory; นำเข้า javax.crypto.spec.desedekeyspec; นำเข้า Javax.crypto.spec.ivparameterspec; / ** * 3DES การเข้ารหัสสามครั้งยังใช้เป็น Triple DES, */ คลาสสาธารณะสามเท่า {// อัลกอริทึมชื่อสาธารณะคงที่สตริงสุดท้ายคงที่ key_algorithm = "desede"; // อัลกอริทึมชื่อ/โหมดการเข้ารหัส/วิธีการเติมระบบสาธารณะคงที่สตริงสุดท้าย cipher_algorithm_ecb = "desede/ecb/pkcs5padding"; สาธารณะคงที่สตริงสุดท้าย cipher_algorithm_cbc = "desede/cbc/pkcs5padding"; Keygenerator ส่วนตัว Keygen; Secretkey ส่วนตัว SecretKey; SecretKey Private SecretKey2; รหัสส่วนตัวรหัส; ไบต์แบบคงที่ส่วนตัว [] EncryptData; โมฆะคงที่สาธารณะหลัก (String [] args) โยนข้อยกเว้น {tripledes tripledes = ใหม่สามเท่า ("ECB"); tripledes.encrypt ("sau8jzxlcvm, '123`98 (*^&%^^ jcb zx >> a <s <}} {"); system.out.println ("หลังจากการเข้ารหัส:" + ใหม่ tripledes.encrypt2 ("sau8jzxlc dqv#> <« | vm, '123`98 (*^&%^^ jcb zx >> a <s <}} {"); system.out.println ("หลังจากการเข้ารหัส:" + สตริงใหม่ String (tripledes.decrypt2 (EncryptData))); Keygenerater.getInstance (key_algorithm); desedekeyspec (keygen.generatekey (). getencoded ()); cipher.init (cipher.encrypt_mode, SecretKey); return encryptData = cipher.dofinal (str.getBytes ()); } / ** * decrypt * @param Encrypt * @return * @throws Exception * / public byte [] decrypt (byte [] encrypt) โยนข้อยกเว้น {cipher.init (cipher.decrypt_mode, SecretKey); return encryptData = cipher.dofinal (เข้ารหัส); } byte [] getiv () {return "administ" .getBytes (); } / ** * Encrypt * @param str * @return * @throws Exception * / public byte [] encrypt2 (str str) พ่นข้อยกเว้น {cipher.init (cipher.encrypt_mode, SecretKey2, IVParameterspec ใหม่ (getiv ()); return encryptData = cipher.dofinal (str.getBytes ()); } / ** * decrypt * @param Encrypt * @return * @throws Exception * / public byte [] decrypt2 (byte [] encrypt) โยนข้อยกเว้น {cipher.init (cipher.decrypt_mode return encryptData = cipher.dofinal (เข้ารหัส); -