1 Востаннє редагувалося generation (21.10.2015 18:23:01)

Тема: Дайте оцінку программі

Я написав программу для шифрування тексту. Программа застосовує один із базових алгоритмів шифрування які наявні в Java SE. Інструкція в программі. Як Вам сама задумка і що можно добавити в программу? Є додаткові кнопки для копіювання/вставки данних із буфера обміну вашого телефону. Критика приймається в повній мірі))
P.S. Якщо Ви щось не зрозуміли, то звертайтеся в тему. Программа застосовує відкриті ключи для шифрування/дешифрування тексту. Один із таких, а саме "стоковий" знаходиться під кнопкою - "DefKey"

Класс шифрування повідомлення:

Прихований текст
package com.badsoft.layoutinflate;

import android.util.Base64;

import javax.crypto.*;
import java.io.*;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

/**
 * Класс предназначен для шифровки и дешифровки текста.
 * 
 * @author Румянцев О.В. (c) BadSoft Team.
 *
 */
public class StringCrypter {
    Cipher ecipher;
    Cipher dcipher;

    SecretKey key;
    /**
     * Конструктор класса
     *
     * @param k - секретный ключ для шифрования/расшифрования данных
     * @throws NoSuchAlgorithmException
     * @throws NoSuchPaddingException
     * @throws InvalidKeyException
     */
    public StringCrypter(SecretKey k) throws NoSuchAlgorithmException,
            NoSuchPaddingException, InvalidKeyException {
        key = k;

        ecipher = Cipher.getInstance("DES");
        dcipher = Cipher.getInstance("DES");

        ecipher.init(Cipher.ENCRYPT_MODE, key);
        dcipher.init(Cipher.DECRYPT_MODE, key);
    }

    /**
     * Шифрование строки.
     *
     * @param str - строка для шифрования данных.
     * @return - возвращает зашифрованную строку.
     * @throws UnsupportedEncodingException
     * @throws IllegalBlockSizeException
     * @throws BadPaddingException
     */
    public String encrypt(String str) throws UnsupportedEncodingException,
            IllegalBlockSizeException, BadPaddingException {
        byte[] utf8 = str.getBytes("UTF-8");
        byte[] enc = ecipher.doFinal(utf8);
        return Base64.encodeToString(enc, 0);
    }

    /**
     * Расшифровка строки.
     * ВНИМАНИЕ! Важно что бы ключ был одинаковый.
     *
     * @param str - строка которую нужно расшифровать.
     * @return
     * @throws IOException
     * @throws IllegalBlockSizeException
     * @throws BadPaddingException
     */
    public String dcrypt(String str) throws IOException, IllegalBlockSizeException,
            BadPaddingException {
        byte[] dec = Base64.decode(str, 0);
        byte[] utf8 = dcipher.doFinal(dec);
        return new String(utf8, "UTF-8");
    }

}

Головна Activity программи:

Прихований текст
package com.badsoft.layoutinflate;

import android.app.Activity;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import android.util.Base64;

import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

/**
 * Главная активность приложения
 * 
 * @author Румянцев О.В. (c) BadSoft Team.
 *
 */
public class MainActivity extends Activity {
    EditText ecrypt, dcrypt, edKey;

    //текст который идет перед ключом..
    //private final String descrip = "javax.crypto.spec.SecretKeySpec";

    SecretKey key = null;
    StringCrypter encrypter;
    final String defaultKey = "T0pUKoXIFnM";
    
    Runtime runtime = Runtime.getRuntime();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        setContentView(R.layout.activity_main);
        
        ecrypt = (EditText) findViewById(R.id.text_crypt);
        dcrypt = (EditText) findViewById(R.id.cryptMessage);
        edKey  = (EditText) findViewById(R.id.edKey);
        
        //применяем стандартный ключ - defaultKey
        byte[] encodeKey = Base64.decode(defaultKey, defaultKey.length());
        edKey.setText(defaultKey);
        key = new SecretKeySpec(encodeKey, 0, encodeKey.length, "DES");

        edKey.setText(defaultKey);
        
        runtime.gc();
    }


    /**
     * Метод "обрабатует" ключ для показа "внятного" для пользователя видa
     *
     * Метод уже не используется...
     *
     * @param key - собственно, это ключ
     * @return - возвращается урезанная строка
     */
    public String subKey(String key) {
        //стандартное значение - 31 символ нужно урезать
        return key.substring(0);
    }
    
    /**
     * Декодируем ключ для вывода в текстовое поле.
     * 
     * @param key - актуальный ключ
     * @return - строка, которая выходит из ключа
     */
    public String encodeKey(SecretKey key) {
        String str = Base64.encodeToString(key.getEncoded(), key.toString().length());
        return str;
    }

    /**
     * Обработчик кнопки шифрования сообщения
     *
     * @param view - не важно что это.
     * @throws IllegalBlockSizeException
     * @throws BadPaddingException
     * @throws IOException
     * @throws InvalidKeyException
     * @throws NoSuchAlgorithmException
     * @throws NoSuchPaddingException
     */
    public void cryptMessages(View view) throws IllegalBlockSizeException, BadPaddingException,
            IOException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException{
        Toast.makeText(this, "Crypt message", Toast.LENGTH_SHORT).show();

        encrypter = new StringCrypter(key);

        String str = ecrypt.getText().toString();
        dcrypt.setText(encrypter.encrypt(str));
    }

    /**
     * Обработчик кнопки для дешифровки сообщения
     *
     * @param view - в данном случаем это - неважно
     * @throws IllegalBlockSizeException
     * @throws BadPaddingException
     * @throws IOException
     * @throws InvalidKeyException
     * @throws NoSuchAlgorithmException
     * @throws NoSuchPaddingException
     */
    public void encryptMessages(View view) throws IllegalBlockSizeException, BadPaddingException,
            IOException, NoSuchAlgorithmException, NoSuchPaddingException{
        Toast.makeText(this, "Encrypt message", Toast.LENGTH_SHORT).show();

        try{
            encrypter = new StringCrypter(key);
        } catch(InvalidKeyException e) {
            Toast.makeText(this, "Неверный ключ!", Toast.LENGTH_SHORT).show();
        }

        String str = dcrypt.getText().toString();
        ecrypt.setText(encrypter.dcrypt(str));
    }
    
    /**
     * Обработчик кнопок
     * Копирование текста в буфер "обмана"
     * 
     * @param view
     */
    public void btnCopyHandler(View view) {
        switch(view.getId()) {
        case R.id.btnCopyDecrypt:
            copyInBuffer(dcrypt);
            Toast.makeText(this, "Скопировано!", Toast.LENGTH_SHORT).show();
            break;
        case R.id.btnCopyKey:
            copyInBuffer(edKey);
            Toast.makeText(this, "Скопировано!", Toast.LENGTH_SHORT).show();
            break;
        default:
            return;
        }
    }
    
    /**
     * Обработчик для кнопки "Вставить" (eng. - Paste)
     * 
     * @param view
     */
    public void btnPasteHandler(View view) {
        switch(view.getId()) {
        case R.id.btnPasteDecrypt:
            paste(dcrypt);
            break;
        case R.id.btnPasteKey:
            paste(edKey);
            break;
        }
    }

    /**
     * Метод для очистки сообщения которое нужно зашифровать.
     *
     * @param view - неважно
     */
    public void btnClearEncrypt(View view) {
        ecrypt.setText("");
    }

    /**
     * Метод для очистки дешифрованного сообщения
     *
     * @param view - заглушка
     */
    public void btnClearDecrypt(View view) {
        dcrypt.setText("");
    }

    /**
     * Метод генерации нового ключа
     *
     * @param view - заглушка
     */
    public void btnGenKey(View view) {
        try{
            key = KeyGenerator.getInstance("DES").generateKey();
            edKey.setText(encodeKey(key));
        } catch(NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }

    /**
     * Обработчик кнопки "загрузить ключ"
     * !!! он НЕ работает на данный момент ибо Я отключил кликабельность кнопки
     *      потому что метод не преобразовует строку в ключ. Занимаюсь этой проблемой.
     *      
     *      [fix] Уже работает
     *
     * @param view - заглушка
     */
    public void btnKeyLoad(View view) {
        byte[] encodeKey = Base64.decode(edKey.getText().toString(), edKey.getText().toString().length());
        key = new SecretKeySpec(encodeKey, 0, encodeKey.length, "DES");
    }

    /**
     * Метод для очистки ключа
     *
     * @param view - заглушка
     */
    public void btnClearKey(View view) {
        edKey.setText("");
    }
    
    /**
     * Кнопка, которая делает актуальным стандартный ключ(переменная defaultKey)
     * 
     * @param view
     */
    public void btnDefKey(View view) {
        byte[] encodeKey = Base64.decode(defaultKey, defaultKey.length());
        edKey.setText(defaultKey);
        key = new SecretKeySpec(encodeKey, 0, encodeKey.length, "DES");
    }
    
    /**
     * Обработчик нажатия на кнопку ХЕЛП
     * @param view
     */
    public void btnHelp(View view) {
        Intent intent = new Intent(MainActivity.this, HelpActivity.class);
        startActivity(intent);
    }
    
    /**
     * Копирует данные из текстового поля в буффера обмена.
     * 
     * @param edText - тестовое поле из которого копировать данные
     */
    public void copyInBuffer(EditText edText) {
        int androidCurVer = Build.VERSION.SDK_INT;
        //Узнаем версию андроида
        if(androidCurVer >= Build.VERSION_CODES.HONEYCOMB) {
            ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
            ClipData clip = ClipData.newPlainText("copy", edText.getText().toString());
            clipboard.setPrimaryClip(clip);
        } else {
            ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
            clipboard.setText(edText.getText().toString());
        }
    }
    
    /**
     * Вставить данные из буффера обмена
     * 
     * @param ed - текстовое поле куда будут вставлены данные
     */
    public void paste(EditText ed) {
        ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
        ed.setText(clipboard.getText());
    }
}

P.S.S. Писав для себе. Можливо, десь затупив, але Я тільки навчаюсь) Критику приймаю)

Post's attachments

LayoutInflate.apk 50.75 kb, 410 downloads since 2015-10-21 

2

Re: Дайте оцінку программі

Кодом не поділитесь? Так нам буде легше зламати програму.

Подякували: 0xDADA11C71

3

Re: Дайте оцінку программі

quez написав:

Кодом не поділитесь? Так нам буде легше зламати програму.

Зламати можна тільки знаючи ключ шифру, а інакше - це дуже затратна операція)
Зачекайте хвилинку. Я прикріплю соурс-код до першого посту)

4

Re: Дайте оцінку программі

DES - дуже слабкий алгоритм, на сьогоднішній час.
І не варто зберігати ключі у відкритому вигляді в коді:

Post's attachments

Crack.png 61.47 kb, 218 downloads since 2015-10-21 

Подякували: quez, generation, leofun013

5 Востаннє редагувалося generation (21.10.2015 22:37:10)

Re: Дайте оцінку программі

Torbins написав:

DES - дуже слабкий алгоритм, на сьогоднішній час.
І не варто зберігати ключі у відкритому вигляді в коді:

Це стоковий ключ. Його не рекомендовано вживати) Я зробив кнопки для генерації випадкового ключа, а якщо хтось буде відправляти повідомлення, то вже потрібно буде самому подбати про обмежений доступ до ключа(як зробити це программно, Я ще не придумав). Стоковий ключ видно при запуску програми)) Я його не ховаю) він зроблений задля демонстрації шифрування та дешифрування тексту)) а за статтю - спасибі. Буду знати)

6

Re: Дайте оцінку программі

що можно добавити в программу

месенджер.