Вопрос по java, android, encryption, aes – Android: зашифруйте строку с 256-битным шифрованием AES с помощью iv и секретного ключа

0
SecureRandom random = new SecureRandom(); // quite heavy, look into a lighter method.

String stringToEncrypt = "mypassword";
byte[] realiv = new byte[16];
random.nextBytes(realiv);
Cipher ecipher = Cipher.getInstance("AES");

SecureRandom random = new SecureRandom(); // quite heavy, look into a lighter method.

byte[] realiv = new byte[16];
random.nextBytes(realiv);       

byte[] secret = "somelongsecretkey".getBytes();
SecretKeySpec secretKey = new SecretKeySpec(secret, "AES");
ecipher.init(Cipher.ENCRYPT_MODE, secretKey, random);
byte[] encryptedData = ecipher.doFinal();

ноinit() принимает только 3 параметра. Мне нужен способ сделать что-то вроде:

ecipher.init(Cipher.ENCRYPT_MODE, stringToEncrypt, secretKey, random);

Ваш Ответ

2   ответа
1

ecipher.doFinal(stringToEncrypt)возможно после серииdoUpdate(...) если у вас есть более длинные строки.

.init() создает объект шифрования,update() а такжеdoFinal() заполните зашифрованный вывод и возьмите открытый текст в качестве ввода.

Конечно ты'нужно будетконвертировать междуString и байтовый массив.

Я вижу ... нужно сделать правильное преобразование байтового массива. KJW
5

что генерирует случайные числа для алгоритма, который имеет детерминированное поведение. Кроме того, вы невам нужен IV, когда вы используете блочный режим ECB, то есть то, что по умолчанию используется в Java. Чтобы быть точным, Java по умолчанию"AES/ECB/PKCS5Padding" для дюймаCipher.getInstance("AES")

Таким образом, вы должны быть в порядке с кодом, как это:

// lets use the actual key value instead of the platform specific character decoding
byte[] secret = Hex.decodeHex("25d6c7fe35b9979a161f2136cd13b0ff".toCharArray());

// that's fine
SecretKeySpec secretKey = new SecretKeySpec(secret, "AES");

// SecureRandom should either be slow or be implemented in hardware
SecureRandom random = new SecureRandom();

// first create the cipher
Cipher eCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

// filled with 00h characters first, use Cipher instance so you can switch algorithms
byte[] realIV = new byte[eCipher.getBlockSize()];

// actually fill with random
random.nextBytes(realIV);

// MISSING: create IvParameterSpec
IvParameterSpec ivSpec = new IvParameterSpec(realIV);

// create the cipher using the IV
eCipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);

// NOTE: you should really not encrypt passwords for verification
String stringToEncrypt = "mypassword";

// convert to bytes first, but don't use the platform encoding
byte[] dataToEncrypt = stringToEncrypt.getBytes(Charset.forName("UTF-8"));

// actually do the encryption using the data
byte[] encryptedData = eCipher.doFinal(dataToEncrypt);

Теперь это выглядит намного лучше. Я'Мы использовали кодек Apache Commons для декодирования шестнадцатеричной строки.

Обратите внимание, что вам нужно сохранитьrealIV сencryptedDataи что у тебя нетт защита целостности, например, MAC (для паролей это может и не понадобиться).

IvParameterSpec ivSpec = new IvParameterSpec(realIV); эта линия сделала это KJW
как вы расшифровываете? android developer
Хорошо, это было слишком много опечатокS и такие, извините за много правок, яя собираюсь на самом делепросыпайся. Maarten Bodewes
AES-256 определяет версию алгоритма Rijndael с размером блока 128 бит и ключом 256 бит. Вы'мы только что определили 32 шестнадцатеричный символ = 16 байт = 128-битный ключ. Вы не можете (напрямую) использовать AES-256, когда у вас есть 128-битный ключ. Maarten Bodewes
Рад, что вы это исправили Ким Чен Ву! Maarten Bodewes

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