อัลกอริทึมการเข้ารหัสทั่วไป
อัลกอริทึมการเข้ารหัสทางเดียวพื้นฐาน:
Base64 พูดอย่างเคร่งครัดมันเป็นของรูปแบบการเข้ารหัสไม่ใช่อัลกอริทึมการเข้ารหัส
MD5 (MessageDigestAlgorithm5, อัลกอริทึมข้อมูลย่อย)
SHA (SecureHashalgorithm, Secure Hash Algorithm)
HMAC (HashMessageAuthenticationCode, รหัสการตรวจสอบข้อความแฮชข้อความ)
การเข้ารหัสแบบสมมาตรที่ซับซ้อน (DES, PBE), อัลกอริทึมการเข้ารหัสแบบไม่สมมาตร:
DES (DataEncryptionstandard, อัลกอริทึมการเข้ารหัสข้อมูล)
PBE (ใช้รหัสผ่านตามการตรวจสอบรหัสผ่าน)
RSA (ชื่ออัลกอริทึมได้รับการตั้งชื่อตามนักประดิษฐ์: Ronrivest, Adi Shamir และ Leonard Adleman)
DH (อัลกอริทึม Diffie-Hellman, Key Constressency Protocol)
DSA (อัลกอริทึม DigitalSignature, Digital Signature)
ECC (Cryptography Curves Curves)
ลายเซ็นดิจิตอล
คำอธิบายสั้น ๆ ของอัลกอริทึม
อัลกอริทึมลายเซ็นดิจิตอลสามารถถือได้ว่าเป็นอัลกอริทึมการย่อยข้อความด้วยคีย์และคีย์นี้มีทั้งสาธารณะและคีย์ส่วนตัว กล่าวคืออัลกอริทึมลายเซ็นดิจิตอลเป็นการรวมกันของอัลกอริทึมการเข้ารหัสแบบไม่สมมาตรและอัลกอริทึมการย่อยข้อความ
คุณสมบัติ
อัลกอริทึมลายเซ็นดิจิตอลต้องการความสามารถในการตรวจสอบความสมบูรณ์ของข้อมูลรับรองความถูกต้องของแหล่งข้อมูลและมีบทบาทในการต่อต้านการปฏิเสธ
หลักการ
อัลกอริทึมลายเซ็นดิจิตอลประกอบด้วยการดำเนินการสองครั้ง: ลายเซ็นและการตรวจสอบซึ่งเป็นไปตามวิธีการของลายเซ็นกุญแจส่วนตัวและการตรวจสอบคีย์สาธารณะ
เมื่อลงนามควรใช้คีย์ส่วนตัวและข้อมูลที่จะลงนาม เมื่อตรวจสอบควรใช้คีย์สาธารณะค่าลายเซ็นและข้อมูลที่จะลงนาม อัลกอริทึมหลักส่วนใหญ่เป็นอัลกอริทึมการย่อยข้อความ
1. ข้อความสรุป
สตริง beforedegist = "asdf"; System.out.println ("ก่อน" สรุป: "+beforedegist); // ข้อมูลเริ่มต้นควรถูกแปลงเป็นไบต์ไบต์ไบต์ [] plaintext = beforedegist.getBytes (" utf8 "); // ใช้ getinstance (" Algorithm ") MessageDigest = MessageDigest.getInstance ("sha-1"); afterdegist = สตริงใหม่ (messageGeSt.digest (), "utf8");2. การเข้ารหัสคีย์ส่วนตัว
/*** ตัวอย่างนี้คือการเข้ารหัสข้อมูลสตริงด้วยคีย์ส่วนตัวแล้วถอดรหัสด้วยคีย์ส่วนตัวเพื่อตรวจสอบว่ามันสอดคล้องกันหรือไม่ คีย์ส่วนตัวถูกเข้ารหัสซึ่งเป็นการเข้ารหัสแบบสมมาตร* โดยใช้อัลกอริทึมสมมาตร ตัวอย่างเช่น: A ใช้กุญแจในการเข้ารหัสไฟล์และ B ต้องการคีย์เดียวกับ A และทั้งสองฝ่ายแชร์ A * Crivate Key (และในสภาพแวดล้อมเว็บคีย์ส่วนตัวจะฟังได้ง่ายเมื่อผ่านไป) * * สิ่งที่แนบมา: อัลกอริทึมสมมาตรหลักคือ: BITS 26 BITS 26 BITS */ <span style = "space สีขาว: pre;"> </span> สตริงก่อน = "asdf"; ไบต์ [] plaintext = ก่อนหน้า. getBytes ("UTF8"); // ขั้นตอนที่ 1 System.out.println ("เริ่มสร้างคีย์ AES"); // รับอินสแตนซ์ของ keygenerator โดยใช้อัลกอริทึม Keygenerator Keygen = keygenerator.getInstance ("AES"); keygen.generatekey (); system.out.println ("เสร็จสิ้นการสร้าง aes key ="+คีย์);// ขั้นตอนที่ 2
// รับรหัสการเข้ารหัสคีย์ส่วนตัวการกำหนดข้อมูลพื้นฐานของ cipher: ECB เป็นวิธีการเข้ารหัสและ PKCS5Padding เป็นวิธีการเติม Cipher Cipher = Cipher.GetInstance ("AES/ECB/PKCS5PADDING"); //system.out.println("/n " + cipher.getProvider (). getInfo ());// ขั้นตอนที่ 3
// ใช้คีย์ส่วนตัวเพื่อเข้ารหัส System.out.println ("/n เข้ารหัสด้วยคีย์ส่วนตัว ... "); // ใช้คีย์ที่สร้างขึ้นเป็นพารามิเตอร์และเริ่มต้นคลาสการเข้ารหัสโดยใช้คีย์ส่วนตัวที่ได้รับตอนนี้ cipher.encrypt_mode หมายถึงการเข้ารหัส cipher.init (cipher.encrypt_mode, key); // คลาสการเข้ารหัสคีย์ส่วนตัว cipher cipher ถูกเข้ารหัสและหลังจากการเข้ารหัส, ไบต์สตรีมถูกส่งคืน byte [] byte [] ciphertext = ciphertext "UTF8"); System.out.println ("สมบูรณ์ด้วยการเข้ารหัสคีย์ส่วนตัว:"+หลัง 1);// ขั้นตอนที่ 4
[java] ดูสำเนาธรรมดา // ใช้คีย์ส่วนตัวเพื่อถอดรหัสข้อมูลที่เข้ารหัสตอนนี้เพื่อดูว่ามันสอดคล้องกันหรือไม่ cipher.decrypt_mode หมายถึงคีย์การถอดรหัส System.out.println ("/n decrypts กับคีย์ส่วนตัว ... "); cipher.init (cipher.decrypt_mode, key); // decrypts byte stream ที่เข้ารหัส cipher.dofinal (ciphertext); string after2 = สตริงใหม่ (newplaintext, "utf8"); system.out.println ("ถอดรหัสด้วยคีย์ส่วนตัว:"+หลัง 2);3. การเข้ารหัสคีย์สาธารณะ
String ก่อน = "ASDF"; byte [] plaintext = ก่อนหน้า. getBytes ("UTF8"); // สร้างคีย์คีย์ KeyGenerator (ตามชื่อหมายถึง: คู่ของเครื่องกำเนิดคีย์) Keygenalator Keygen24 คีย์ผ่าน KeypairGenerator, หมายเหตุ: คีย์นี่คือคู่ของคีย์! - Keypair key = keygen.generateKeyPair (); // รับคลาส RSA cipher, เข้ารหัสโดยใช้รหัสสาธารณะรหัสสาธารณะ = cipher.getInstance ("RSA/ECB/PKCS1PADDING"); System.out.println ("/n เข้ารหัสด้วยคีย์สาธารณะ ... "); // cipher.encrypt_mode หมายถึงการเข้ารหัสรับกุญแจสาธารณะจากคู่ของ keys.getpublic () cipher.init (cipher.encrypt_mode, key.getpublic (); cipher.dofinal (plaintext); // แปลงสตรีมไบต์เป็นสตริงในสตริงรูปแบบ UTF8 หลังจาก 1 = สตริงใหม่ (CipherText, "UTF8"); System.out.println ("ใช้การเข้ารหัสคีย์สาธารณะ:"+หลังจาก 1); // decrypt system.out.println ("/ndecrypt พร้อมคีย์ส่วนตัว ... "); // cipher.decrypt_mode หมายถึงโหมดการถอดรหัสได้รับคีย์ส่วนตัว key.getPrivate ()); // decrypt ด้วยคีย์ส่วนตัวและส่งคืนไบต์ไบต์ไบต์ [] newPlaintext = cipher.dofinal (ciphertext); สตริงหลังจาก 2 = สตริงใหม่ (newplaintext, "utf8"); system.out.println ("การถอดรหัสด้วยคีย์ส่วนตัว:"4. ลายเซ็นดิจิตอล
/*** ตัวอย่างนี้เป็นตัวอย่างของลายเซ็นดิจิตอล ใช้คีย์ส่วนตัว RSA เพื่อลงนามในข้อความ Digest (นี่หมายถึงข้อมูลต้นฉบับ) จากนั้นใช้คีย์สาธารณะเพื่อตรวจสอบลายเซ็น * * A เข้ารหัสข้อมูลด้วยคีย์สาธารณะของ B และส่งไปยัง B. B ใช้คีย์ส่วนตัวของ B คีย์สาธารณะของ B เพื่อเข้ารหัสสำเนาของข้อมูลและส่งไปที่ B ด้วยวิธีนี้คำถามคือข้อมูลที่ได้รับจาก B หรือไม่? B และความต้องการในการเตรียมสองส่วน: 1 และ 2 * 1: A ใช้กุญแจสาธารณะของ B เพื่อเข้ารหัสข้อมูลดั้งเดิมเพื่อใช้เป็นความลับ (เฉพาะคีย์ส่วนตัวของ B เท่านั้นที่สามารถเปิดออกได้ แต่คนอื่น ๆ ไม่สามารถถอดปุ่มอื่น ๆ ได้ ส่งผ่านไปยัง B. ในเวลาเดียวกัน C ใช้คีย์ส่วนตัวของ C เพื่อลงนามข้อมูลใด ๆ กับ B. สิ่งที่ B ต้องการยอมรับคือข้อมูลของ A (เช่นคำขอโอน) ดังนั้น B * decrypts ข้อมูลทั้งสองที่ได้รับผ่านกุญแจสาธารณะของ A ก่อนหน้า. getBytes ("UTF8"); // สร้างคีย์คู่สาธารณะ RSA Keygenerator KeyGen = KeypairGenerator.getInstance ("RSA"); keygen.initialize (1024); Keypair key = keygen.generatekeypair (); // ลงชื่อเข้าใช้คีย์ส่วนตัว ***************************************************************************************************************** sig.initsign (key.getPrivate ()); // วัตถุ SIG ได้รับคีย์ส่วนตัว // วัตถุที่ลงนามได้รับข้อมูลต้นฉบับ sig.update (plaintext); // วัตถุ SIG ได้รับข้อมูลดั้งเดิม (ในความเป็นจริงการย่อยของข้อมูลดั้งเดิม) sig.sign (); // วัตถุ SIG ใช้คีย์ส่วนตัวเพื่อลงนามข้อมูลต้นฉบับและรับลายเซ็นหลังจากเซ็นลายเซ็น EM.OUT.PRINTLN (SIG.GETPROVIDER (). getInfo ()); สตริงหลังจาก 1 = สตริงใหม่ (ลายเซ็น, "utf8"); system.out.println ("/nsign กับคีย์ส่วนตัว:"+หลังจาก 1); // ใช้กุญแจสาธารณะเพื่อตรวจสอบ sig.initverify (key.getPublic ()); (sig.Verify (ลายเซ็น)) {// SIG วัตถุถอดรหัสลายเซ็นด้วยรหัสสาธารณะเพื่อรับข้อมูลต้นฉบับ (เช่นสรุป) ถ้าระบบจริง. เอาท์. println ("การตรวจสอบลายเซ็นถูกต้อง !!" +สตริงใหม่ (plainText, "UTF8")); {system.out.println ("การตรวจสอบลายเซ็นล้มเหลว !!");}5. ใบรับรองดิจิตอล
/*** ตัวอย่างนี้คือการดำเนินการบนไฟล์ "ใบรับรองดิจิตอล"* แพลตฟอร์ม Java (การติดตั้ง JDK บนเครื่อง) ให้คุณมีคีย์สโตร์ (ไลบรารีใบรับรอง) คำสั่ง keytool มีให้ภายใต้ CMD เพื่อสร้างไลบรารีใบรับรอง * * ก่อนที่จะเรียกใช้ตัวอย่างนี้: * สร้างใบรับรองในไดเรกทอรี C Disk ให้ระบุไลบรารีใบรับรองให้เป็น bocsoftkeylib และสร้างใบรับรองด้วยการทดสอบนามแฝง มันระบุว่ามันถูกสร้างขึ้นโดยใช้อัลกอริทึม * RSA และความยาวคีย์คือ 1024 และใบรับรองนั้นใช้ได้กับ 1 ปี * ไฟล์ใบรับรองการส่งออกคือ tc.cer ซึ่งเก็บไว้แล้วในดิสก์ท้องถิ่น C:/ * รหัสผ่าน // อ่านข้อมูลใบรับรองจากไฟล์ใบรับรอง tc.cer certificateFactory cf = certificateFactory.getInstance ("x.509"); fileInputStream ใน = ใหม่ FileInputStream ("C: /tc.cer"); การแปลงเป็นสตริง: "+c.toString ());*// หรือไม่ใช้วิธีรหัสด้านบนอ่านข้อมูลใบรับรองโดยตรงจากไลบรารีใบรับรองซึ่งเหมือนกับสตริง พ.ย. ข้างต้น =" qazzaq "; fileInputStream in2 = ใหม่ ks = keystore.getInstance ("jks"); ks.load (in2, pass.tochararray ()); string alias = "testcertification"; // นามแฝงเป็นใบรับรองนามแฝง c = ks.getcertificate (นามแฝง); system.err.println ( X509Certificate นี่คือคลาสย่อยของคลาสใบรับรองที่จะได้รับใบรับรองและใช้วิธีการเพิ่มเติม x509Certificate t = (x509Certificate) c; // แยกข้อมูลที่ต้องการออกจากระบบข้อมูล. หมายเลข: "+t.getSerialNumber (). toString (16)); system.out.println (" ชื่อเรื่อง ":"+t.getsubjectdn ()); system.out.println ("ผู้ออก:" t.getIssuerdn (); อัลกอริทึม: "+t.getsigalgname ()); byte [] sig = t.getSignature (); // ค่าลายเซ็นสาธารณะ keykey pk = t.getpublickey (); byte [] pkenc = pk.getencoded (); i = 0; i <pkenc.length; i ++) {system.out.print (pkenc [i]+",");} system.err.println (); // วันที่ใบรับรองการตรวจสอบความถูกต้อง, ใบรับรองที่ออกมีวันที่วันที่ที่ถูกต้อง วันที่! "); // ตรวจสอบความถูกต้องของลายเซ็นใบรับรองและออกใบรับรอง CA ให้กับลูกค้าผ่านองค์กรใบรับรองดิจิตอลศูนย์ใบรับรอง (CA) เช่น: caroot.crt ไฟล์ // ฉันไม่มีใบรับรองที่ออกให้ฉัน cf.generatificate (ใน 3); System.out.println ("การตรวจสอบความถูกต้องของวันที่ใบรับรอง: หมดอายุ"); } catch (การตรวจสอบความถูกต้องของวันที่ของใบรับรอง: หมดอายุ ");} catch (การตรวจสอบความถูกต้องของวันที่ของใบรับรอง: หมดอายุ"); } catch (การตรวจสอบความถูกต้องของวันที่ของใบรับรอง: หมดอายุ ");} catch (filenotfoundexception ce) {ce.printstacktrace ();} catch (filenotfoundexception fe) {fe.printstacktrace ();} /*catch (ioexception ioe) e) {e.printstacktrace ();}}สรุป
ข้างต้นคือทั้งหมดเกี่ยวกับตัวอย่างรหัสที่สมบูรณ์ของการเข้ารหัส Java และการถอดรหัสและลายเซ็นดิจิตอล ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!