การเข้ารหัสคือการเปลี่ยนข้อมูลข้อมูลดั้งเดิมโดยใช้อัลกอริทึมพิเศษดังนั้นแม้ว่าผู้ใช้ที่ไม่ได้รับอนุญาตจะได้รับข้อมูลที่เข้ารหัสเขาก็ยังไม่สามารถเข้าใจเนื้อหาของข้อมูลได้เพราะเขาไม่ทราบวิธีการถอดรหัส โดยทั่วไปจะถูกแบ่งออกเป็นการเข้ารหัสแบบสองทางและการเข้ารหัสแบบทางเดียวในขณะที่การเข้ารหัสแบบสองทางแบ่งออกเป็นการเข้ารหัสแบบสมมาตรและการเข้ารหัสแบบไม่สมมาตร (วัสดุบางอย่างแบ่งการเข้ารหัสโดยตรงเป็นการเข้ารหัสแบบสมมาตรและการเข้ารหัสแบบไม่สมมาตร)
ความหมายทั่วไปของการเข้ารหัสแบบสองทิศทางคือการสร้าง ciphertext หลังจากการเข้ารหัสแบบธรรมดาซึ่งสามารถกู้คืนไปยังข้อความธรรมดาผ่านอัลกอริทึม การเข้ารหัสแบบทางเดียวจะทำการคำนวณข้อมูลย่อยเฉพาะกับข้อมูลและไม่สามารถสร้างข้อความธรรมดาผ่านอัลกอริทึม การพูดอย่างเคร่งครัดการเข้ารหัสแบบทางเดียวไม่สามารถถือได้ว่าเป็นประเภทการเข้ารหัส แต่ควรได้รับการพิจารณาว่าเป็นอัลกอริทึมย่อย
โดยเฉพาะ:
ระบบจะต้องพร้อมใช้งานและไม่สามารถถอดรหัสไม่ได้
ระบบไม่จำเป็นต้องเก็บเป็นความลับและสามารถตกอยู่ในมือของศัตรูได้อย่างง่ายดาย
กุญแจจะต้องแลกเปลี่ยนและจดจำโดยไม่ต้องเขียนและทั้งสองฝ่ายสามารถเปลี่ยนคีย์ได้
ระบบสามารถใช้สำหรับการสื่อสารโทรคมนาคม
ระบบสามารถถ่ายโอนตำแหน่งและฟังก์ชั่นของมันจะต้องประสบความสำเร็จโดยไม่ต้องผ่านหลายคน
ระบบใช้งานง่ายและไม่ต้องการให้ผู้ใช้ทำงานหนักเกินไปหรือมีกฎมากมาย
1. ผู้ให้บริการรหัสวิธีการเข้ารหัสหลัก
JDK: รหัสอยู่ในแพ็คเกจ JRE/LIB/JCE.JAR ในไดเรกทอรีการติดตั้ง Java;
CC: org.apache.commons.codec จัดทำโดย Apache
หน้าแรก: http://commons.apache.org/proper/commons-codec/
BC: org.bouncecastle
หน้าแรก: http://www.bouncycastle.org/java.html
โดยทั่วไปแล้ว JDK ที่ใช้กันทั่วไปก็เพียงพอแล้ว
2. อัลกอริทึม Base64
1. การตัดสินจากความซับซ้อนของอัลกอริทึมการเข้ารหัสตอนนี้ Base64 รู้สึกอายที่จะบอกว่ามันถูกเข้ารหัส แต่ก็เพียงพอแล้วสำหรับผู้ที่ไม่เข้าใจคอมพิวเตอร์เลย การเข้ารหัส Base64 นั้นไม่สามารถอ่านได้นั่นคือข้อมูลที่เข้ารหัสจะไม่ถูกมองเห็นโดยตรงโดยมนุษย์ที่เปลือยเปล่า
การเข้ารหัส Base64 ใช้สำหรับการประมวลผล URL หรืออะไรก็ตามที่คุณไม่ต้องการให้คนทั่วไปรู้ได้อย่างรวดเร็วสามารถประมวลผลด้วยการเข้ารหัส Base64 แล้วโพสต์บนอินเทอร์เน็ต
แพ็คเกจ com.amuro.strategy.base64; นำเข้า java.util.base64; นำเข้า com.amuro.strategy.istrategy;/** * base64 อัลกอริทึมนั้นขึ้นอยู่กับตัวละครพื้นฐาน 64 ตัวอักษร (israte -srasstrate -srassrates ไบต์ [] encodebytes = base64.getencoder (). encode (src.getBytes ()); ส่งคืนสตริงใหม่ (ENCODEBYTES); } การถอดรหัสสตริงสาธารณะ (สตริง src) {byte [] decodebytes = base64.getDecoder (). decode (src.getBytes ()); ส่งคืนสตริงใหม่ (decodebytes); -2. BASE64 การเข้ารหัสตารางการติดต่อ
3. อัลกอริทึมการย่อยข้อความ (Message Digest)
Message Digest เรียกอีกอย่างว่า Digital Digest มันเป็นค่าที่ไม่ซ้ำกันที่สอดคล้องกับความยาวคงที่ของข้อความหรือข้อความและมันถูกสร้างขึ้นโดยฟังก์ชันการเข้ารหัสแฮชแบบทางเดียวที่ทำหน้าที่ในข้อความ การต่อต้านความขัดแย้งของฟังก์ชั่นแฮชทำให้ข้อความธรรมดาเปลี่ยนไปเล็กน้อยแม้ว่าจะมีการเปลี่ยนแปลงตัวอักษรเพียงตัวเดียวของวรรคหนึ่งค่าที่แตกต่างกันจะถูกสร้างขึ้นหลังจากอัลกอริทึมแฮช ความสามารถในทิศทางเดียวของอัลกอริทึมแฮชทำให้เป็นไปไม่ได้ที่จะหาข้อความอินพุตที่แตกต่างกันสองข้อความที่มีค่าแฮชเดียวกันที่คำนวณได้ ดังนั้นค่าแฮชของข้อมูลนั่นคือการย่อยข้อความสามารถตรวจสอบความสมบูรณ์ของข้อมูลได้
ในคำพูดธรรมดาข้อมูลใด ๆ ควรเป็นเอกลักษณ์เหมือนมนุษย์ ตัวระบุที่ไม่ซ้ำกันคืออะไร? สำหรับมนุษย์ปัจจุบันเป็นลายนิ้วมือและลายนิ้วมือของข้อมูลคืออะไร? ถูกต้องมันเป็นสตริงนี้ที่สร้างขึ้นโดยอัลกอริทึมการย่อยข้อความ ตัวอย่างเช่นเมื่อเราลงทะเบียนเว็บไซต์ไคลเอนต์จะส่งรหัสผ่านที่เราป้อนไปยังเซิร์ฟเวอร์ซึ่งควรเป็นเนื้อหาหลังจากการประมวลผลการย่อยข้อความ แม้ว่าเซิร์ฟเวอร์จะเสียการแฮ็คจะไม่สามารถรู้ได้ว่ารหัสผ่านจริงของผู้ใช้คืออะไร อย่างไรก็ตามมีการกล่าวกันว่า MD5 และ SHA ได้ถูกบุกรุกในขณะนี้ดังนั้นคุณจึงสามารถ Google ได้
1. MD5
แพ็คเกจ com.amuro.strategy.message_digest; นำเข้า java.security.messagedigest; นำเข้า Java.security.nosuchalgorithmexception; md5strategy onpressement istrategy {String สาธารณะเข้ารหัส (String src) {ลอง {messageGeSest md = messageGeSt.getInstance ("MD5"); ไบต์ [] encodebytes = md.digest (src.getBytes ()); return hex.encodehexstring (encodebytes); } catch (nosuchalgorithmexception e) {e.printstacktrace (); } return null; } การถอดรหัสสตริงสาธารณะ (สตริง src) {โยน runtimeException ใหม่ ("md5 ไม่มีการถอดรหัส"); -2. Sha
แพ็คเกจ com.amuro.strategy.message_digest; นำเข้า java.security.messagedigest; นำเข้า java.security.nosuchalgorithmexception; นำเข้า org.apache.commons.codec.binary.hex; การใช้งาน Shastrategy ISTRATEGY {Public String ENCODE (String SRC) {ลอง {MessageDigest MD = MessageGeTest.getInstance ("sha"); md.update (src.getBytes ()); return hex.encodehexstring (md.digest ()); } catch (nosuchalgorithmexception e) {e.printstacktrace (); } return null; } การถอดรหัสสตริงสาธารณะ (สตริง src) {โยน runtimeException ใหม่ ("sha no decode"); - 4. การเข้ารหัสแบบสมมาตร <br /> โดยใช้วิธีการเข้ารหัสของระบบการเข้ารหัสลับคีย์เดี่ยวคีย์เดียวกันสามารถใช้เป็นการเข้ารหัสและถอดรหัสข้อมูลในเวลาเดียวกัน วิธีการเข้ารหัสนี้เรียกว่าการเข้ารหัสแบบสมมาตรหรือที่เรียกว่าการเข้ารหัสแบบคีย์เดี่ยว เนื่องจากทั้งการเข้ารหัสและการถอดรหัสใช้คีย์เดียวกันวิธีที่จะส่งผ่านกุญแจไปยังตัวถอดรหัสได้อย่างปลอดภัยกลายเป็นปัญหาที่ต้องแก้ไข แน่นอนว่าข้อดีของการรักษาความปลอดภัยต่ำคือปริมาณการคำนวณขนาดเล็กความเร็วการเข้ารหัสที่รวดเร็วและประสิทธิภาพการเข้ารหัสสูง
อย่างไรก็ตามคอมพิวเตอร์ที่ทันสมัยได้หยุดการดูแลเกี่ยวกับการคำนวณในระดับนี้มานานและความปลอดภัยเป็นสิ่งที่สำคัญที่สุด
1. เดส
DES ชื่อเต็มคือ "มาตรฐานการเข้ารหัสข้อมูล" และชื่อภาษาจีนคือ "มาตรฐานการเข้ารหัสข้อมูล" เป็นอัลกอริทึมบล็อกที่ใช้การเข้ารหัสคีย์ อัลกอริทึม DES เป็นระบบการเข้ารหัสลับแบบสมมาตรในระบบการเข้ารหัสลับหรือที่เรียกว่ามาตรฐานการเข้ารหัสข้อมูลอเมริกัน มันเป็นอัลกอริทึมการเข้ารหัสระบบการเข้ารหัสแบบสมมาตรที่พัฒนาโดย IBM ในสหรัฐอเมริกาในปี 1972 ข้อความธรรมดาถูกจัดกลุ่มโดย 64 บิตและกุญแจคือวิธีการเข้ารหัส 56 บิตที่มีส่วนร่วมในการดำเนินการ DES (8th, 16, 24, 32, 40, 48, 56, 64 bits การทดแทนหรือแลกเปลี่ยนเพื่อสร้างวิธีการเข้ารหัสของกลุ่ม ciphertext
แพ็คเกจ com.amuro.strategy.des; นำเข้า Javax.crypto.cipher; นำเข้า Javax.crypto.keygenerator; นำเข้า Javax.crypto.secretkey; นำเข้า Javax.crypto.secretkeyforto org.apache.commons.codec.binary.hex; นำเข้า com.amuro.strategy.istrategy;/** * * @author amuro * */การดำเนินการของ Dessstrategy ระดับสาธารณะ {Cipher Cipher ส่วนตัว; Private SecretKey GenerateKey; String Public Encode (String SRC) {ลอง {KeyGenerator KeyGenerator = KeyGenerator.getInstance ("DES"); keygenerator.init (56); // ขนาด SecretKey SecretKey = Keygenerator.generateKey (); ไบต์ [] keybytes = secretKey.GetEncoded (); Deskeyspec Deskeyspec = ใหม่ Deskeyspec (keybytes); SecretKeyFactory SecretKeyFactory = SecretKeyFactory.GetInstance ("DES"); generateKey = SecretKeyFactory.GenerAtesecret (Deskeyspec); cipher = cipher.getInstance ("des/ecb/pkcs5padding"); cipher.init (cipher.encrypt_mode, generateKey); ไบต์ [] resultBytes = cipher.dofinal (src.getBytes ()); return hex.encodehexstring (resultbytes); } catch (exception e) {e.printstacktrace (); } return null; } การถอดรหัสสตริงสาธารณะ (สตริง src) {ลอง {cipher.init (cipher.decrypt_mode, generateKey); ไบต์ [] result = hex.decodehex (src.tochararray ()); ส่งคืนสตริงใหม่ (cipher.dofinal (ผลลัพธ์)); } catch (exception e) {e.printstacktrace (); } return null; -2. 3DES3DES หรือที่เรียกว่า "Triple DES" เรียกว่า "อัลกอริทึมการเข้ารหัสข้อมูลสามครั้ง" ซึ่งเทียบเท่ากับการใช้อัลกอริทึมการเข้ารหัส DES สามครั้งในแต่ละบล็อกข้อมูล เนื่องจากพลังคอมพิวเตอร์ที่ปรับปรุงแล้วความยาวคีย์ของรหัสผ่าน DES ดั้งเดิมได้กลายเป็นสิ่งที่ถูกบังคับอย่างง่ายดาย 3DES ได้รับการออกแบบมาเพื่อให้วิธีการที่ค่อนข้างง่ายเพื่อหลีกเลี่ยงการโจมตีที่คล้ายกันโดยการเพิ่มความยาวคีย์ของ DES แทนที่จะออกแบบอัลกอริทึมการเข้ารหัสบล็อกใหม่ล่าสุด
แพ็คเกจ com.amuro.strategy.des; นำเข้า Javax.crypto.cipher; นำเข้า Javax.crypto.keygenerator; นำเข้า Javax.crypto.secretkey; นำเข้า Javax.crypto.secretkeyforto org.apache.commons.codec.binary.hex; นำเข้า com.amuro.strategy.istrategy; คลาสสาธารณะ _3dessstrategy ดำเนินการ strategy {cipher cipher ส่วนตัว; Private SecretKey GenerateKey; String Public Encode (String SRC) {ลอง {KeyGenerator KeyGenerator = keyGenerator.getInstance ("desede"); keygenerator.init (168); // ขนาด SecretKey SecretKey = keygenerator.generateKey (); ไบต์ [] keybytes = secretKey.GetEncoded (); desedekeyspec deskeyspec = ใหม่ desedekeyspec (keybytes); SecretKeyFactory SecretKeyFactory = SecretKeyFactory.getInstance ("Desede"); generateKey = SecretKeyFactory.GenerAtesecret (Deskeyspec); cipher = cipher.getInstance ("desede/ecb/pkcs5padding"); cipher.init (cipher.encrypt_mode, generateKey); ไบต์ [] resultBytes = cipher.dofinal (src.getBytes ()); return hex.encodehexstring (resultbytes); } catch (exception e) {e.printstacktrace (); } return null; } การถอดรหัสสตริงสาธารณะ (สตริง src) {ลอง {cipher.init (cipher.decrypt_mode, generateKey); ไบต์ [] result = hex.decodehex (src.tochararray ()); ส่งคืนสตริงใหม่ (cipher.dofinal (ผลลัพธ์)); } catch (exception e) {e.printstacktrace (); } return null; -3. Aesaes ชื่อเต็มคือ "มาตรฐานการเข้ารหัสขั้นสูง" ชื่อภาษาจีนคือ "มาตรฐานการเข้ารหัสขั้นสูง" มันยังเป็นที่รู้จักกันว่าวิธีการเข้ารหัส Rijndael ในการเข้ารหัส มันเป็นมาตรฐานการเข้ารหัสบล็อกที่รัฐบาลสหรัฐฯใช้ ในฐานะที่เป็นมาตรฐานการเข้ารหัสข้อมูลรุ่นใหม่อัลกอริทึมการเข้ารหัส AES จะรวบรวมข้อดีของความปลอดภัยที่แข็งแกร่งประสิทธิภาพสูงประสิทธิภาพสูงความสะดวกในการใช้งานและความยืดหยุ่น การออกแบบ AES มีความยาวหลักสามประการ: 128, 192, 256 บิต การพูดค่อนข้างคีย์ 128 ของ AES นั้นแข็งแกร่งกว่า 56 คีย์ของ DES
แพ็คเกจ com.amuro.strategy.des; นำเข้า Javax.crypto.cipher; นำเข้า Javax.crypto.keygenerator; นำเข้า Javax.crypto.secretkey นำเข้า Javax.crypto.spec.secretkeyspec; คลาส Aessstrategy asstrategy {cipher cipher ส่วนตัว; Private SecretKey GenerateKey; String Public Encode (String SRC) {ลอง {KeyGenerator KeyGenerator = KeyGenerator.getInstance ("AES"); Keygenerator.init (128); // ขนาด SecretKey SecretKey = Keygenerator.generateKey (); ไบต์ [] keybytes = secretKey.GetEncoded (); generateKey = ใหม่ SecretKeySpec (KeyBytes, "AES"); cipher = cipher.getInstance ("AES/ECB/PKCS5Padding"); cipher.init (cipher.encrypt_mode, generateKey); ไบต์ [] resultBytes = cipher.dofinal (src.getBytes ()); return hex.encodehexstring (resultbytes); } catch (exception e) {e.printstacktrace (); } return null; } การถอดรหัสสตริงสาธารณะ (สตริง src) {ลอง {cipher.init (cipher.decrypt_mode, generateKey); ไบต์ [] result = hex.decodehex (src.tochararray ()); ส่งคืนสตริงใหม่ (cipher.dofinal (ผลลัพธ์)); } catch (exception e) {e.printstacktrace (); } return null; - 4. PBE
PBE ชื่อเต็ม "การเข้ารหัสฐานรหัสผ่าน" เป็นอัลกอริทึมการเข้ารหัสด้วยรหัสผ่าน คุณลักษณะของมันคือใช้รหัสผ่านแทนคีย์และรหัสผ่านได้รับการจัดการโดยผู้ใช้เอง หมายเลขสุ่มแฮชการเข้ารหัสหลายครั้งและวิธีการอื่น ๆ เพื่อให้แน่ใจว่าความปลอดภัยของข้อมูล
อัลกอริทึม PBE ไม่มีแนวคิดของคีย์และถือว่ารหัสผ่านเป็นคีย์ เนื่องจากความยาวของคีย์มีผลต่อความปลอดภัยของอัลกอริทึมและไม่สะดวกสำหรับหน่วยความจำจึงแตกต่างกันมากสำหรับเราที่จะใช้รหัสผ่านที่เราใช้ที่นี่โดยตรงซึ่งสะดวกสำหรับหน่วยความจำของเรา อย่างไรก็ตามรหัสผ่านง่าย ๆ จะหมดไปได้อย่างง่ายดายด้วยวิธีการพจนานุกรมดังนั้นเราจึงเพิ่ม "เกลือ" ลงในรหัสผ่านที่นี่ การรวมกันของเกลือและรหัสผ่านนี้ยากที่จะแตก ในเวลาเดียวกันเรารวมเกลือและรหัสผ่านและวนซ้ำหลายครั้งด้วยอัลกอริทึมการย่อยข้อความเพื่อสร้างวัสดุพื้นฐานของเวกเตอร์การเริ่มต้นที่สำคัญทำให้การถอดรหัสยากยิ่งขึ้น
แพ็คเกจ com.amuro.strategy.pbe; นำเข้า java.security.securerandom; นำเข้า Javax.crypto.cipher; นำเข้า Javax.crypto.secretkey นำเข้า Javax.crypto.secretkey; javax.crypto.spec.pbeparameterspec; นำเข้า org.apache.commons.codec.binary.hex; นำเข้า com.amuro.strategy.istrategy;/** * การเข้ารหัสด้วยรหัสผ่าน (รหัสผ่าน) Private SecretKey GenerateKey; PBEPARAMETERSPEC ส่วนตัว PBEPARAMETERSPEC; การเข้ารหัสสตริงสาธารณะ (สตริง src) {ลอง {securerandom securerandom = new Securerandom (); ไบต์ [] เกลือ = Securerandom.Generateseed (8); String Password = "Amuro"; PBEKESSPEC PBEKESSPEC = ใหม่ PBEKESSPEC (password.toCharArray ()); SecretKeyFactory SecretKeyFactory = SecretKeyFactory.GetInstance ("PBEWITHMD5ANDDES"); generateKey = secretKeyFactory.GenerAtesecret (pbekeyspec); pbeparameterspec = ใหม่ pbepparameterspec (เกลือ, 100); cipher = cipher.getInstance ("PBEWITHMD5ANDDES"); CIPHER.INIT (CIPHER.ENCRYPT_MODE, GENERATEKEY, PBEPARAMETERSPEC); ไบต์ [] resultBytes = cipher.dofinal (src.getBytes ()); return hex.encodehexstring (resultbytes); } catch (exception e) {e.printstacktrace (); } return null; } การถอดรหัสสตริงสาธารณะ (สตริง src) {ลอง {cipher.init (cipher.decrypt_mode, generateKey, pbeparameterspec); ไบต์ [] result = hex.decodehex (src.tochararray ()); ส่งคืนสตริงใหม่ (cipher.dofinal (ผลลัพธ์)); } catch (exception e) {e.printstacktrace (); } return null; - 5. การเข้ารหัสแบบอสมมาตร <br /> อัลกอริทึมการเข้ารหัสแบบไม่สมมาตรต้องใช้สองปุ่มเพื่อเข้ารหัสและถอดรหัส ได้แก่ คีย์สาธารณะและคีย์ส่วนตัว สิ่งหนึ่งที่ควรทราบคือคีย์สาธารณะและคีย์ส่วนตัวจะต้องเป็นคู่ หากข้อมูลถูกเข้ารหัสด้วยคีย์สาธารณะคุณสามารถถอดรหัสคีย์ส่วนตัวที่สอดคล้องกันได้เท่านั้นและในทางกลับกัน เนื่องจากการเข้ารหัสและการถอดรหัสใช้สองปุ่มที่แตกต่างกันอัลกอริทึมนี้เรียกว่าอัลกอริทึมการเข้ารหัสแบบไม่สมมาตร
1. RSA
ในความเป็นจริง RSA ปรากฏตัวเร็วที่สุดเท่าที่ปี 1978 และเป็นอัลกอริทึมแรกที่สามารถใช้สำหรับการเข้ารหัสข้อมูลและลายเซ็นดิจิตอล เป็นเรื่องง่ายที่จะเข้าใจและใช้งานได้และยังเป็นที่นิยมมาก หลักการเป็นไปตามที่อธิบายไว้ในกระบวนการทำงานข้างต้น อัลกอริทึม RSA นั้นขึ้นอยู่กับความจริงของทฤษฎีจำนวนง่ายมาก: เป็นเรื่องง่ายที่จะคูณตัวเลขขนาดใหญ่สองตัว แต่มันยากมากที่จะแยกปัจจัยผลิตภัณฑ์ของพวกเขาดังนั้นผลิตภัณฑ์จึงสามารถเปิดเผยได้ว่าเป็นคีย์การเข้ารหัส
แพ็คเกจ com.amuro.strategy.asymmetric; นำเข้า java.security.keyfactory; นำเข้า Java.security.keypair; นำเข้า Java.security.keypairgenerator; นำเข้า Java.security.privatekey; java.security.interfaces.rsapublickey นำเข้า Java.security.spec.pkcs8encodedkeyspec; นำเข้า Java.security.spec.x509encodedkeyspec; นำเข้า Javax.crypto.cipher; คลาส rsastrategy ใช้ strategy {ส่วนตัว rsapublickey rsapublickey; rsaprivatekey ส่วนตัว rsaprivatekey; String Public Encode (String Src) {ลอง {// เริ่มต้นคีย์ KeypairGenerator KeypairGenerator = KeypairGenerator.getInstance ("RSA"); KeypairGenerator.initialize (512); KEYPAIR KEYPAIR = KEYPAIRENERATOR.GenerateKeyPair (); RSAPUBLICKEY = (RSAPUBLICKEY) KEYPAIR.GETPOBLIC (); rsaprivatekey = (rsaprivatekey) keypair.getPrivate (); // คีย์ส่วนตัวการเข้ารหัสคีย์สาธารณะการถอดรหัส PKCS8ENCODEDKEYSPEC PKCS8ENCODEDKEYSPEC = ใหม่ PKCS8ENCODEDKEYSPEC (RSAPRIVATEKEY.GETENCODED ()); keyFactory keyFactory = keyFactory.getInstance ("RSA"); PrivateKey Privateing = keyFactory.generatePrivate (PKCS8ENCODEDKEYSPEC); Cipher Cipher = Cipher.GetInstance ("RSA"); cipher.init (cipher.encrypt_mode, PrivateKey); ไบต์ [] resultBytes = cipher.dofinal (src.getBytes ()); // การถอดรหัสคีย์ส่วนตัวการเข้ารหัสคีย์สาธารณะ // x509encodedkeyspec x509encodedkeyspec = // ใหม่ x509encodedkeyspec (rsapublickey.getencoded ()); // keyfactory keyfactory = keyFactory.getInstance ("RSA"); // keyFactory.generatePublic (x509Encodedkeyspec); // cipher cipher = cipher.getInstance ("rsa"); // cipher.init (cipher.encrypt_mode, publickey); // byte [] resultbytes = cipher.dofinal return hex.encodehexstring (resultbytes); } catch (exception e) {e.printstacktrace (); } return null; } Public String Decode (String Src) {ลอง {// คีย์ส่วนตัวการเข้ารหัสคีย์สาธารณะการถอดรหัสการถอดรหัสสาธารณะ X509ENCODEDKEYSPEC X509ENCODEDKEYSPEC = ใหม่ X509ENCODEDKEYSPEC (RSAPUBLICKEY.GETENCODED ()); keyFactory keyFactory = keyFactory.getInstance ("RSA"); PublicKey = keyFactory.generatePublic (x509EncodedKeyspec); Cipher Cipher = Cipher.GetInstance ("RSA"); cipher.init (cipher.decrypt_mode, PublicKey); ไบต์ [] resultBytes = cipher.dofinal (hex.decodehex (src.tochararray ())); // การถอดรหัสคีย์ส่วนตัวการเข้ารหัสคีย์สาธารณะ // pkcs8encodedkeyspec pkcs8encodedkeyspec // = ใหม่ pkcs8encodedkeyspec (rsaprivatekey.getencoded ()); KeyFactory.generatePrivate (PKCS8ENCODEDKEYSPEC); // CIPHER CIPHER = CIPHER.GETINSTANCE ("RSA"); // CIPHER.INIT (CIPHER.DECRYPT_MODE, PrivateKey); ส่งคืนสตริงใหม่ (resultbytes); } catch (exception e) {e.printstacktrace (); } return null; - 2. อัลกอริทึม DH
DH ชื่อเต็ม "Diffie-Hellman" เป็นวิธีการเพื่อให้แน่ใจว่าคีย์ที่ใช้ร่วมกันได้อย่างปลอดภัยข้ามเครือข่ายที่ไม่ปลอดภัยซึ่งมักเรียกว่าโปรโตคอลฉันทามติที่สำคัญ แนวคิดที่เสนอโดย Diffie และ Hellman ผู้ก่อตั้งระบบการเข้ารหัสกุญแจสาธารณะ พูดง่ายๆคือการอนุญาตให้ผู้ใช้สองคนแลกเปลี่ยนข้อมูลเกี่ยวกับสื่อสาธารณะเพื่อสร้าง "สอดคล้อง" และคีย์ที่แชร์ได้ นั่นคือปาร์ตี้ A ผลิตคู่ของคีย์ (คีย์สาธารณะ, คีย์ส่วนตัว) และ Party B สร้างคู่คีย์ของพรรค B (คีย์สาธารณะ, คีย์ส่วนตัว) ตามคีย์สาธารณะของ Party A
การใช้สิ่งนี้เป็นพื้นฐานเป็นพื้นฐานสำหรับการรักษาความลับการส่งข้อมูลทั้งสองฝ่ายใช้อัลกอริทึมการเข้ารหัสแบบสมมาตรเดียวกันเพื่อสร้างคีย์ท้องถิ่น (SecretKey) เพื่อเข้ารหัสข้อมูล ด้วยวิธีนี้หลังจากอัลกอริทึมคีย์ท้องถิ่น (SecretKey) สามารถทำงานร่วมกันได้ Party A และ Party B เปิดเผยกุญแจสาธารณะเข้ารหัสข้อมูลโดยใช้คีย์สาธารณะของอีกฝ่ายและคีย์ส่วนตัวที่สร้างขึ้นและในเวลาเดียวกันพวกเขาสามารถใช้คีย์สาธารณะของอีกฝ่าย ไม่เพียง แต่ทั้งสองฝ่าย A และ B เท่านั้น แต่ยังสามารถขยายไปสู่การสื่อสารข้อมูลที่ใช้ร่วมกันหลายฝ่ายซึ่งเสร็จสิ้นการสื่อสารที่ปลอดภัยของข้อมูลเครือข่ายแบบโต้ตอบ!
แพ็คเกจ com.amuro.strategy.asymmetric; นำเข้า java.security.keyfactory; นำเข้า Java.security.keypair; นำเข้า Java.security.keypairgenerator; นำเข้า Java.security.privatekey; java.util.Objects; นำเข้า Javax.crypto.cipher; นำเข้า Javax.crypto.keyagreement; นำเข้า Javax.crypto.secretkey นำเข้า Javax.crypto.interfaces.dhpublickey; org.apache.commons.codec.binary.hex; นำเข้า com.amuro.strategy.istrategy; การใช้งานระดับสาธารณะ Dhstrategy onstrategy {cipher cipher ส่วนตัว; Private SecretKey รับคีย์คีย์; String Public Encode (String SRC) {ลอง {// เริ่มต้นคีย์ผู้ส่งคีย์ KypairGenerator SenderKeyPairGenerator = KeypairGenerator.getInstance ("DH"); SenderKeyPairGenerator.initialize (512); KEYPAIR SENDERKEYPAIR = SENDERKEYPAIRGENERATOR.GenerateKeyPair (); PrivateKey SenderPrivateKey = SenderKeyPair.getPrivate (); BYTE [] SenderPublicKeyBytes = SenderKeyPair.getPublic (). getEncoded (); // คีย์สาธารณะของผู้ส่ง // เริ่มต้นคีย์ของผู้รับใช้คีย์คีย์คีย์สาธารณะของผู้ส่ง X509ENCODEDKEYSPEC X509ENCODEDKEYSPEC = ใหม่ X509ENCODEDKEYSPEC (SenderPublicKeyBytes); PublicKey ReceiverPublicKey = teadkeyFactory.generatePublic (X509ENCODEDKEYSPEC); DHParameterspec DhParameterspec = ((DHPublickey) TeadPublickey) .getParams (); KEYPAIRGENERATOR TECIVERKEYPAIRGENERATOR = KEYPAIRGENERATOR.GETINSTANCE ("DH"); ReceiverKeyPairGenerator.initialize (DHParametersPec); KEYPAIR TECIVERKEYPAIR = TEACHEIVERKEYPAIRENERATOR.GenerateKeyPair (); PrivateKey ReceiverPrivateKey = teadKeyPair.getPrivate (); BYTE [] ReceiverPublicKeyBytes = teadKeyPair.getPublic (). getenCoded (); keyagreement receiverkeyagreement = keyagreement.getInstance ("DH"); รับ keyAgreement.init (รับ privateKey); รับ keyagreement.dophase (Teadpublickey, True); rectiversecretkey = teadkeyagreement.generatesecret ("des"); // ผู้ส่งสามารถเข้ารหัสได้โดยรับคีย์สาธารณะของผู้รับ keyFactory senderKeyFactory = keyFactory.getInstance ("DH"); X509ENCODEDKEYSPEC = ใหม่ X509ENCODEDKEYSPEC (รับ PublicKeyBytes); PublicKey SenderPublicKey = SenderKeyFactory.GeneratePublic (X509ENCODEDKEYSPEC); keyagreement senderKeyAgreement = keyagreement.getInstance ("DH"); SenderKeyAgreement.Init (SenderPrivateKey); SenderKeyAgreement.dophase (SenderPublickey, True); SecretKey SendersecretKey = SenderKeyAgreement.generAtesecret ("DES"); if (objects.equals (receversecretkey, sendersecretkey)) {cipher = cipher.getInstance ("des"); cipher.init (cipher.encrypt_mode, sendersecretkey); ไบต์ [] result = cipher.dofinal (src.getBytes ()); return hex.encodehexstring (ผลลัพธ์); }} catch (exception e) {e.printstacktrace (); } return null; } Public String Decode (String Src) {ลอง {cipher.init (cipher.decrypt_mode, teadiversecretkey); ไบต์ [] result = hex.decodehex (src.tochararray ()); ส่งคืนสตริงใหม่ (cipher.dofinal (ผลลัพธ์)); } catch (exception e) {e.printstacktrace (); } return null; - 6. การเข้ารหัสแบบอสมมาตรของใบรับรองลายเซ็นดิจิตอลนั้นปลอดภัยอยู่แล้ว แต่มีข้อบกพร่องอื่น:
เซิร์ฟเวอร์ A เผยแพร่คีย์สาธารณะ คอมพิวเตอร์ของฉันเข้ารหัสข้อมูลด้วยคีย์สาธารณะของ Server A แล้วส่งไปยัง Server A ในเวลานี้ Server B บุกคอมพิวเตอร์ของฉันและแทนที่คีย์สาธารณะที่ฉันใช้เพื่อเข้ารหัสด้วยคีย์สาธารณะดังนั้นข้อมูลที่ฉันส่งออกจะถูกแคร็กโดยคีย์ส่วนตัวของ Server B จะป้องกันไม่ให้กุญแจสาธารณะถูกดัดแปลงด้วย?
ใช่เราคิดถึงสรุปข้อความก่อนหน้านี้ เมื่อเซิร์ฟเวอร์ขว้างคีย์สาธารณะให้ฉันเขาก็ไปที่ CA เพื่อสมัครใบรับรองดิจิตอล ในความเป็นจริงส่วนใหญ่เป็นข้อความสรุปของคีย์สาธารณะ ด้วยใบรับรองนี้เมื่อฉันเข้ารหัสด้วยคีย์สาธารณะฉันสามารถตรวจสอบได้ก่อนว่าคีย์สาธารณะปัจจุบันได้รับการยืนยันว่าจะส่งมาให้ฉันโดยเซิร์ฟเวอร์ A.
นี่คือ RSA ชนิดหนึ่ง:
แพ็คเกจ com.amuro.strategy.signature; นำเข้า java.security.keyfactory; นำเข้า java.security.keypair; นำเข้า java.security.keypairgenerator; นำเข้า Java.security.privatekey; นำเข้า Java.security.publickey java.security.interfaces.rsaprivatekey; นำเข้า Java.security.interfaces.rsapublickey; นำเข้า Java.security.spec.pkcs8encodedkeyspec; นำเข้า Java.security KEYPAIRGENERATOR KEYPAIRGENERATOR = KEYPAIRENERATOR.GETINSTANCE ("RSA"); KeypairGenerator.initialize (512); KEYPAIR KEYPAIR = KEYPAIRENERATOR.GenerateKeyPair (); PublicKey RSAPUBLICKEY = (RSAPUBLICKEY) KEYPAIR.GETPOBLIC (); PrivateKey RSAPRIVATEKEY = (RSAPRIVATEKEY) KEYPAIR.GETPRIVATE (); PKCS8ENCODEDKEYSPEC PKCS8ENCODEDKEYSPEC = ใหม่ PKCS8ENCODEDKEYSPEC (RSAPRIVATEKEY.GETENCODED ()); keyFactory keyFactory = keyFactory.getInstance ("RSA"); PrivateKey Privateing = keyFactory.generatePrivate (PKCS8ENCODEDKEYSPEC); ลายเซ็น = Signature.getInstance ("MD5WithRSA"); Signature.initsign (Private Key); signature.update (src.getBytes ()); // สร้างลายเซ็นไบต์ไบต์ไบต์ [] signBytes = signature.sign (); X509ENCODEDKEYSPEC X509ENCODEDKEYSPEC = ใหม่ X509ENCODEDKEYSPEC (RSAPUBLICKEY.GETENCODED ()); keyFactory = keyFactory.getInstance ("RSA"); PublicKey = keyFactory.generatePublic (x509EncodedKeyspec); Signature = Signature.getInstance ("MD5WithRSA"); Signature.initverify (PublicKey); signature.update (src.getBytes ()); บูลีน isverified = signature.verify (signbytes); return isverified; } catch (exception e) {e.printstacktrace (); } return false; - เกี่ยวกับการใช้ลายเซ็นดิจิตอลและอัลกอริธึมการเข้ารหัสแบบอสมมาตรฉันยังเห็นตัวอย่างที่ดีและฉันจะแบ่งปันกับคุณ:
อนิจจาฉันซื้อหนังสือมากเกินไปในเดือนนี้และฉันไม่สามารถนำออกมาได้จนถึงสิ้นเดือน ฉันเกิดขึ้นเพื่อพบกับคลาร์กใน QQ:
1-2-3: "คลาร์กฉันต้องการ 200 Tael Silver ฉันสามารถให้ยืมกับฉันได้ไหม"
คลาร์ก: "ไม่มีปัญหาฉันจะโอนเงินให้คุณตอนนี้โปรดให้ฉันฉัน"
1-2-3: "ขอบคุณมากฉันจะเขียนคำพูดให้คุณ"
จากนั้นฉันสร้างเอกสาร Word ใหม่เขียน IOU และบันทึกไว้ ถ้าอย่างนั้นฉันควรทำอย่างไร? ฉันไม่สามารถส่ง IOU ไปที่คลาร์กได้โดยตรงด้วยเหตุผล:
1. ฉันไม่สามารถรับประกันได้ว่าคลาร์กจะไม่เปลี่ยน "200 Taels of Silver" เป็น "2000 Taels of Silver" หลังจากได้รับ IOU
2. ถ้าฉันพลาดหนี้คลาร์กไม่สามารถพิสูจน์ได้ว่าฉันเขียน IOU
3. เอกสารคำทั่วไปไม่สามารถใช้เป็นหลักฐานของการฟ้องร้อง
โชคดีที่ฉันได้สมัครใบรับรองดิจิตอล ก่อนอื่นฉันเข้ารหัส IOU ด้วยคีย์ส่วนตัวของฉันจากนั้นส่ง ciphertext ที่เข้ารหัสไปยัง Clark ใน QQ หลังจากที่คลาร์กได้รับ ciphertext ของ IOU เขาดาวน์โหลดคีย์สาธารณะของฉันบนเว็บไซต์ของศูนย์รับรองใบรับรองดิจิตอลจากนั้นใช้คีย์สาธารณะของฉันเพื่อถอดรหัส CipherText เขาพบว่ามันถูกเขียนเป็น "200 taels ของเงินยืม" ดังนั้นคลาร์กสามารถให้เงินฉันด้วยความมั่นใจ ฉันไม่ต้องกังวลว่าคลาร์กจะงัดแงะกับ IOU ของฉันเพราะ:
1. เนื่องจาก CipherText ที่ฉันส่งไปยัง Clark คลาร์กไม่สามารถแก้ไขได้ คลาร์กสามารถปรับเปลี่ยน IOU ที่ถอดรหัสได้ แต่คลาร์กไม่มีรหัสส่วนตัวของฉันดังนั้นมันจึงไม่สามารถเลียนแบบฉันเข้ารหัส IOU ได้ สิ่งนี้เรียกว่าการป้องกันการงัดแงะ
2. เนื่องจาก IOU เข้ารหัสด้วยคีย์ส่วนตัวของฉันมีและเฉพาะกุญแจสาธารณะของฉันที่สามารถถอดรหัสได้ ในทางกลับกัน IOU ที่สามารถถอดรหัสได้ด้วยคีย์สาธารณะของฉันจะต้องเข้ารหัสด้วยคีย์ส่วนตัวของฉันและฉันเท่านั้นที่เป็นเจ้าของคีย์ส่วนตัวของฉันดังนั้นคลาร์กจึงสามารถพิสูจน์ได้ว่าฉันเขียนโดยฉัน สิ่งนี้เรียกว่า Anti-Debt
3. ถ้าฉันไม่จ่ายเงินคืนคลาร์กฟ้องฉันในศาลและเอกสารคำนี้ที่เข้ารหัสด้วยคีย์ส่วนตัวของฉันสามารถใช้เป็นใบรับรองของเฉิงถังได้ เนื่องจากประเทศของเราได้ออก "กฎหมายลายเซ็นอิเล็กทรอนิกส์ของสาธารณรัฐประชาชนจีน" ซึ่งทำให้ลายเซ็นดิจิทัลมีประสิทธิภาพตามกฎหมาย
คุณต้องสังเกตว่า IOU นี้ที่เข้ารหัสด้วยคีย์ส่วนตัวของฉันมีลักษณะของการดัดแปลงและต่อต้านหนี้และสามารถใช้เป็นใบรับรองของเฉิงตังซึ่งเป็นผลกระทบของ "การลงนาม" IOU นี้ อย่างไรก็ตามกระบวนการของ "การเข้ารหัส Ious ด้วยคีย์ส่วนตัวของฉัน" เรียกว่าลายเซ็นดิจิตอล
นี่เป็นบทความสรุปซึ่งเขียนเทคโนโลยีการเข้ารหัส Java ที่ใช้กันทั่วไปและรหัสหลักที่นี่เพื่ออ้างอิงโดยเพื่อน