Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- VMware
- Error 1720
- 고정 IP주소를 가진 네트워크 어댑터를 검색할 수 없습니다.
- 운영관리제어의 축소
- 가상 프라이빗 클라우드
- 클라우드 소비자
- 온디맨드식
- 수평적 확장
- VMWare View Connection Serve
- DHCP 설치
- VMWare vSphere
- IT 자원
- 클라우드 보안 취약성
- DHCP 설정
- 이 컴퓨터는 도메인의 구성원이 아닙니다.
- dhcp
- 정수형 데이터타입
- 클라우드 제공자
- Virtual Private Cloud
- Community Cloud
- 제한된 이식성
- 자원 풀링
- 클라우드 자원 관리자
- 클라우드 서비스 소유자
- View Connection
- 수직적 확장
- 커뮤니티 클라우드
- 도메인 사용자 또는 그룹을 확인할 수 없습니다.
- 멀티테넌시
- 온 프레미스
Archives
- Today
- Total
한 걸음씩..
AES GCM Mode 본문
반응형
-
AES GCM Mode 사용 시 IV 가 존재하지 않으면 동일한 key 라도 암호문이 다를 수 있다
-
GCMParameterSpec 사용
public class App {
public static final int AES_KEY_SIZE = 256;
public static final int GCM_IV_LENGTH = 16;
public static final int GCM_TAG_LENGTH = 16;
public static byte[] getKey() {
String encodedKey = System.getenv("BASE64_ENCODED_KEY");
Decoder decoder = Base64.getDecoder();
byte[] decodedKey = decoder.decode(encodedKey);
if (decodedKey.length != 32) {
throw new IllegalArgumentException();
}
return decodedKey;
}
public static byte[] generateRandomIV() {
byte[] IV = new byte[GCM_IV_LENGTH];
SecureRandom random = new SecureRandom();
random.nextBytes(IV);
return IV;
}
public static EncryptedField encrypt(String text) throws Exception {
Cipher cipher = Cipher.getInstance("AES/GCM/Nopadding");
SecretKeySpec keySpec = new SecretKeySpec(getKey(), "AES");
byte[] nonce = generateRandomIV();
GCMParameterSpec gcmParameterSpec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, nonce);
cipher.init(Cipher.ENCRYPT_MODE, keySpec, gcmParameterSpec);
byte[] cipherText = cipher.doFinal(text.getBytes());
return new EncryptedField(nonce, cipherText);
}
public static String decrypt(byte[] cipherText, byte[] nonce) throws Exception {
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
SecretKeySpec keySpec = new SecretKeySpec(getKey(), "AES");
GCMParameterSpec gcmParameterSpec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, nonce);
cipher.init(Cipher.DECRYPT_MODE, keySpec, gcmParameterSpec);
byte[] decryptedText = cipher.doFinal(cipherText);
return new String(decryptedText);
}
public static void main(String[] args) throws Exception {
String queriedField = "v=1,a=aes256gcm,3uiCUhKGdcIbcZcXU5wCzw==,t6YzJ8BWI7stb+U=,R1kgOsyI/vJRwbX2cN9/bg==";
EncryptedField field = new EncryptedField(queriedField);
System.out.println(field.getField());
String text = decrypt(field.getCipherTextAndTag(), field.getNonce());
System.out.println(text);
System.out.println("********");
EncryptedField newField = encrypt("1234567890");
System.out.println(newField.getField());
System.out.println(
decrypt(newField.getCipherTextAndTag(), newField.getNonce())
);
}
}
반응형
'프로그래밍' 카테고리의 다른 글
stl::map insert failed (0) | 2024.05.22 |
---|---|
jqGrid ip (0) | 2024.05.22 |
RegSystemToUser (0) | 2024.05.22 |
[ C++ ] 데이터모델 (2) | 2014.09.21 |
SplitString ( CString Parser ) (0) | 2014.07.14 |