Android 데이터 암호 화 Aes 암호 화
프로젝트 에서 로그 인,결제 등 인 터 페 이 스 는 rsa 비대 칭 암호 화 를 사용 하 는 것 을 제외 하고 aes 대칭 암호 화 를 사용 합 니 다.오늘 은 aes 암호 화 를 알 아 보 겠 습 니 다.
기타 몇 가지 암호 화 방식:
•Android 데이터 암호 화 Rsa 암호 화
•Android 데이터 암호 화 Aes 암호 화
•Android 데이터 암호 화 Des 암호 화
•Android 데이터 암호 화 MD5 암호 화
•Android 데이터 암호 화 Base 64 인 코딩 알고리즘
•Android 데이터 암호 화 SHA 보안 해시 알고리즘
aes 암호 화 는 무엇 입 니까?
고급 암호 화 표준(영어:Advanced Encryption Standard,줄 임 말:AES)은 암호학 에서 Rijndael 암호 화 법 이 라 고도 부 르 는데 미국 연방정부 가 사용 하 는 블록 암호 화 표준 이다.이 기준 은 기 존의 DES 를 대체 하 는 데 사용 되 었 으 며,이미 다방면으로 분석 되 어 전 세계 적 으로 널리 사용 되 고 있다.
다음은 구체 적 으로 어떻게 실현 되 는 지 실제 적 으로 살 펴 보 자.
AesUtils 클래스 상수 에 대한 소개:
private final static String HEX = "0123456789ABCDEF";
private static final String CBC_PKCS5_PADDING = "AES/CBC/PKCS5Padding";//AES CBC PKCS5Padding
private static final String AES = "AES";//AES
private static final String SHA1PRNG="SHA1PRNG";//// SHA1PRNG , 4.2
어떻게 랜 덤 키 를 생 성 합 니까?
/*
* , ,
*/
public static String generateKey() {
try {
SecureRandom localSecureRandom = SecureRandom.getInstance(SHA1PRNG);
byte[] bytes_key = new byte[20];
localSecureRandom.nextBytes(bytes_key);
String str_key = toHex(bytes_key);
return str_key;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
Aes 키 처리
//
private static byte[] getRawKey(byte[] seed) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance(AES);
//for android
SecureRandom sr = null;
// 4.2 ,SecureRandom
if (android.os.Build.VERSION.SDK_INT >= 17) {
sr = SecureRandom.getInstance(SHA1PRNG, "Crypto");
} else {
sr = SecureRandom.getInstance(SHA1PRNG);
}
// for Java
// secureRandom = SecureRandom.getInstance(SHA1PRNG);
sr.setSeed(seed);
kgen.init(128, sr); //256 bits or 128 bits,192bits
//AES 128 10 ,192 12 ,256 14 。
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
return raw;
}
Aes 암호 화 과정
/*
*
*/
public static String encrypt(String key, String cleartext) {
if (TextUtils.isEmpty(cleartext)) {
return cleartext;
}
try {
byte[] result = encrypt(key, cleartext.getBytes());
return Base64Encoder.encode(result);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/*
*
*/
private static byte[] encrypt(String key, byte[] clear) throws Exception {
byte[] raw = getRawKey(key.getBytes());
SecretKeySpec skeySpec = new SecretKeySpec(raw, AES);
Cipher cipher = Cipher.getInstance(CBC_PKCS5_PADDING);
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(new byte[cipher.getBlockSize()]));
byte[] encrypted = cipher.doFinal(clear);
return encrypted;
}
Aes 복호화 과정
/*
*
*/
public static String decrypt(String key, String encrypted) {
if (TextUtils.isEmpty(encrypted)) {
return encrypted;
}
try {
byte[] enc = Base64Decoder.decodeToBytes(encrypted);
byte[] result = decrypt(key, enc);
return new String(result);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/*
*
*/
private static byte[] decrypt(String key, byte[] encrypted) throws Exception {
byte[] raw = getRawKey(key.getBytes());
SecretKeySpec skeySpec = new SecretKeySpec(raw, AES);
Cipher cipher = Cipher.getInstance(CBC_PKCS5_PADDING);
cipher.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(new byte[cipher.getBlockSize()]));
byte[] decrypted = cipher.doFinal(encrypted);
return decrypted;
}
바 이 너 리 문자
//
public static String toHex(byte[] buf) {
if (buf == null)
return "";
StringBuffer result = new StringBuffer(2 * buf.length);
for (int i = 0; i < buf.length; i++) {
appendHex(result, buf[i]);
}
return result.toString();
}
private static void appendHex(StringBuffer sb, byte b) {
sb.append(HEX.charAt((b >> 4) & 0x0f)).append(HEX.charAt(b & 0x0f));
}
테스트 프로그램:
List<Person> personList = new ArrayList<>();
int testMaxCount = 1000;//
//
for (int i = 0; i < testMaxCount; i++) {
Person person = new Person();
person.setAge(i);
person.setName(String.valueOf(i));
personList.add(person);
}
//FastJson json
String jsonData = JsonUtils.objectToJsonForFastJson(personList);
Log.e("MainActivity", "AES json ---->" + jsonData);
Log.e("MainActivity", "AES json ---->" + jsonData.length());
// key
String secretKey = AesUtils.generateKey();
Log.e("MainActivity", "AES secretKey ---->" + secretKey);
//AES
long start = System.currentTimeMillis();
String encryStr = AesUtils.encrypt(secretKey, jsonData);
long end = System.currentTimeMillis();
Log.e("MainActivity", "AES cost time---->" + (end - start));
Log.e("MainActivity", "AES json ---->" + encryStr);
Log.e("MainActivity", "AES json ---->" + encryStr.length());
//AES
start = System.currentTimeMillis();
String decryStr = AesUtils.decrypt(secretKey, encryStr);
end = System.currentTimeMillis();
Log.e("MainActivity", "AES cost time---->" + (end - start));
Log.e("MainActivity", "AES json ---->" + decryStr);
실행 시간:이 를 통 해 알 수 있 듯 이 대칭 Aes 의 효율 은 비교적 높다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.