Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Taraun
0 / 0 / 0
Регистрация: 14.09.2015
Сообщений: 2
#1

Aes шифрование на Android - Программирование Android

29.09.2016, 15:38. Просмотров 372. Ответов 0
Метки нет (Все метки)

Добрый день.
Разработал модуль для Aes256 шифрования на java (Ну как разработал? Что-то позаимствовал, ну около 80% кода)
На сервере работает на ура (Сервер Apache tomcat 6.0)
Но при переносе на смартфон выпадает в ошибку.

Вываливается Null Pointer в строке:
Cipher cipher = Cipher.getInstance(ALGO, "SunJCE");

Причем если не указывать SunJCE, те:
Cipher cipher = Cipher.getInstance(ALGO);

Он отрабатывает, но в этом случае шифрование идет не тем методом что мне нужен. (особенности сервера)

Пробовал смотреть куда он лезет, накопал несколько странных вещей:

Ошибка в android-sdk Security.java (screen1)

С чем может быть связано такое поведение?

Собственно код:
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
import java.io.UnsupportedEncodingException;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.*;
//import sun.misc.BASE64Decoder;
//import sun.misc.BASE64Encoder;
 
import com.GreenHouseMobile.Base64.BASE64Encoder;
import com.GreenHouseMobile.Base64.BASE64Decoder;
 
/**
 *
 * @author
 */
public class Aes256 {
 
    private static String password;
    private static int keySize = 256;
    private static final String ALGO = "AES"; //"AES/ECB/PKCS5Padding"
    private static Aes256 instance;
 
    private static SecretKey key;
    public static String sekretPasKey;
 
    public synchronized static Aes256 getInstance() throws UnsupportedEncodingException {
        if(instance == null) {
 
            instance = new Aes256();
        }
 
        return instance;
    }
 
    public static String getKey()
    {
        return new BASE64Encoder().encode(key.getEncoded());
    }
 
    public String setKey(String passKey) throws UnsupportedEncodingException
    {
        String result = "";
 
        password = passKey;
 
        key = new SecretKeySpec(safePassword(password).getBytes("UTF-8"), "AES");
 
        sekretPasKey = new BASE64Encoder().encode(key.getEncoded());
 
        return sekretPasKey;
    }
 
    private String pad2(String n) {
        if (n.length() < 2) {
            return "0" + n;
        } else {
            return n;
        }
    }
 
    public String hex(byte[] bytes) {
        String r = "";
        for (int i = 0; i < bytes.length; i++) {
            r = r + pad2(Integer.toHexString(bytes[i] + 128));
        }
        return r;
    }
 
    private static String safePassword(String unsafe) {
        String safe = unsafe;
        if (safe.length() > 16) {
            safe = safe.substring(0, 16);
        }
        int nn = safe.length();
        for (int i = nn - 1; i < 15; i++) {
            safe = safe + "*";
        }
        return safe;
    }
 
    public  String encrypt(String value){
 
        String result = "";
        byte[] encrypted = null;
        try{
 
            Cipher cipher = Cipher.getInstance(ALGO, "SunJCE");
            cipher.init(Cipher.ENCRYPT_MODE, key);
            encrypted = cipher.doFinal(value.getBytes("UTF-8"));
            System.err.println(new BASE64Encoder().encode(encrypted));
            result = hex(encrypted);
        } catch(Exception e){
            e.printStackTrace();
        }
        //return result;
        return new BASE64Encoder().encode(encrypted);
    }
 
    private int parseInt2(String s) {
        return (new java.math.BigInteger(s, 16)).intValue();
    }
 
    private byte[] fromHex(String enc) {
        if (enc == null) {
            return null;
        }
        byte[] r = new byte[enc.length() / 2];
        for (int i = 0; i < r.length; i++) {
            int n = parseInt2(enc.substring(i * 2, i * 2 + 2)) - 128;
            r[i] = (byte) n;
        }
        return r;
    }
 
    public String decrypt(String value){
 
        String result = "";
        try{
            /*byte[] encypted = fromHex(value);
            if (encypted == null) {
                return "";
            } */
            System.err.println("Val: " + value);
            BASE64Decoder decoder = new BASE64Decoder();
            byte[] encypted = decoder.decodeBuffer(value);
            System.err.println("Enc: " + encypted);
            //SecretKey key = new SecretKeySpec(safePassword(password).getBytes("UTF-8"), "AES");
 
            System.err.println(new BASE64Encoder().encode(key.getEncoded()));
            Cipher cipher = Cipher.getInstance(ALGO, "SunJCE");
            cipher.init(Cipher.DECRYPT_MODE, key);
            byte[] decrypted = cipher.doFinal(encypted);
            result = new String(decrypted, "UTF-8");
        } catch(Exception e){
            e.printStackTrace();
        }
        return result;
    }
 
    private static String generateRandomString()
    {
        String symbols = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890";
        StringBuilder randString = new StringBuilder();
        int count = (int)(Math.random()*30);
        for(int i=0;i<count;i++)
            randString.append(symbols.charAt((int)(Math.random()*symbols.length())));
 
        return randString.toString();
 
    }
}


ЗЫ: Пишу на intellij idea 15.0.4
Настройки проекта screen2
0
Миниатюры
Aes шифрование на Android   Aes шифрование на Android  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.09.2016, 15:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Aes шифрование на Android (Программирование Android):

AES для Android - Программирование Android
Всем привет! Я столкнулся с проблемой написания программы шифрования стандарту AES для мобильной платформы Android. Подскажыте какие...

Ошибка дешифровки AES в Android: pad block corrupted - Программирование Android
Приветствую. В обучающих целях написал на Java программу для хранения паролей, использующую шифрование AES. Написал класс, в котором...

Откуда берутся атрибуты android:layout_width и android:layout_height в элементе LinearLayout? - Программирование Android
Недавно начал изучать Android API, а сегодня более менее разобрал основы синтакиса XML. Затем стал разбирать следующий пример: ...

Ошибка: Caused by Android java.lang.ClassCastException: android.app.Application cannot be cast - Программирование Android
Здравствуйте. Очень нужен ваш совет. При запуске приложения появляется ошибка: Caused by: java.lang.ClassCastException:...

Android studio, как запускать программу сразу на android смартфоне подключенному к usb? - Программирование Android
android studio, как запускать программу сразу на android смартфоне подключенному к usb?

Как приложение Android написать на С++ в Android NDK, чтоб получить *.apk? Нужен мануал - Программирование Android
Уже не в первый раз задаю вопрос. Молчание. В лучшем случае - &quot;RTFM&quot; и точка. Так вот, официального мануала, где есть ответ на...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.09.2016, 15:38
Привет! Вот еще темы с ответами:

Android NDK. Как пользоваться? Когда стоит использовать его вместо Android SDK? - Программирование Android
Можно ли писать в нем готовые приложения Android?

Android.support.v4.app.FragmentActivity не работает в Android Studio - Программирование Android
объясните пожалуйста,как в андроид студио добавить вышеуказанную библиотеку,чтобы работало у меня вот это Активити package...

Выбор мощного android смартфона до 10 рублей, для тестирования проектов Android Studio, что посоветуете? - Программирование Android
Какую фирму посоветуете?

Запуск игры mr.Nom через Android Studio (по книге марио цехнер программирование игр под android) - Программирование Android
Привет всем! Для тех кто читал книгу - в конце 6ой главы мы закончили писать код игры. В книге написано что - игра готова. Но в самих...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru