2016-08-21 4 views
0

나는 암호화/암호 해독 프로그램을 연구 중이다. 나는 AES를 사용하고있다. 내가 고민하는 것은 string password을 제거하고 AES 세션 키를 만드는 것입니다. 이 AES 세션 키는 데이터를 암호화하고 해독하기 위해 실제로 사용하고자하는 것입니다. 그런 다음 개인 또는 공개 키를 사용하여이 AES 세션 키를 암호화하고 로컬로 저장하십시오 (예 : 목적).AES 세션 키를 암호화하기위한 공용/개인 키

지금까지 코딩 :

// password to encrypt the file 
String password = "[email protected]"; 

// salt is used for encoding 
byte[] salt = new byte[8]; 
SecureRandom secureRandom = new SecureRandom(); 
secureRandom.nextBytes(salt); 
FileOutputStream saltOutFile = new FileOutputStream("salt.enc"); 
saltOutFile.write(salt); 
saltOutFile.close(); 

SecretKeyFactory factory = SecretKeyFactory 
       .getInstance("PBKDF2WithHmacSHA1"); 
KeySpec keySpec = new PBEKeySpec(password.toCharArray(), salt, 65536, 
       128); 
SecretKey secretKey = factory.generateSecret(keySpec); 
SecretKey secret = new SecretKeySpec(secretKey.getEncoded(), "AES"); 

//padding AES encryption 
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
cipher.init(Cipher.ENCRYPT_MODE, secret); 
AlgorithmParameters params = cipher.getParameters(); 

// iv adds randomness to the text and just makes the mechanism more 
// secure 
// used while initializing the cipher 
// file to store the iv 
FileOutputStream ivOutFile = new FileOutputStream("iv.enc"); 
byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV(); 
ivOutFile.write(iv); 
ivOutFile.close(); 

//file encryption 
byte[] input = new byte[64]; 
int bytesRead; 

while ((bytesRead = inFile.read(input)) != -1) { 
     byte[] output = cipher.update(input, 0, bytesRead); 
     if (output != null) 
       outFile.write(output); 
} 

byte[] output = cipher.doFinal(); 
if (output != null) 
     outFile.write(output); 

inFile.close(); 
outFile.flush(); 
outFile.close(); 

사람이 변화의 관점에서, 나 좀 도와 주 시겠어요 아래

는 현재 완전히 암호화 및 일반 텍스트 문자열로 데이터를 해독하기 위해 노력하고 있습니다 코딩입니다 생성 된 세션 키에 string password. 그런 다음 공개 또는 개인 키를 사용하여이 세션 키를 암호화하고 로컬 시스템에 저장합니다.

나는 많은 다른 방법을 시도해 왔으며 매번 효과가 없었습니다.

+0

@GiorgiMoniava, 귀하의 회신에 감사드립니다. 나는 공개 키와 개인 키의 작업을 완전히 이해하고있다. 위와 같이 언급 한 이유는 모두 시스템의 사용자에 달려 있기 때문입니다. 이것은 사용자 만이 허용되거나 파일 수준에 대한 액세스 역할을하는 경우 공개 키로 세션 키를 암호화하여 액세스하거나 해독 할 수 있도록하기 때문입니다. 그런 다음 개인 키를 사용하면 여러 명이 액세스 할 수 있고 관련 서명이 필요하면 세션 키를 암호화하는 데 사용됩니다. 그러나 귀하의 회신에 다시 한 번 감사드립니다, 그것은 여전히 ​​감사하겠습니다. – John

답변

3

AES 키는 16, 24 또는 32 바이트로 구성되며 임의의 노이즈처럼 보입니다. 사용자는 결코 그것을 보지 않을 것입니다. 따라서 안전하게 생성 할 수 있습니다.

여기서 16 바이트 키를 생성했습니다. JRE/JDK 용 무제한 강도 정책 파일을 설치 한 경우에만 보안을 강화하려면 24 또는 32 바이트를 사용해야합니다.

지금, 나머지 암호화 쉽습니다 : 별도로

SecretKey secret = new SecretKeySpec(aesKey, "AES"); 
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
cipher.init(Cipher.ENCRYPT_MODE, secret); 
// everything else as before 

당신 수 암호화하여 공개 키aesKey. 개인 키로 "암호화"하는 경우 AES 키를 감시하지 못합니다. "개인 키로 암호화"는 서명이라고하며 데이터는 기밀이 아닙니다.

+0

귀하의 회신에 감사드립니다. 그래서 기본적으로 나는 그것을 올바르게 이해하고있다 : 나는 'String password'를 제거하고 안전한 무작위로 '위의 코딩'을 할 수있다. 그런 다음 aeskey를 개인 키로 암호화하고 저장하십시오. 다시 한번 감사드립니다. – John

+1

아니요! 모든 PBE, PBKDF2 및 SecretKeyFactory 항목을 제거 할 수 있지만 ** aesKey를 공개 키 **로 암호화해야합니다. 그렇지 않으면 AES 자체에서 제공하는 유일한 기밀 유지 기능을 얻지 못합니다. –

+0

다시 한번 알려 줘서 고맙습니다. 나는 그 일을 할 수 있었다. 공개 키를 사용하여 aeskey를 암호화해야하는 특별한 방법이 있습니까? 그러나 공개 키를 입력 스트림을 사용하여 읽어야 할 필요가 있다는 것을 알고 있습니다. 모든 도움을 주셔서 다시 한 번 감사드립니다. – John