2014-01-15 3 views
1

그 주제에 관해 몇 가지 다른 질문이 있지만 그 중 누구도 나를 도와주지는 못했습니다. 나는 BouncyCastle lib도 시도했다. 누군가 나 좀 도와 줄래? 것처럼 PEM 파일을 찾습니다 :이 방법PEM 개인 키 파일을 Java PrivateKey 개체로 변환

public static PrivateKey getPemPrivateKey(String filename) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException { 
    File f = new File(PEMFILES_FOLDER+filename); 
    FileInputStream fis = new FileInputStream(f); 
    DataInputStream dis = new DataInputStream(fis); 
    byte[] keyBytes = new byte[(int) f.length()]; 
    dis.readFully(keyBytes); 
    dis.close(); 

    String temp = new String(keyBytes); 
    //TODO care about the linefeeds 
    String privKeyPEM = temp.replace("-----BEGIN RSA PRIVATE KEY-----\n", ""); 
    privKeyPEM = privKeyPEM.replace("-----END RSA PRIVATE KEY-----", ""); 

    System.out.println("Private key: \n"+privKeyPEM); 

    Base64 b64 = new Base64(); 
    byte [] decoded = b64.decode(privKeyPEM); 


    PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(decoded); 
    KeyFactory kf = KeyFactory.getInstance(RSA); 
    return kf.generatePrivate(spec); 
} 

나는이 오류가 무엇입니까 사용하고

-----BEGIN RSA PRIVATE KEY----- 
    MIIEpAIBAAKCAQEAq2eYtnTsEc/qyqS ... 


    ... zY3WG++SA+amcXiO721hJWNC+uTbZ1bzQ== 
    -----END RSA PRIVATE KEY----- 

:

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid parse error, not a sequence 

답변

1

을 나는이 당신을 도울 수 있기를 바랍니다. 주요 프로그램은 다음과 같습니다

public PrivateKey getPemPrivateKey(String filename, String algorithm) throws Exception { 
      File f = new File(filename); 
      FileInputStream fis = new FileInputStream(f); 
      DataInputStream dis = new DataInputStream(fis); 
      byte[] keyBytes = new byte[(int) f.length()]; 
      dis.readFully(keyBytes); 
      dis.close(); 

     String temp = new String(keyBytes); 
     String privKeyPEM = temp.replace("-----BEGIN PRIVATE KEY-----", ""); 
     privKeyPEM = privKeyPEM.replace("-----END PRIVATE KEY-----", ""); 
     //System.out.println("Private key\n"+privKeyPEM); 

     BASE64Decoder b64=new BASE64Decoder(); 
     byte[] decoded = b64.decodeBuffer(privKeyPEM); 

     PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(decoded); 
     KeyFactory kf = KeyFactory.getInstance(algorithm); 
     return kf.generatePrivate(spec); 
     } 

: 나는 getPemPrivatekey의 작업 복사본 내가 메인 함수에서 호출 방법 복사 한 ....

gcsr = 새를 ..... // 여기서 클래스를 인스턴스화하십시오.

privateKey= gcsr.getPemPrivateKey("c:\\testdir\\java_private.pem", "RSA"); 
    BASE64Encoder encoder1= new BASE64Encoder(); 
    String s1=encoder1.encodeBuffer(gcsr.getPrivateKey().getEncoded()); 
    System.out.println("Private Key in Base64:"+s1+"\n"); 

현재 작동 중입니다 (내 컴퓨터의 Java 8!). "gcsr"은 함수가 포함 된 클래스에서 인스턴스화 한 객체의 이름입니다. 감사합니다.

관련 문제