Тема: Дайте оцінку программі
Я написав программу для шифрування тексту. Программа застосовує один із базових алгоритмів шифрування які наявні в 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, 446 downloads since 2015-10-21