2013-11-27 2 views
4

내 목표는 AES algorithm을 사용하여 텍스트 파일 (cipher text)을 암호화하는 Java 프로그램을 작성하는 것입니다. 그런 다음 암호화 된 파일 (cipher text)을 해독하여 일반 텍스트를 다시 가져 오는 다른 프로그램을 작성하십시오. 암호화 및 암호 해독 프로세스에 대해 동일한 키 (동일한 키, 한 번 생성, 어딘가에 저장하고 암호화 및 암호 해독 프로그램에서 사용)를 사용하려고합니다. 키를 생성하고 동일한 프로그램에서 한 줄씩 암호화 및 암호 해독을 수행하면 완벽하게 작동합니다. 여기에 대한 작업 코드 스 니펫은 다음과 같습니다.Java에서 비밀 키를 한 번 생성하고 두 개의 다른 프로그램에서이 키를 사용하는 방법

 String strDataToEncrypt = new String(); 
     String strCipherText = new String(); 
     String strDecryptedText = new String(); 

     KeyGenerator keyGen = KeyGenerator.getInstance("AES"); 
     keyGen.init(128); 
     SecretKey secretKey = keyGen.generateKey(); 

     Cipher aesCipher = Cipher.getInstance("AES"); 
     aesCipher.init(Cipher.ENCRYPT_MODE,secretKey); 

     strDataToEncrypt = "any text input"; 
     byte[] byteDataToEncrypt = strDataToEncrypt.getBytes(); 
     byte[] byteCipherText = aesCipher.doFinal(byteDataToEncrypt); 
     strCipherText = new BASE64Encoder().encode(byteCipherText); 
     System.out.println("cipher text: " +strCipherText); 
     aesCipher.init(Cipher.DECRYPT_MODE,secretKey,aesCipher.getParameters()); 
     byte[] byteDecryptedText = aesCipher.doFinal(new BASE64Decoder().decodeBuffer(strCipherText)); 
     strDecryptedText = new String(byteDecryptedText); 
     System.out.println("plain text again: " +strDecryptedText); 

그러나 암호화 및 암호 해독을 위해 두 가지 다른 프로그램 (java 파일)이 있어야합니다. 그래서, 어떻게 든 키를 생성하고 어딘가에 저장해야합니다. 그런 다음 암호화 및 암호 해독 프로그램에 동일한 키를 사용하십시오. 어떻게해야합니까?

EDIT_1

KeyGenerator keyGen = KeyGenerator.getInstance("AES"); 
keyGen.init(128); 
SecretKey secretKey = keyGen.generateKey(); 
byte[] encoded = secretKey.getEncoded(); 
System.out.println("key: "+encoded);// key: [[email protected] 

내가 위 프로그램을 사용하여 인코딩 된 키 값을 얻을 수 있습니다. 하지만 내 질문은 내 암호 해독 프로그램에서이 값을 사용하여 SecretKey를 생성하는 방법입니까?

+0

키를 생성하여 파일에 쓰지 못하게하고 두 번째 프로그램에서 읽지 못하게하는 것은 무엇입니까? –

+0

@JimGarrison 제 편집을보세요. –

+0

키는 시스템이 내부 ID를 기록하는'Object # toString()'을 사용하는'byte []'입니다. 각각의 바이트 _values_를 파일에 써야하는데, 아마도 그것들을 16 진수로 먼저 변환해야 할 것이다. –

답변

11

는 용서하지만 난 당신이 기존 키 인코딩에서 SecretKey 객체를 재구성 할 생각 바이트 배열

등으로 javax.crypto.spec.SecretKeySpec의 생성자를 이용하여 간단하게 수행 할 수 있기 때문에 SecretKeySpec

byte[] encoded = //Key data 

SecretKey secretKey = new SecretKeySpec(encoded, "AES"); 

에는 주조가 필요하지 SecretKey의 서브 클래스이다. 암호화/해독 알고리즘이 변경되면 나중에 사용하기로 결정한 알고리즘으로 생성자 AES에 사용 된 문자열 리터럴을 변경해야합니다.

+1

감사합니다. Base64Coder를 사용하여 키를 16 진수 문자열로 변환하고 환경 설정에 저장 한 다음 키를 검색하고 Base64Coder를 사용하여 디코딩하면 완벽하게 작동합니다. – Diljeet

1

여기 진수의 byte[] 배열의 값을 출력하는 하나 방법 : 나는 당신의 질문을 잘못 이해하는 경우

byte[] a = {-120, 17, 42,121}; 
for (byte b : a) 
{ 
    System.out.printf("%2X",b); 
} 
System.out.println(); 
+0

나는 이것도 사용할 수 있습니다 : Arrays.toString (byte []) 바이트 배열의 내용을 얻으려면. 그러나이 값을 사용하여 SecretKey를 초기화하는 방법을 잘 모르겠습니다. 아직도 파고 들어. –

+0

'Arrays.toString (byte []) '를 사용하면, 되돌릴 수없는 바이트 - 문자 인코딩 변환을 수행하게됩니다. –

+0

['Arrays.toString (byte [])'] (http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#toString (byte []))는 다음과 같이 정의됩니다. 변경할 가능성이 적은 배열의 표준 표현을 생성합니다. 그러나 나는 그것이 분명히이 목적에 이상적이지 않다는 것에 동의한다. @KeenLearner 키를 ASCII로 나타내야 할 경우 16 진수 또는 Base64 인코딩을 고려하고 파일에 바이너리 데이터가 포함될 수 있음을 명심하십시오. – ntoskrnl

관련 문제