Як закодувати рядок в Base64 за допомогою Java

Base64 - це метод шифрування кожних 3-х байтів введення в 4 байта виводу. Він широко використовується для кодування фото і аудіо при відправці електронною поштою (хоча часи 7-бітної передачі даних пройшли) і захисту ідентифікаційних даних (зразок логіна і пароля) на веб-сайтах від перехоплення. Тут представлений приклад, як написати шифрувальник Base64 на популярному мультиплатформенні мові Java. Цей приклад і пробна рядок коду були взяти зі статті у Вікіпедії.

Кроки

  1. Як закодувати рядок в Base64 за допомогою Java

    1

    Введіть інформацію та ім`я файлу

  2. Як закодувати рядок в Base64 за допомогою Java

    2

    Відкрийте ваш текстовий редактор, наприклад, Блокнот або vi, і зробіть підготовчу роботу, задавши класи і відомі константи. Назвіть файл Base64.java.

  3. 3

    Згідно статті, значення констант відповідають останнім робочим пропозиціями (RFC). У будь-якому випадку, варто перечитати найбільш свіжі робочі пропозиції, перш ніж починати писати код.

{{{1}}}




  • Тепер розглянемо найголовніше - одночасне стиск 3-х байтів в 24-бітове ціле число і витяг з нього 6-бітних індексів в кодує рядок. Це не якісь чарівні числа: 24 при діленні на 6 дає 4, 6 бітів можуть містити числа від 0 до 63, які можуть вказувати на будь-яке значення в 64-бітної кодує рядку.

for (int i = 0; i <</span> stringArray.length; i += 3) {int j = ((stringArray[i]  0xff) << 16) +((stringArray[i + 1]  0xff) << 8) +(stringArray[i + 2]  0xff);encoded = encoded + base64code.charAt((j  18)  0x3f) +base64code.charAt((j  12)  0x3f) +base64code.charAt((j  6)  0x3f) +base64code.charAt(j  0x3f);}



Як закодувати рядок в Base64 за допомогою Java

for (int i = 0; i <</span> stringArray.length; i += 3) {int j = ((stringArray[i]  0xff) << 16) +((stringArray[i + 1]  0xff) << 8) +(stringArray[i + 2]  0xff);encoded = encoded + base64code.charAt((j  18)  0x3f) +base64code.charAt((j  12)  0x3f) +base64code.charAt((j  6)  0x3f) +base64code.charAt(j  0x3f);}

}}



Як закодувати рядок в Base64 за допомогою Java

  1. Нарешті, після додавання вільних осередків, стискаємо вихід, вставляючи переклад рядка в необхідні 76-бітові кордону, використовуючи окрему підпрограму для ясності.

{CodeBoxpublic static String splitLines(String string) {String lines = "";for (int i = 0; i <</span> string.length(); i += splitLinesAt) {lines += string.substring(i, Math.min(string.length(), i +splitLinesAt));lines += " R N";}return lines;}

"==". Substring (0, paddingCount)) -} public static String splitLines (String string) {String lines = "" - for (int i = 0- i < string.length()- i += splitLinesAt) { lines += string.substring(i, Math.min(string.length(), i + splitLinesAt))- lines +="rn"- } return lines- } }}

  1. При бажанні, можна додати основну програму з метою проведення випробувань. Це також слід робити перед викладанням програми для загального користування.

{{CodeBox|<</span>source lang="Java"public static void main(String[] args) {for (int i = 0; i <</span> args.length; i++) {System.err.println("Encoding "" + args[i] + """);System.out.println(encode(args[i]));}}

for (int i = 0- i < args.length- i++) { System.err.println("encoding"" + args[i] +""")- System.out.println(encode(args[i]))- } } }}

  1. Тут представлений закінчений модуль:

{{CodeBox|<</span>source lang="Java"public class Base64 {private static final String base64code = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"+ "Abcdefghijklmnopqrstuvwxyz" + "0123456789" + "+ /";private static final int splitLinesAt = 76;public static byte[] zeroPad(int length, byte[] bytes) {byte[] padded = new byte[length]; // Визначається віртуальною машиною як 0 System.arraycopy(bytes, 0, padded, 0, bytes.length);return padded;}public static String encode(String string) {String encoded = "";byte[] stringArray;try {stringArray = string.getBytes("cp1251");// Використовуйте відповідну кодує рядок! } catch (Exception ignored) {stringArray = string.getBytes();// Використовуйте регіон за замовчуванням }// Визначте, скільки вільних байтів потрібно додати на виході int paddingCount = (3 ; (stringArray.length % 3)) % 3;// Додайте вільні байти на вході при необхідності stringArray = zeroPad(stringArray.length + paddingCount, stringArray);// Обробляйте 3 байти одночасно, одержуючи на виході 4 // Турбуйтеся про перенесення рядка пізніше for (int i = 0; i <</span> stringArray.length; i += 3) {int j = ((stringArray[i]  0xff) << 16) +((stringArray[i + 1]  0xff) << 8) +(stringArray[i + 2]  0xff);encoded = encoded + base64code.charAt((j  18)  0x3f) +base64code.charAt((j  12)  0x3f) +base64code.charAt((j  6)  0x3f) +base64code.charAt(j  0x3f);}// Замініть закодовані порожні значення вільних байтів за допомогою "=" return splitLines(encoded.substring(0, encoded.length() ;paddingCount) + "==".substring(0, paddingCount));}public static String splitLines(String string) {String lines = "";for (int i = 0; i <</span> string.length(); i += splitLinesAt) {lines += string.substring(i, Math.min(string.length(), i + splitLinesAt));lines += " R N";}return lines;}public static void main(String[] args) {for (int i = 0; i <</span> args.length; i++) {System.err.println("Encoding "" + args[i] + """);System.out.println(encode(args[i]));}}}

private static final String base64code = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789" + "+ /";


private static final int splitLinesAt = 76;


public static byte [] zeroPad (int length, byte [] bytes) {byte [] padded = new byte [length] - // initialized to zero by JVM System.arraycopy (bytes, 0, padded, 0, bytes.length) - return padded-}


public static String encode (String string) {


String encoded = "" - byte [] stringArray- try {stringArray = string.getBytes ("cp1251") - // use appropriate encoding string! } Catch (Exception ignored) {stringArray = string.getBytes () - // use locale default rather than croak} // determine how many padding bytes to add to the output int paddingCount = (3 - (stringArray.length% 3)) % 3- // add any necessary padding to the input stringArray = zeroPad (stringArray.length + paddingCount, stringArray) - // process 3 bytes at a time, churning out 4 output bytes // worry about CRLF insertions later for (int i = 0- i < stringArray.length- i += 3) { int j = ((stringArray[i] & 0xff) << 16) + ((stringArray[i + 1] & 0xff) << 8) + (stringArray[i + 2] & 0xff)- encoded = encoded + base64code.charAt((j>> 18) 0x3f) + base64code.charAt ((j>> 12) 0x3f) + base64code.charAt ((j>> 6) 0x3f) + base64code.charAt (j 0x3f) -} // replace encoded padding nulls with "=" return splitLines (encoded.substring (0, encoded.length () - paddingCount) + "==". Substring (0, paddingCount));


} Public static String splitLines (String string) {


String lines = "" - for (int i = 0- i < string.length()- i += splitLinesAt) {


lines + = string.substring (i, Math.min (string.length (), i + splitLinesAt)) - lines + = " r n";


} Return lines;


} Public static void main (String [] args) {


for (int i = 0- i < args.length- i++) {


System.err.println ("encoding" "+ args [i] +" "") - System.out.println (encode (args [i]));


}


}


} }}



  1. Тепер компілюємо це, використовуючи javac, gcj, jikes або що-небудь схоже. Відчуваємо, використовуючи цитату Гоббса зі статті у Вікіпедії:

{CodeBox} Ось результат:

{<</span>source lang="Java"encoding "Man is distinguished, not only by his reason, but by this singularpassion from other animals, which is a lust of the mind, that by aperseverance of delight in the continued and indefatigable generation ofknowledge, exceeds the short vehemence of any carnal pleasure."TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=

passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure. "


TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4 = }

  1. Сходиться! Це може означати, що або обидві програми неправильні, або що обидві більш менш правильні. У такому випадку, слід заново відвідати ту статтю у Вікіпедії і прочитати робочі пропозиції на випадок, якщо тут щось упущено.


Поради

  • Не бійтеся почати писати код, якщо чогось не розумієте. Все стає зрозуміліше на практиці.
  • Java добре підходить для загальних цілей і для написання додатків для пристроїв на зразок смартфонів, але javascript і Python володіють потужнішим і лаконічним синтаксисом. У різних мов різні сильні і слабкі сторони.
  • Спробуйте написати додатковий метод decode () для цього модуля.
  • Хоча вивчати робочі пропозиції (RFC) необхідно для промислового програмування, кількість інформації може збити з пантелику новачка. Тому іноді можна швидко переглянути ці дані, почати писати код, грунтуючись на наявних даних, а потім перевірити функціональність, порівнюючи з вимогами робочого пропозиції.