Как зашифровать строку в Java

Я предпочитаю TextMate на OS X. Но (многоплатформенный) Netbeans приходит вполне приятно. Плюс он идет с его IDE полностью функциональный отладчик.

136
задан Andrii Abramov 10 April 2019 в 11:25
поделиться

3 ответа

Предупреждение

Не используйте это как своего рода мера безопасности.

Механизм шифрования в этом посте - одноразовый блокнот, что означает, что секретный ключ может быть легко восстановлен злоумышленником с помощью 2 зашифрованных сообщений. XOR 2 зашифрованные сообщения, и вы получите ключ. Так просто!

На что указывает Мусса


Я использую Sun Base64Encoder / Decoder, который можно найти в Sun JRE, чтобы избежать еще одного JAR в lib. Это опасно с точки зрения использования OpenJDK или какой-либо другой JRE. Кроме того, есть ли еще одна причина, по которой я должен рассмотреть возможность использования Apache Commons lib с кодировщиком / декодером?

public class EncryptUtils {
    public static final String DEFAULT_ENCODING = "UTF-8"; 
    static BASE64Encoder enc = new BASE64Encoder();
    static BASE64Decoder dec = new BASE64Decoder();

    public static String base64encode(String text) {
        try {
            return enc.encode(text.getBytes(DEFAULT_ENCODING));
        } catch (UnsupportedEncodingException e) {
            return null;
        }
    }//base64encode

    public static String base64decode(String text) {
        try {
            return new String(dec.decodeBuffer(text), DEFAULT_ENCODING);
        } catch (IOException e) {
            return null;
        }
    }//base64decode

    public static void main(String[] args) {
        String txt = "some text to be encrypted";
        String key = "key phrase used for XOR-ing";
        System.out.println(txt + " XOR-ed to: " + (txt = xorMessage(txt, key)));

        String encoded = base64encode(txt);       
        System.out.println(" is encoded to: " + encoded + " and that is decoding to: " + (txt = base64decode(encoded)));
        System.out.print("XOR-ing back to original: " + xorMessage(txt, key));
    }

    public static String xorMessage(String message, String key) {
        try {
            if (message == null || key == null) return null;

            char[] keys = key.toCharArray();
            char[] mesg = message.toCharArray();

            int ml = mesg.length;
            int kl = keys.length;
            char[] newmsg = new char[ml];

            for (int i = 0; i < ml; i++) {
                newmsg[i] = (char)(mesg[i] ^ keys[i % kl]);
            }//for i

            return new String(newmsg);
        } catch (Exception e) {
            return null;
        }
    }//xorMessage
}//class
21
ответ дан 23 November 2019 в 23:39
поделиться

Я бы рекомендовал использовать какой-нибудь стандартный симметричный шифр, который широко доступен, например DES , 3DES или AES . Хотя это не самый безопасный алгоритм, существует множество реализаций, и вам просто нужно предоставить ключ любому, кто должен расшифровать информацию в штрих-коде. javax.crypto.Cipher - это то, с чем вы хотите здесь работать.

Предположим, байты для шифрования находятся в

byte[] input;

Далее вам понадобится ключ и вектор инициализации bytes

byte[] keyBytes;
byte[] ivBytes;

Теперь вы можете инициализировать шифр для выбранного вами алгоритма:

// wrap key data in Key/IV specs to pass to cipher
SecretKeySpec key = new SecretKeySpec(keyBytes, "DES");
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
// create the cipher with the algorithm you choose
// see javadoc for Cipher class for more info, e.g.
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");

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

cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
byte[] encrypted= new byte[cipher.getOutputSize(input.length)];
int enc_len = cipher.update(input, 0, input.length, encrypted, 0);
enc_len += cipher.doFinal(encrypted, enc_len);

А расшифровка будет выглядеть так:

cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);
byte[] decrypted = new byte[cipher.getOutputSize(enc_len)];
int dec_len = cipher.update(encrypted, 0, enc_len, decrypted, 0);
dec_len += cipher.doFinal(decrypted, dec_len);
111
ответ дан 23 November 2019 в 23:39
поделиться

Вот несколько ссылок, по которым вы можете прочитать, что поддерживает Java

Шифрование / дешифрование потока данных.

Этот пример демонстрирует, как зашифровать (используя симметричное шифрование алгоритм, такой как AES, Blowfish, RC2, 3DES и др.) Большой объем данных. В данные передаются частями в один из методы шифрования: EncryptBytes, EncryptString, EncryptBytesENC или EncryptStringENC. (Название метода указывает тип ввода (строка или байтовый массив) и возвращаемый тип (закодированная строка или байтовый массив). В Свойства FirstChunk и LastChunk используются, чтобы указать, является первым, средним или последним в поток, который нужно зашифровать. По умолчанию, оба FirstChunk и LastChunk равны true - означает, что данные прошли - вся сумма.

JCERefGuide

Примеры шифрования Java

2
ответ дан 23 November 2019 в 23:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: