2016-08-23 19 views
0

私はPublicKey.pubファイルの内容を変換してから決定するためにStringに戻すPublicKeyを変換しようとしています変換が機能していて、プロセスのキーを変更しない場合java.security.spec.InvalidKeySpecException:にjava.io.IOException:予期しない終了の内容マーカー

id_rsa.pub

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC0zszKhcZTC8xJidUszmRn4Tr/FxPs04wpCzEstebfTW7Bvqgtt+OdvxoNyYM0LAEnxEF4XhAWcsX7VJJqstZLpDqlKDXFr2d0aVIjksCpZt+ftVRwYHRoERhEOP/UmPFb5rKIkhQbED2kTWg11mW9soc6BhwB3THn/Cyo3t1u2vWjEySgPhKeA3Xzh+5eqV7CUD8V6S7OAT7T9ijf7sRV0R8rwHgTLWJ8+dETnY3L3N0fEaNuaayeNblHqrL53/1+tsBBUF3bAS+1GE6oniSeM/yhtfzf2x+O5MDlVVMbOCC/v+FnfIIEKLA+v1xDSAha7C5cHh82TxToWXsbjqGD [email protected] 

Converter.java

public static final synchronized PublicKey base64ToPublicKey(final String algorithm, final String base64) throws GeneralSecurityException, IOException { 
     BASE64Decoder decoder = new BASE64Decoder(); 
     byte[] sigBytes2 = decoder.decodeBuffer(base64); 
     X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(sigBytes2); 
     KeyFactory keyFact = KeyFactory.getInstance(algorithm, "BC"); 
     return keyFact.generatePublic(x509KeySpec); 
    } 

    public static final synchronized String publicKeyToBase64(final PublicKey publicKey) throws GeneralSecurityException, IOException { 
     byte[] publicKeyBytes = publicKey.getEncoded(); 
     BASE64Encoder encoder = new BASE64Encoder(); 
     return encoder.encode(publicKeyBytes); 
    } 

私は実行すると:

PublicKey test1 = base64ToPublicKey("RSA", "AAAAB3NzaC1yc2EAAAADAQABAAABAQC0zszKhcZTC8xJidUszmRn4Tr/FxPs04wpCzEstebfTW7Bvqgtt+OdvxoNyYM0LAEnxEF4XhAWcsX7VJJqstZLpDqlKDXFr2d0aVIjksCpZt+ftVRwYHRoERhEOP/UmPFb5rKIkhQbED2kTWg11mW9soc6BhwB3THn/Cyo3t1u2vWjEySgPhKeA3Xzh+5eqV7CUD8V6S7OAT7T9ijf7sRV0R8rwHgTLWJ8+dETnY3L3N0fEaNuaayeNblHqrL53/1+tsBBUF3bAS+1GE6oniSeM/yhtfzf2x+O5MDlVVMbOCC/v+FnfIIEKLA+v1xDSAha7C5cHh82TxToWXsbjqGD"); 

私は戻って取得:

個の
java.security.spec.InvalidKeySpecException: java.io.IOException: unexpected end-of-contents marker 
    at org.bouncycastle.jce.provider.JDKKeyFactory.engineGeneratePublic(Unknown Source) 
    at org.bouncycastle.jce.provider.JDKKeyFactory$RSA.engineGeneratePublic(Unknown Source) 
    at java.security.KeyFactory.generatePublic(KeyFactory.java:328) 
    at base64ToPublicKey(Converter.java:216) 
    at main(Converter.java:283) 

答えて

0

OpenSSHの公開鍵ファイル(順番にSSH2ワイヤフォーマットに基づいているrfc4716参照SSH固有の形式のOpenSSHの特異的変異体を使用するためのSSH2(id_*.pubknown_hostsのエントリとauthorized_keysrfc4253 6.6)は、ではなく、 'X.509'形式のJava暗号ではを使用しています。 (SSH1用のOpenSSHファイル形式は異なっていましたが、SSH1は壊れており、使用しないでください)

Javaでこれを変換するには、convert openSSH rsa key to javax.crypto.Cipher compatible formatを参照してください。

問題を回避する方が簡単です。

バイパス1:あなたが合理的に最近のOpenSSHを使用している場合(6.0は、大丈夫以前について確認されていません)、 'X.509' に変換すること

ssh-keygen -e -m PKCS8 -f id_rsa.pub >pub.pem # change filename as needed 

を使用します(本当にSubjectPublicKeyInfoで別名SPKI)PEMで形。 (そう、彼らはSPKIを意味するためにPKCS8という名前を使用します;それは狂っています。)そして、BEGINとEND行を破棄して、base64からbyte[]までの間のすべての行を区切ってデコードし、X509EncodedKeySpecあなたは今あります。それとも、OpenSSLを持っている場合は、DER形式

openssl rsa -in pub.pem -out pub.der -outform der # any version 
openssl pkey -pubin -in pub.pem -out pub.der -outform der # 1.0.0 up 

に変換し、その後X509EncodedKeySpecに全く変化のないDERファイルを読み込むことができます。

バイパス2:あなたが秘密鍵を持って、そしてそれが(6.5 IINM以来のオプション)のOpenSSHの「新しい」形式ではありません、とあなたはOpenSSLを持っている場合は、SPKIで公開鍵を取得する(Javaのフレンドリー)

openssl rsa -in id_rsa =pubout -out pub.pem # default PEM 
openssl rsa -in id_rsa -pubout -out pub.der -outform der # DER 
openssl pkey -in id_rsa =pubout -out pub.pem # default PEM, 1.0.0 up 
openssl pkey -in id_rsa -pubput -out pub.der -outform der # DER, 1.0.0 
のいずれかの形式
関連する問題