2014-02-21 7 views
4

특정 질문,하지만 난 자바 코드에서 루비에 다음 코드 라인과 같은 '서명'생성 할 필요가 미안 :데이터 암호화

signature = OpenSSL::PKey::RSA.new(File.read("PUBLIC_PEM_PATH")).public_encrypt('SECRET_KEY')

내가 .PEM 키 파일이며 년대 SECRET_KEY이 뭔가 같은 : F6qxlwQTYWRM3gRfgftryKJHKYZiGXdoy5lDm4

내가 어떻게 할 수 있습니까?

감사합니다. 1

UPDATE 나는이 시도 :

File pubKeyFile = new File(keyFileName); 
    DataInputStream inputStream; 
    byte[] signature = null; 
    try { 
     inputStream = new DataInputStream(new FileInputStream(pubKeyFile)); 
     byte[] pubKeyBytes = new byte[(int)pubKeyFile.length()]; 
     inputStream.readFully(pubKeyBytes); 
     inputStream.close(); 

     KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
     X509EncodedKeySpec pubSpec = new X509EncodedKeySpec(pubKeyBytes); 
     RSAPublicKey pubKey = (RSAPublicKey) keyFactory.generatePublic(pubSpec); 

     Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
     cipher.init(Cipher.ENCRYPT_MODE, pubKey); 

     signature = cipher.doFinal(secretKey.getBytes()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return signature; 

을 그리고이 오류 가지고 :

java.security.spec.InvalidKeySpecException: java.lang.RuntimeException: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag 

UPDATE2 나는 .PEM 파일에서 공개 키를로드 관리 합니다. 하지만 지금은 암호에서 오류가 발생했습니다.

public static byte[] getSignature(String keyFileName, byte[] secretKey){ 
    byte[] signature = null; 
    try { 
     PublicKey pubKey = readKeyFromFile(keyFileName); 
     Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
     cipher.init(Cipher.ENCRYPT_MODE, pubKey); 

     signature = cipher.doFinal(secretKey); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return signature; 
} 
private static PublicKey readKeyFromFile(String keyFileName) throws IOException { 
    InputStream in = new FileInputStream(keyFileName); 
    DataInputStream din = new DataInputStream(in); 
    try { 
     BigInteger m = BigInteger.valueOf(din.readLong()); 
     BigInteger e = BigInteger.valueOf(din.readLong()); 
     RSAPublicKeySpec keySpec = new RSAPublicKeySpec(m, e); 
     KeyFactory fact = KeyFactory.getInstance("RSA"); 
     RSAPublicKey pubKey = (RSAPublicKey) fact.generatePublic(keySpec); 
     return pubKey; 
    } catch (Exception e) { 
     throw new RuntimeException("Spurious serialisation error", e); 
    } finally { 
     din.close(); 
    } 
} 

오류 로그 :

javax.crypto.IllegalBlockSizeException: input must be under 8 bytes 

어떤 생각?

+0

Signature 클래스를 사용하십시오. – EJP

+1

이것은 서명 체계처럼 보이지 않습니다. 요구 사항은 무엇입니까? – Henry

+0

"요구 사항"의 의미는 무엇입니까? Java에서 '서명'을 생성하기 만하면됩니다. – dum4ll3

답변

6

마지막으로 몇 시간 동안 연구 끝에 해결책을 찾아서 최종적으로 .pem 파일에서 내 공개 키를 읽고이 키의 인스턴스를 생성 할 수있었습니다. 그래서 나는 데이터를 암호화했다.

그러나 나는 그것을

---------- BEGIN RSA PUBLIC KEY-와 publicKeyString를 복사하여 '\ n을'같은 특수 문자없이 주요 내용를 붙여했습니다 --------

주요 내용

---------- END RSA 공개 키 ---------

static public PublicKey publicKey(String publicKeyString) { 
    try { 
     byte[] decodedPublicKey = Base64.decode(publicKeyString, 0); 
     ASN1InputStream in = new ASN1InputStream(decodedPublicKey); 
     ASN1Primitive obj = in.readObject(); 
     RSAPublicKeyStructure keyStruct = RSAPublicKeyStructure.getInstance(obj); 
     RSAPublicKeySpec keySpec = new RSAPublicKeySpec(keyStruct.getModulus(), keyStruct.getPublicExponent()); 
     KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
     return keyFactory.generatePublic(keySpec); 
    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } catch (InvalidKeySpecException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

탄탄한 성에서 PEMReader를 사용해도 실패했습니다. 모든 문제는 세부 사항 here으로 설명한 것처럼 1.9.3 이전의 Ruby 버전에서 생성 된 키와 관련이 있습니다.

어쨌든 관심을 가져 주셔서 감사합니다.

+0

해결책을 가져 주셔서 감사합니다. rferraz (+1) –

+0

고맙습니다. 나는 너무 기뻐요! – Gavjr

1

나에게 키 랩핑 (암호화) 된 것처럼 보입니다. 탄력성을 사용하여 PEM 파일을 읽은 다음 Cipher.getInstance("RSA/ECB/PKCS1Padding")을 사용하여 비밀 키를 암호화하고 기본 64로 결과를 인코딩합니다 ... 또한 Cipher.WRAP_MODE 모드로 시도해 볼 수 있습니다. 암호화는 항상 다른 결과를 반환합니다. 호환성을 테스트하는 유일한 방법은 다른 소프트웨어로 해독하는 것입니다.

+0

이 프로세스에 대한 자세한 내용을 알려주십시오. 조금 이해할 수 있지만 제안한 구현 방법에 대해서는 여전히 의문을 가지고 있습니다. 또한 가능한 경우 세 번째 파트 라이브러리를 사용하지 않는 것이 좋습니다. thaks – dum4ll3

+0

두 번째 질문에 대해서는 PEM이있는 경우 PEM에 포함 된 데이터를 직접 해독해야하거나 Java API에 기능이 포함되어 있지 않으므로 제 3 자 lib를 사용해야합니다. 아마도 Sun 구현의 어딘가에있을 것입니다.하지만 응용 프로그램을 추후에 중단하지 않으려면 사용하지 않아야합니다. –