Учебник Алгоритм одноразового шифрования (шифр Вернама)

Здравствуйте, ваултеране!

Сегодня мы узнаем больше об алгоритме One Time Pad, также известном как шифр Вернама. Но что это такое?

OTP – это метод шифрования алфавитного открытого текста. Это один из методов подстановки, который преобразует открытый текст в шифр-текст (расшифрованное слово). В этой идее мы присваиваем номер каждому символу открытого текста.

Присвоение происходит следующим образом:

В этом алгоритме длина ключевого слова должна быть равна длине обычного текста.

Примеры:

Входные данные: Сообщение = VAULTREE, Ключевое слово = AXDHCGQK.
Выход: Шифр – VXXSVXUO, Сообщение – VAULTREE
Объяснение:
Часть 1: Преобразование открытого текста в шифротекст
Открытый текст – V A U L T R E E → 21 0 20 11 19 17 4 4
Ключ – A X D H C G Q K → 0 23 3 7 2 6 16 10
Открытый текст + ключевое слово = 21 23 23 18 21 23 20 14
Шифрованный текст → V X X S V X U O
Часть 2: Преобразование шифротекста в сообщение
Текст шифра – V X X S V X U O → 21 23 23 18 21 23 20 14
Ключ – A X D H C G Q K → 0 23 3 7 2 6 16 10
Текст шифра – ключ = 21 0 20 11 19 17 4 4 → Сообщение → V A U L T R E E

В основном, шаги для шифрования следующие:

1- Присвоить номер каждому символу открытого текста и ключевому слову в соответствии с алфавитным порядком.
2- Сложить ( + ) оба числа (номер соответствующего символа открытого текста и номер символа ключевого слова).
3- Вычтите ( – ) число из 26, если прибавленное число больше 26, если нет, то оставьте его.

Помните, что для расшифровки применяется обратный процесс шифрования, то есть CT – KW = PT. (шифр-текст – ключевое слово = открытый текст).

Ниже приведена реализация алгоритма OTP:

`

public class OtpByVaultree {
// Method 1
// Returning encrypted text
public static String stringEncryption(String text,
                                      String key)
{

    // Initializing cipherText
    String cipherText = "";

    // Initialize cipher array of key length
    // which stores the sum of corresponding no.'s
    // of plainText and key.
    int cipher[] = new int[key.length()];

    for (int i = 0; i < key.length(); i++) {
        cipher[i] = text.charAt(i) - 'A'
                + key.charAt(i)
                - 'A';
    }

    // If the sum is greater than 25
    // subtract 26 from it
    // and store that resulting value
    for (int i = 0; i < key.length(); i++) {
        if (cipher[i] > 25) {
            cipher[i] = cipher[i] - 26;
        }
    }

    // Converting the no.'s into integers

    // Convert these integers to corresponding
    // characters and add them up to cipherText
    for (int i = 0; i < key.length(); i++) {
        int x = cipher[i] + 'A';
        cipherText += (char)x;
    }

    // Returning the cipherText
    return cipherText;
}

// Method 2
// Returning plain text
public static String stringDecryption(String s,
                                      String key)
{
    // Initializing plain text
    String plainText = "";

    // Initializing integer array of key length
    // which stores difference
    // of corresponding no.'s of
    // each character of cipherText and key
    int plain[] = new int[key.length()];

    // Running for loop for each character
    // subtracting and storing in the array
    for (int i = 0; i < key.length(); i++) {
        plain[i]
                = s.charAt(i) - 'A'
                - (key.charAt(i) - 'A');
    }

    // If the difference is less than 0
    // add 26 and store it in the array.
    for (int i = 0; i < key.length(); i++) {
        if (plain[i] < 0) {
            plain[i] = plain[i] + 26;
        }
    }

    // Converting int to corresponding char
    // add them up to plainText
    for (int i = 0; i < key.length(); i++) {
        int x = plain[i] + 'A';
        plainText += (char)x;
    }

    // Returning plainText
    return plainText;
}

// Method 3
// Main driver method
public static void main(String[] args)
{
    // Declaring plain text
    String plainText = "VAULTREE";

    // Declaring key
    String key = "AXDHCGQK";

    // Converting plain text to toUpperCase
    // function call to stringEncryption
    // with plainText and key as parameters
    String encryptedText = stringEncryption(
            plainText.toUpperCase(), key.toUpperCase());

    // Printing cipher Text
    System.out.println("Cipher Text - "
            + encryptedText);

    // Calling above method to stringDecryption
    // with encryptedText and key as parameters
    System.out.println(
            "Message - "
                    + stringDecryption(encryptedText,
                    key.toUpperCase()));
}}
Вход в полноэкранный режим Выход из полноэкранного режима

`

С помощью этого алгоритма вы сможете расшифровывать сообщения, используя метод OTP. Получайте удовольствие!

В Vaultree мы строим зашифрованное будущее. Мы любим делиться ценной информацией и тенденциями, чтобы помочь вам сохранить ваши данные в безопасности. Подпишитесь, чтобы оставаться в курсе событий и обсуждать самые горячие тенденции в области кибербезопасности с командой экспертов.

Оцените статью
Procodings.ru
Добавить комментарий