С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Taraun
0 / 0 / 0
Регистрация: 14.09.2015
Сообщений: 2
1

Aes шифрование на Android

29.09.2016, 15:38. Просмотров 640. Ответов 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
Всем привет! Я столкнулся с проблемой написания программы шифрования стандарту...

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

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

Не предлагается установка Android SDK при установке Android Studio
на сайте https://developer.android.com/studio/... скачал exeшник для...

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

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

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

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

Ошибка в Android Studio Error:No resource identifier found for attribute 'appComponentFactory' in package 'android'
Доброго времени суток! При компиляции андроид приложении выходит данная...


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

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

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