javax.crypto
Этот пакет предоставляет классы и интерфейсы для криптографических приложений, реализующих алгоритмы шифрования, дешифрования или согласования ключей.
Потоковые шифры поддерживаются кака также асимметричные, симметричные и блочные шифры.Реализации шифров от разных поставщиков могут быть интегрированы с использованием абстрактных классов SPI (Service Provider Interface).С классом SealedObject программист может защитить объект, зашифровав его с помощью шифра.
Аутентификация может быть основана на MAC (код аутентификации сообщения), таком как HMAC (Hash MAC, то есть с хэш-функцией SHA-1).
Пример:
Простой вспомогательный класс для шифрования и дешифрования строк с использованием AES128.Результат в кодировке Ascii (фактически шестнадцатеричный, без base64), поэтому не нужно хранить ни одного байта [].Значение SEED используется в качестве общего секрета («Мастер-пароль»).Только с тем же SEED сохраненные значения могут быть расшифрованы.
<code>package com.xxx;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
/**
* Usage:
* <pre>
* String crypto = SimpleCrypto.encrypt(masterpassword, cleartext)
* ...
* String cleartext = SimpleCrypto.decrypt(masterpassword, crypto)
*
* @author ferenc.hechler * / public class SimpleCrypto {public static String encrypt (String seed, String cleartext) выдает исключение {byte [] rawKey = getRawKey(seed.getBytes ());byte [] result = encrypt (rawKey, cleartext.getBytes ());возврат к Hex (результат);} public static String decrypt (String seed, String encrypted) создает исключение {byte [] rawKey = getRawKey (seed.getBytes ());byte [] enc = toByte (зашифрованный);byte [] result = decrypt (rawKey, enc);вернуть новую строку (результат);} закрытый статический byte [] getRawKey (byte [] seed) создает исключение {KeyGenerator kgen = KeyGenerator.getInstance ("AES");SecureRandom sr = SecureRandom.getInstance ("SHA1PRNG", "Crypto");sr.setSeed (семян);kgen.init (128, ср);// 192 и 256 битов могут быть недоступны SecretKey skey = kgen.generateKey ();byte [] raw = skey.getEncoded ();вернуть сырье;} private static byte [] encrypt (byte [] raw, byte [] clear) создает исключение {SecretKeySpec skeySpec = new SecretKeySpec (raw, "AES");Cipher cipher = Cipher.getInstance ("AES");cipher.init (Cipher.ENCRYPT_MODE, skeySpec);byte [] encrypted = cipher.doFinal (clear);возврат зашифрован;} частный статический byte [] decrypt (byte [] raw, byte [] зашифрованный) создает исключение {SecretKeySpec skeySpec = new SecretKeySpec (raw, "AES");Cipher cipher = Cipher.getInstance ("AES");cipher.init (Cipher.DECRYPT_MODE, skeySpec);byte [] decrypted = cipher.doFinal (зашифрованный);возврат расшифрован;} public static String toHex (String txt) {return toHex (txt.getBytes ());} public static String fromHex (String hex) {return new String (toByte (hex));} открытый статический byte [] toByte (String hexString) {int len = hexString.length () / 2;байт [] результат = новый байт [лен];для (int i = 0; i > 4) & 0x0f)). append (HEX.charAt (b & 0x0f));}}
Для получения дополнительной информации см. Безопасность Android. Как шифровать и дешифровать строки? и Шифрование на Android & BouncyCastle