BufferedReader + Поток Новый метод lines() был добавлен с версии 1.8, он позволяет BufferedReader возвращать содержимое в виде
BufferedReader + Поток Новый метод || lines() || был добавлен с версии 1.8, он позволяет ||BufferedReader || возвращать содержимое в виде ||Потока ||. Вывод Классического буферизованного считывателя и сканера Достаточно Java 8 и ||Stream||, давайте вернемся к классическим примерам ||буферизованного считывателя || (JDK1.1) и ||Сканера|| (JDK1.5) для чтения файла строка за строкой, он все еще работает, просто разработчик 4.1||БуферизоВанный считыватель ||+ пример с использованием ресурсов. это файл MovIjava 8. строки() Ссылки 4.2||Сканер||+ попробуйте с помощью ресурсов – Java 11 – примеры шифрования ChaCha20 Java 11 – Цепочка в этой статье мы покажем вам, как зашифровать и расшифровать потоковый шифр P.S ChaCha20 доступен на Java 11, см. сообщение с ||потоковым шифром ChaCha20||, определенным в ||RFC 7539||. Java 11 – примеры шифрования ChaCha20 Примеры шифрования Cha20 Java BufferedReader Java 8 Пример потока s. нг в направлении ||Потока||. BufferedReader + Поток Новый метод || lines() || был добавлен с версии 1.8, он позволяет ||BufferedReader || возвращать содержимое в виде ||Потока ||. Вывод Классического буферизованного считывателя и сканера Достаточно Java 8 и ||Stream||, давайте вернемся к классическим примерам ||буферизованного считывателя || (JDK1.1) и ||Сканера|| (JDK1.5) для чтения файла строка за строкой, он все еще работает, просто разработчик 4.1||БуферизоВанный считыватель ||+ пример с использованием ресурсов. это файл MovIjava 8. строки() Ссылки 4.2||Сканер||+ попробуйте с помощью ресурсов – Java 11 – примеры шифрования ChaCha20 Java 11 – Цепочка в этой статье мы покажем вам, как шифровать и расшифровывать потоковый шифр P.S ChaCha20 доступен на Java 11, обратитесь к MesSajep 329 ge с ||шифром потока ChaCha20||, определенным в ||RFC 7539||. Java 11 – примеры шифрования ChaCha20 Примеры шифрования Cha20 Java BufferedReader Java 8 Пример потока s. нг в направлении ||Потока||. .
BufferedReader + Поток Новый метод lines() был добавлен с версии 1.8, он позволяет
1. BufferedReader + Поток Новый метод || lines() || был добавлен с версии 1.8, он позволяет ||BufferedReader || возвращать содержимое в виде ||Потока ||. Вывод Классического буферизованного считывателя и сканера Достаточно Java 8 и ||Stream||, давайте вернемся к классическим примерам ||буферизованного считывателя || (JDK1.1) и ||Сканера|| (JDK1.5) для чтения файла строка за строкой, он все еще работает, просто разработчик 4.1||БуферизоВанный считыватель ||+ пример с использованием ресурсов. s являются файлом MovIjava 8. строки() Ссылки 4.2||Сканер||+ попробуйте с помощью ресурсов – Java 11 -примеры шифрования ChaCha20 Java 11-цепочка в этой статье мы покажем вам, как шифровать и расшифровывать потоковый шифр P.S ChaCha20 доступен на Java 11, обратитесь к сообщению, которое может вас заинтересовать в этом||Шифрование ChaCha20-Poly1305, как это работает? усиливает примечание ||JEP 329 ge с шифром потока ||ChaCha20||, определенным в ||RFC 7539||. Java 11 – примеры шифрования ChaCha20 Примеры шифрования Cha20 Java BufferedReader Java 8 Пример потока s. нг в направлении ||Потока||.
BufferedReader + Поток Новый метод || lines() || был добавлен с версии 1.8, он позволяет ||BufferedReader || возвращать содержимое в виде ||Потока ||. Вывод Классического буферизованного считывателя и сканера Достаточно Java 8 и ||Stream||, давайте вернемся к классическим примерам ||буферизованного считывателя || (JDK1.1) и ||Сканера|| (JDK1.5) для чтения файла строка за строкой, он все еще работает, просто разработчик 4.1||БуферизоВанный считыватель ||+ пример с использованием ресурсов. s являются файлом MovIjava 8. строки() Ссылки 4.2||Сканер||+ попробуйте с помощью ресурсов – Java 11 – примеры шифрования ChaCha20 Java 11-цепочка в этой статье мы покажем вам, как шифровать и расшифровывать потоковый шифр P.S ChaCha20 доступен на Java 11, обратитесь к сообщению, которое может вас заинтересовать в этом||Шифрование ChaCha20-Poly1305 ex1.1 Как это работает? усиливает примечание ||JEP 329 ge с шифром потока ||ChaCha20||, определенным в ||RFC 7539||. Java 11 – примеры шифрования ChaCha20 Примеры шифрования Cha20 Java BufferedReader Java 8 Пример потока s. нг в направлении ||Потока||.
- BufferedReader + Поток Новый метод
- lines()
- был добавлен с версии 1.8, он позволяет
BufferedReader + Поток Новый метод || lines() || был добавлен с версии 1.8, он позволяет ||BufferedReader || возвращать содержимое в виде ||Потока ||. Вывод Классического буферизованного считывателя и сканера Достаточно Java 8 и ||Stream||, давайте вернемся к классическим примерам ||буферизованного считывателя || (JDK1.1) и ||Сканера|| (JDK1.5) для чтения файла строка за строкой, он все еще работает, просто разработчик 4.1||БуферизоВанный считыватель ||+ пример с использованием ресурсов. s являются файлом MovIjava 8. строки() Ссылки 4.2||Сканер||+ попробуйте с помощью ресурсов – Java 11 – примеры шифрования ChaCha20 Java 11-цепочка в этой статье мы покажем вам, как шифровать и расшифровывать потоковый шифр P.S ChaCha20 доступен на Java 11, обратитесь к сообщению, которое может вас заинтересовать в этом||Шифрование ChaCha20-Poly1305 ex1.1 Как это работает? усиливает примечание ||JEP 329 ge с шифром потока ||ChaCha20||, определенным в ||RFC 7539||. Java 11 – примеры шифрования ChaCha20 Примеры шифрования Cha20 Java BufferedReader Java 8 Пример потока s. нг в направлении ||Потока||.
(plain text) + (secrect key | nonce | initial count) -> `ChaCha20` -> ciphertext (encrypted text).
BufferedReader + Поток Новый метод || lines() || был добавлен с версии 1.8, он позволяет ||BufferedReader || возвращать содержимое в виде ||Потока ||. Вывод Классического буферизованного считывателя и сканера Достаточно Java 8 и ||Stream||, давайте вернемся к классическим примерам ||буферизованного считывателя || (JDK1.1) и ||Сканера|| (JDK1.5) для чтения файла строка за строкой, он все еще работает, просто разработчик 4.1||БуферизоВанный считыватель ||+ пример с использованием ресурсов. s являются файлом MovIjava 8. строки() Ссылки 4.2||Сканер||+ попробуйте с помощью ресурсов – Java 11 – примеры шифрования ChaCha20 Java 11-цепочка в этой статье мы покажем вам, как шифровать и расшифровывать потоковый шифр P.S ChaCha20 доступен на Java 11, обратитесь к сообщению, которое может вас заинтересовать в этом||Шифрование ChaCha20-Poly1305 ex1.1 Как это работает? усиливает примечание ||JEP 329 ge с шифром потока ||ChaCha20||, определенным в ||RFC 7539||. Java 11 – примеры шифрования ChaCha20 Примеры шифрования Cha20 Java BufferedReader Java 8 Пример потока s. нг в направлении ||Потока||.
ciphertext + (secrect key | nonce | initial count) -> `ChaCha20` -> plain text.
1.3 Шифрование ChaCha20
использует ключ и IV (значение инициализации, nonce + начальное количество) для шифрования открытого текста в зашифрованный текст равной длины .
1.4 Шифрование ||ChaCha20|| использует ключ и IV (значение инициализации, nonce + начальное количество) для шифрования открытого текста в зашифрованный текст || равной длины ||. Одноразовый и секретный ключ должны быть уникальными для каждого шифрования. Шифрование ||ChaCha20|| использует ключ и IV (значение инициализации, nonce + начальное количество) для шифрования открытого текста в зашифрованный текст || равной длины ||. Одноразовый и секретный ключ должны быть уникальными для каждого шифрования. Значение nonce и начальное количество могут быть общедоступными, но секретный ключ должен быть закрытым и хранить его в тайне.
Реализация Java ChaCha20 Загрузите исходный код JDK и найдите этот класс Шифр ChaCha20
для реализации алгоритма ChaCha20.
package com.sun.crypto.provider; /** * Implementation of the ChaCha20 cipher, as described in RFC 7539. * * @since 11 */ abstract class ChaCha20Cipher extends CipherSpi { //... }
2. Шифрование и дешифрование ChaCha20.
2.1 Пример Java для шифрования и дешифрования сообщения с помощью алгоритма ChaCha20.
package com.mkyong.java11.jep329.chacha20; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.spec.ChaCha20ParameterSpec; /* The inputs to ChaCha20 encryption, specified by RFC 7539, are: - A 256-bit secret key (32 bytes) - A 96-bit nonce (12 bytes) - A 32-bit initial count (4 bytes) */ public class ChaCha20 { private static final String ENCRYPT_ALGO = "ChaCha20"; public byte[] encrypt(byte[] pText, SecretKey key, byte[] nonce, int counter) throws Exception { Cipher cipher = Cipher.getInstance(ENCRYPT_ALGO); ChaCha20ParameterSpec param = new ChaCha20ParameterSpec(nonce, counter); cipher.init(Cipher.ENCRYPT_MODE, key, param); byte[] encryptedText = cipher.doFinal(pText); return encryptedText; } public byte[] decrypt(byte[] cText, SecretKey key, byte[] nonce, int counter) throws Exception { Cipher cipher = Cipher.getInstance(ENCRYPT_ALGO); ChaCha20ParameterSpec param = new ChaCha20ParameterSpec(nonce, counter); cipher.init(Cipher.DECRYPT_MODE, key, param); byte[] decryptedText = cipher.doFinal(cText); return decryptedText; } }
2.1 Испытание.
package com.mkyong.java11.jep329.chacha20; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; public class TestChaCha20 { public static void main(String[] args) throws Exception { String input = "Java & ChaCha20 encryption example."; ChaCha20 cipher = new ChaCha20(); SecretKey key = getKey(); // 256-bit secret key (32 bytes) byte[] nonce = getNonce(); // 96-bit nonce (12 bytes) int counter = 1; // 32-bit initial count (8 bytes) System.out.println("Input : " + input); System.out.println("Input (hex): " + convertBytesToHex(input.getBytes())); System.out.println("\n---Encryption---"); byte[] cText = cipher.encrypt(input.getBytes(), key, nonce, counter); // encrypt System.out.println("Key (hex): " + convertBytesToHex(key.getEncoded())); System.out.println("Nonce (hex): " + convertBytesToHex(nonce)); System.out.println("Counter : " + counter); System.out.println("Encrypted (hex): " + convertBytesToHex(cText)); System.out.println("\n---Decryption---"); byte[] pText = cipher.decrypt(cText, key, nonce, counter); // decrypt System.out.println("Key (hex): " + convertBytesToHex(key.getEncoded())); System.out.println("Nonce (hex): " + convertBytesToHex(nonce)); System.out.println("Counter : " + counter); System.out.println("Decrypted (hex): " + convertBytesToHex(pText)); System.out.println("Decrypted : " + new String(pText)); } // A 256-bit secret key (32 bytes) private static SecretKey getKey() throws NoSuchAlgorithmException { KeyGenerator keyGen = KeyGenerator.getInstance("ChaCha20"); keyGen.init(256, SecureRandom.getInstanceStrong()); return keyGen.generateKey(); } // 96-bit nonce (12 bytes) private static byte[] getNonce() { byte[] newNonce = new byte[12]; new SecureRandom().nextBytes(newNonce); return newNonce; } private static String convertBytesToHex(byte[] bytes) { StringBuilder result = new StringBuilder(); for (byte temp : bytes) { result.append(String.format("%02x", temp)); } return result.toString(); } }
Выход
Input : Java & ChaCha20 encryption example. Input (hex): 4a617661202620436861436861323020656e6372797074696f6e206578616d706c652e ---Encryption--- Key (hex): ee416df8b5154a4ac48f3930fcfa53ef7f677c8fd7cd093f1328eedfd831db1a Nonce (hex): 9806308f4d1732d2d39beaba Counter : 1 Encrypted (hex): 2149db2c32bf82f9e8dc0a709d8c15d5a22eb79d5f692e04f070d46cc7e264631f85e0 ---Decryption--- Key (hex): ee416df8b5154a4ac48f3930fcfa53ef7f677c8fd7cd093f1328eedfd831db1a Nonce (hex): 9806308f4d1732d2d39beaba Counter : 1 Decrypted (hex): 4a617661202620436861436861323020656e6372797074696f6e206578616d706c652e Decrypted : Java & ChaCha20 encryption example.
ключ + nonce + счетчик
должен быть одинаковым для шифрования и дешифрования, один бит, отличающийся, приведет к другому результату.
3. Чача20… версия 2
3.1 В этом примере мы используем System.arraycopy
чтобы добавить счетчик nonce и init в конец зашифрованного текста (зашифрованного сообщения), так что нам нужен только секретный ключ для расшифровки.
package com.mkyong.java11.jep329.chacha20v2; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.spec.ChaCha20ParameterSpec; import java.nio.ByteBuffer; public class ChaCha20v2 { private static final String ENCRYPT_ALGO = "ChaCha20"; private static final int LEN_NONCE = 12; private static final int LEN_COUNTER = 4; public byte[] encrypt(byte[] pText, SecretKey key, byte[] nonce, int counter) throws Exception { Cipher cipher = Cipher.getInstance(ENCRYPT_ALGO); ChaCha20ParameterSpec param = new ChaCha20ParameterSpec(nonce, counter); cipher.init(Cipher.ENCRYPT_MODE, key, param); byte[] encryptedText = cipher.doFinal(pText); // append nonce + count byte[] output = new byte[encryptedText.length + LEN_NONCE + LEN_COUNTER]; System.arraycopy(encryptedText, 0, output, 0, encryptedText.length); System.arraycopy(nonce, 0, output, encryptedText.length, LEN_NONCE); // convert int to byte[] byte[] counterByteArray = ByteBuffer.allocate(4).putInt(counter).array(); System.arraycopy(counterByteArray, 0, output, encryptedText.length + LEN_NONCE, LEN_COUNTER); return output; } public byte[] decrypt(byte[] cText, SecretKey key) throws Exception { Cipher cipher = Cipher.getInstance(ENCRYPT_ALGO); // get only the encrypted text byte[] encryptedText = new byte[cText.length - (LEN_NONCE + LEN_COUNTER)]; System.arraycopy(cText, 0, encryptedText, 0, cText.length - (LEN_NONCE + LEN_COUNTER)); // get nonce byte[] nonce = new byte[12]; System.arraycopy(cText, encryptedText.length, nonce, 0, LEN_NONCE); // get initial counter byte[] counter = new byte[4]; System.arraycopy(cText, encryptedText.length + LEN_NONCE, counter, 0, LEN_COUNTER); /// convert byte array to int int ic = ByteBuffer.wrap(counter).getInt(); ChaCha20ParameterSpec param = new ChaCha20ParameterSpec(nonce, ic); cipher.init(Cipher.DECRYPT_MODE, key, param); byte[] decryptedText = cipher.doFinal(encryptedText); return decryptedText; } }
3.2 Для расшифровки нам нужно только предоставить секретный ключ, потому что nonce и начальный счетчик находятся в конце зашифрованного текста или зашифрованного текста.
package com.mkyong.java11.jep329.chacha20v2; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; public class TestChaCha20v2 { public static void main(String[] args) throws Exception { String input = "Java & ChaCha20 encryption example."; ChaCha20v2 cipher = new ChaCha20v2(); SecretKey key = getKey(); // 256-bit secret key (32 bytes) byte[] nonce = getNonce(); // 96-bit nonce (12 bytes) int counter = 1; // 32-bit initial count (8 bytes) System.out.println("Input : " + input); System.out.println("Input (hex): " + convertBytesToHex(input.getBytes())); System.out.println("\n---Encryption---"); byte[] cText = cipher.encrypt(input.getBytes(), key, nonce, counter); // encrypt System.out.println("Key (hex): " + convertBytesToHex(key.getEncoded())); System.out.println("Nonce (hex): " + convertBytesToHex(nonce)); System.out.println("Counter : " + counter); System.out.println("Encrypted (hex): " + convertBytesToHex(cText)); System.out.println("\n---Decryption---"); byte[] pText = cipher.decrypt(cText, key); // decrypt System.out.println("Key (hex): " + convertBytesToHex(key.getEncoded())); System.out.println("Decrypted (hex): " + convertBytesToHex(pText)); System.out.println("Decrypted : " + new String(pText)); } private static String convertBytesToHex(byte[] bytes) { StringBuilder result = new StringBuilder(); for (byte temp : bytes) { result.append(String.format("%02x", temp)); } return result.toString(); } // A 256-bit secret key (32 bytes) private static SecretKey getKey() throws NoSuchAlgorithmException { KeyGenerator keyGen = KeyGenerator.getInstance("ChaCha20"); keyGen.init(256, SecureRandom.getInstanceStrong()); return keyGen.generateKey(); } // 96-bit nonce (12 bytes) private static byte[] getNonce() { byte[] newNonce = new byte[12]; new SecureRandom().nextBytes(newNonce); return newNonce; } }
Выход
Input : Java & ChaCha20 encryption example. Input (hex): 4a617661202620436861436861323020656e6372797074696f6e206578616d706c652e ---Encryption--- Key (hex): f95fd5b41783595e41f4cbcd8dc26a782599184e97ccd768ac531aae729781d3 Nonce (hex): 84133f2261ef44796e3669dc Counter : 1 Encrypted (hex): 7738807b409f3349dbefbeae988482e0e5959c35ee8f8ee8987357db459e10d7fb8c7e84133f2261ef44796e3669dc00000001 ---Decryption--- Key (hex): f95fd5b41783595e41f4cbcd8dc26a782599184e97ccd768ac531aae729781d3 Decrypted (hex): 4a617661202620436861436861323020656e6372797074696f6e206578616d706c652e Decrypted : Java & ChaCha20 encryption example.
Просмотрите зашифрованный текст; он объединяет зашифрованное сообщение, nonce (12 байт) и начальный счетчик (4 байта).
Encrypted (hex): 7738807b409f3349dbefbeae988482e0e5959c35ee8f8ee8987357db459e10d7fb8c7e84133f2261ef44796e3669dc00000001 ## split view Encrypted (hex): 7738807b409f3349dbefbeae988482e0e5959c35ee8f8ee8987357db459e10d7fb8c7e | 84133f2261ef44796e3669dc | 00000001
Примечание Если вы обнаружили какую-либо ошибку, пожалуйста, прокомментируйте ниже, спасибо.
Скачать Исходный Код
$клон git https://github.com/mkyong/core-java.git
$компакт-диск java-11
$$cd/src/главная/java/com/mkyong/java 11/jep329
Рекомендации
- Чача20
- RFC 7539 (RFC 7539)
- Cloudflare – Для чачи требуется двое (Поли)
- Действительно ли счетчик ChaCha20 увеличивается с помощью итераций?
- Java: ChaCha20 с Poly1305 в качестве MAC для шифрование файлов общего назначения
Оригинал: “https://mkyong.com/java/java-11-chacha20-stream-cipher-examples/”