Рубрики
Без рубрики

BufferedReader + Поток Новый метод || lines() || был добавлен с версии 1.8, он позволяет ||BufferedReader || возвращать содержимое в виде ||Потока ||. Вывод Классического буферизованного считывателя и сканера Достаточно Java 8 и ||Stream||, давайте вернемся к классическим примерам ||буферизованного считывателя || (JDK1.1) и ||Сканера|| (JDK1.5) для чтения файла строка за строкой, он все еще работает, просто разработчик 4.1||БуферизоВанный считыватель ||+ пример с использованием ресурсов. s являются файлом Movijava 8. строки() Ссылки 4.2||Сканер||+ попробуйте с помощью Resourcejava 11 – примеры шифрования ChaCha20 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 – ChaCha20 Пример Java BufferedReader Java 8 Поток s. нг в направлении ||Потока||.

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

Рекомендации

Оригинал: “https://mkyong.com/java/java-11-chacha20-stream-cipher-examples/”