Base64 เป็นหนึ่งในวิธีการเข้ารหัสที่พบบ่อยที่สุดในเครือข่ายสำหรับการส่งรหัสไบต์ 8 บิต คุณสามารถตรวจสอบ RFC2045 ~ RFC2049 ซึ่งมีข้อมูลจำเพาะ MIME โดยละเอียด BASE64 ต้องการการแปลงทุก ๆ สามไบต์ 8 บิตเป็นสี่ไบต์ 6 บิต (3*8 = 4*6 = 24) จากนั้นเพิ่มสอง 0S สูงถึง 6 บิตเพื่อสร้างสี่ไบต์ 8 บิต กล่าวอีกนัยหนึ่งสตริงที่แปลงแล้วในทางทฤษฎีจะยาวกว่า 1/3 อันดั้งเดิม
ฟังก์ชั่น PHP: base64_encode () และ base64_decode ()
Base64 การเข้ารหัสหลักการถอดรหัส
การเข้ารหัส BASE64 จริงแปลง 3 ไบต์ 8 บิตเป็น 4 ไบต์ 6 บิต (3*8 = 4*6 = 24) ไบต์ 4 บิต 4 บิตเหล่านี้ยังคงเป็น 8 บิต แต่สองบิตที่สูงกว่าจะถูกตั้งค่าเป็น 0 (0 ~ 63)
ในความเป็นจริงมีอักขระที่มองไม่เห็นมากมายในรหัส ASCII ระหว่าง 0 ถึง 63 ดังนั้นควรทำแผนที่อีกครั้งและตารางการแมปคือ
'A' ~ 'Z'? ASCII (0 ~ 25)
'A' ~ 'Z'? ASCII (26 ~ 51)
'0' ~ '9'? ASCII (52 ~ 61)
- ASCII (62)
- ASCII (63)
สิ่งนี้จะแปลง 3 ไบต์ 8 บิตเป็น 4 ตัวอักษรที่มองเห็นได้
วิธีการเฉพาะของการแยกไบต์คือ: (รูป (วาดไม่ดีเข้าใจวิญญาณ :-))
AAAAAABB CCCDDD EEFFFFFF // ABCDEF เป็นจริง 1 หรือ 0 เพื่อดูอย่างชัดเจนใช้ ABCDEF แทน
-
ไบต์ 1 ไบต์ 2 ไบต์ 3
-
-
00AAAAAA 00BBCCCC 00DDDEE 00FFFFFF
หมายเหตุ: บิตสามไบต์ข้างต้นเป็นข้อความต้นฉบับสี่ไบต์ต่อไปนี้คือการเข้ารหัส base64 และสองบิตแรกคือ 0
เมื่อแยกด้วยวิธีนี้จำนวนไบต์ในข้อความต้นฉบับควรเป็นหลายอย่างของ 3 เมื่อไม่สามารถปฏิบัติตามเงื่อนไขนี้ให้ใช้ศูนย์ไบต์ทั้งหมด
ส่วนประกอบเมื่อแปลงการเข้ารหัส BASE64 จะถูกแทนที่ด้วยเครื่องหมาย = ซึ่งเป็นสาเหตุที่การเข้ารหัส BASE64 บางส่วนสิ้นสุดลงด้วยสัญญาณเท่ากันหนึ่งหรือสองสัญญาณ
เหตุผลของชุดรวม แต่มีสัญญาณเท่ากันมากที่สุดเท่าที่
ตารางที่เหลือแล้ว
F (เหลืออยู่) = F (Origin) Mod 3 ถูกสร้างขึ้น
ดังนั้นค่าที่เป็นไปได้ของ F (ยังคงอยู่) คือ 0, 1, 2
ถ้า n = [f (ต้นกำเนิด) f (ยังคงอยู่)] / 3
เมื่อ F (ยังคงอยู่) = 0 มันจะถูกแปลงเป็น 4*N BYTES BASE64 การเข้ารหัส
เมื่อ f (ยังคงอยู่) = 1 เนื่องจากไบต์ตัวอักษรสามารถแบ่งออกเป็นสอง base64 ที่เข้ารหัสไบต์
ให้ Base64 ENCODE เป็นหลาย 4 ของ 4 ดังนั้นควรเสริมด้วย 2 สัญญาณเท่ากัน
เมื่อ f (ยังคงอยู่) = 2 เนื่องจากสองข้อความต้นฉบับไบต์สามารถแบ่งออกเป็น 3 base64 ที่เข้ารหัสไบต์ในทำนองเดียวกัน
ควรเพิ่มเครื่องหมายที่เท่าเทียมกัน
Base64 จะมีสัญญาณเท่ากัน 0 ถึง 2 ที่ส่วนท้ายของสตริงที่เข้ารหัส สัญญาณที่เท่าเทียมกันเหล่านี้ไม่จำเป็นสำหรับการถอดรหัสดังนั้นจึงสามารถลบได้
เมื่อเครือข่ายได้รับและรายการพารามิเตอร์โพสต์จะแสดงรายการ '+' ไม่สามารถส่งได้ตามปกติดังนั้นคุณสามารถแทนที่ด้วย '|'
ด้วยวิธีนี้สตริงที่เข้ารหัสโดย Base64 มีเท่านั้น '|' และ '/' ดังนั้นสตริงที่เข้ารหัสฐาน 64 สามารถถ่ายโอนเป็นรายการพารามิเตอร์ที่มีค่าพารามิเตอร์
-
ต่อไปนี้เป็นการนำไปปฏิบัติที่เขียนโดยชาวต่างชาติ:
แพ็คเกจ com.meterware.httpunit;
-
* $ id: base64.java, v 1.4 2002/12/24 15:17:17 Russgold Exp $
-
* ลิขสิทธิ์ (c) 2000-2002 โดย Russell Gold
-
* ได้รับอนุญาตโดยไม่เสียค่าใช้จ่ายสำหรับบุคคลใด ๆ ที่ได้รับสำเนาของซอฟต์แวร์นี้และที่เกี่ยวข้อง
* ไฟล์เอกสาร ("ซอฟต์แวร์") เพื่อจัดการในซอฟต์แวร์โดยไม่มีข้อ จำกัด รวมถึง แต่ไม่ จำกัด เฉพาะ
* สิทธิ์ในการใช้, คัดลอก, ดัดแปลง, ผสาน, เผยแพร่, การกระจาย, sublicense, และ/หรือขายสำเนาของซอฟต์แวร์และ
* เพื่ออนุญาตให้บุคคลที่ซอฟต์แวร์ได้รับการตกแต่งให้ทำเช่นนั้นภายใต้เงื่อนไขดังต่อไปนี้:
-
* ประกาศลิขสิทธิ์ข้างต้นและการแจ้งการอนุญาตนี้จะรวมอยู่ในสำเนาทั้งหมดหรือส่วนสำคัญ
* ของซอฟต์แวร์
-
* ซอฟต์แวร์มีให้ "ตามสภาพ" โดยไม่มีการรับประกันใด ๆ โดยชัดแจ้งหรือโดยนัยรวมถึง แต่ไม่ จำกัด เพียง
* การรับประกันความสามารถในการค้าการออกกำลังกายสำหรับวัตถุประสงค์เฉพาะและการไม่เข้าร่วม ไม่ว่าในกรณีใด
* ผู้เขียนหรือผู้ถือลิขสิทธิ์จะต้องรับผิดชอบต่อการเรียกร้องความเสียหายหรือความรับผิดอื่น ๆ ไม่ว่าจะเป็นการกระทำของ
* สัญญาการละเมิดหรืออื่น ๆ เกิดขึ้นจากหรือเกี่ยวข้องกับซอฟต์แวร์หรือการใช้งานหรืออื่น ๆ
* การติดต่อในซอฟต์แวร์
-
-
-
* คลาสยูทิลิตี้ที่จะแปลงไปและกลับจากฐาน 64 การเข้ารหัส
-
* @author <a href = "mailto: [email protected]"> Russell Gold </a>
-
คลาสสาธารณะ BASE64 {สตริงคงสุดท้าย encodingChar = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/"; /*** ส่งคืนฐาน 64 ที่เข้ารหัสเทียบเท่าของสตริงที่ให้มา * @Param แหล่งที่มาสตริงเพื่อเข้ารหัส */ สเตทสตริงคงที่การเข้ารหัส (แหล่งที่มาของสตริง) {char [] sourceBytes = getPaddedBytes (แหล่งที่มา); int numgroups = (sourcebytes.length + 2) / 3; char [] targetBytes = char ใหม่ [4]; Char [] target = ใหม่ถ่าน [4 * numgroups]; สำหรับ (int group = 0; กลุ่ม <numgroups; กลุ่ม ++) {convert3to4 (sourceBytes, กลุ่ม*3, targetBytes); สำหรับ (int i = 0; i <targetBytes.length; i ++) {เป้าหมาย [i+4*กลุ่ม] = encodingchar.charat (targetBytes [i]); }} int numpadbytes = sourceBytes.length - source.length (); สำหรับ (int i = target.length-numpadbytes; i <target.length; i ++) เป้าหมาย [i] = '='; ส่งคืนสตริงใหม่ (เป้าหมาย); } char private static [] getPaddedBytes (แหล่งที่มาของสตริง) {char [] converted = source.tochararray (); intuse veleaded = 3 * (converted.length+2) /3); ถ่าน [] ผลลัพธ์ = ถ่านใหม่ [จำเป็นต้องมีความยาว]; System.arrayCopy (แปลง, 0, ผลลัพธ์, 0, converted.length); ผลการกลับมา; } โมฆะคงที่ส่วนตัว convert3to4 (char [] แหล่งที่มา, int sourceindex, char [] เป้าหมาย) {เป้าหมาย [0] = (char) (source [sourceindex] >>> 2); Target [1] = (Char) ((Source [SourceIndex] & 0x03) <<4) | (Source [SourceIndex+1] >>> 4)); Target [2] = (Char) ((Source [SourceIndex+1] & 0x0f) <<2) | (Source [SourceIndex+2] >>> 6)); Target [3] = (Char) (Source [SourceIndex+2] & 0x3f); } /*** ส่งคืนข้อความธรรมดาที่เทียบเท่ากับสตริง 64 ที่เข้ารหัสฐาน * @Param Source A ฐาน 64 สตริง (ซึ่งต้องมีหลายอักขระ 4 ตัว) */ การถอดรหัสสตริงคงที่สาธารณะ (แหล่งที่มาของสตริง) {ถ้า (source.length ()%4! = 0) โยน runtimeException ใหม่ ("รหัส base64 ที่ถูกต้องมีหลายอักขระ 4"); int numgroups = source.length () / 4; int numextrabytes = source.endswith ("==")? 2: (source.endswith ("=")? 1: 0); ไบต์ [] targetBytes = ไบต์ใหม่ [3*numgroups]; ไบต์ [] sourceBytes = ไบต์ใหม่ [4]; สำหรับ (int group = 0; กลุ่ม <numgroups; กลุ่ม ++) {สำหรับ (int i = 0; i <sourceBytes.length; i ++) {sourceBytes [i] = (byte) math.max (0, encodingchar.indexof (source.charat (4*กลุ่ม)); } Convert4to3 (SourceBytes, TargetBytes, กลุ่ม*3); } ส่งคืนสตริงใหม่ (targetBytes, 0, targetBytes.length - numextrabytes); } โมฆะคงที่ส่วนตัว convert4to3 (ไบต์ [] แหล่งที่มา, ไบต์ [] เป้าหมาย, int targetIndex) {target [targetIndex] = (ไบต์) ((แหล่งที่มา [0] <<<2) | (แหล่งที่มา [1] >>> 4)); Target [TargetIndex+1] = (byte) ((แหล่งที่มา [1] & 0x0f) <<4) | (แหล่งที่มา [2] >>> 2)); Target [TargetIndex+2] = (ไบต์) ((แหล่งที่มา [2] & 0x03) <<6) | (แหล่งที่มา [3])); -