2015-12-24 10 views
5

私はSH1 RSAでメッセージをエンコードしようとしていますが、RSAについてのいくつかの基本情報を除いて、セキュリティの対象に関する経験はありません。私は秘密鍵をStringとして与えられています。私は仕事をするために次のコードブロックを書くことができましたが、私が仕事をしっかりと正確にやっているかどうかはわかりません。Java:文字列からPrivateKeyを生成するにはどうすればよいですか?

私はエキスパートではありませんが、私の秘密鍵をコードに文字列として入れるのは安全ではありません。誰も私を導くことができますか?

String privateKeyString = "mykeyhere..."; 
byte[] privateKeyBytes = privateKeyString.getBytes(); 
String encodedPrivateKey = Base64.encodeToString(privateKeyBytes, Base64.URL_SAFE); 

KeyFactory factory = KeyFactory.getInstance(RSA); 
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encodedPrivateKey.getBytes()); 
RSAPrivateKey privateKey = (RSAPrivateKey) factory.generatePrivate(keySpec); 

Signature instance = Signature.getInstance(ALGORITHM); 
instance.initSign(privateKey); 
instance.update(content.getBytes()); 
return new String(instance.sign()); 

として私のプライベートキーの形式は次のとおりです。あなたのキーの形式は暗号化されていないbase64エンコードPKCS8でエンコードされた秘密鍵である

"-----BEGIN PRIVATE KEY-----\n"+ 
"MIIE...\n"+ 
"cH0iRj...\n"+ 
"O0Hhj...\n"+ 
. 
. 
. 
"fG6...\n"+ 
"B6/hF...\n"+ 
"3Mq38...\n"+ 
"-----END PRIVATE KEY-----\n" 
+0

privateKeyStringとは何ですか?パスワード?実数値のRSA秘密鍵を使用していますか?どんな形式で与えられていますか? Base64? 16進数?その他? –

+0

@ ConstantinosChalkias、私は私のキーフォーマットを追加しました。 –

+0

キーストアを試しましたか? http://stackoverflow.com/questions/9890313/how-to-use-keystore-in-java-to-store-private-key#answer-27869798 –

答えて

8

。次に、秘密鍵にデコードする方法の例を示します。 (この例では、秘密鍵のセキュリティについて心配する必要はありませんが、この例では単なる例です)。

import java.io.*; 
import java.security.KeyFactory; 
import java.security.PrivateKey; 
import java.security.spec.PKCS8EncodedKeySpec; 
import android.util.Base64; 

public class ReadPKCS8Pem { 

    private final static String PRIVATE_KEY = 
      "-----BEGIN PRIVATE KEY-----\n" 
      + "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAM7t8Ub1DP+B91NJ\n" 
      + "nC45zqIvd1QXkQ5Ac1EJl8mUglWFzUyFbhjSuF4mEjrcecwERfRummASbLoyeMXl\n" 
      + "eiPg7jvSaz2szpuV+afoUo9c1T+ORNUzq31NvM7IW6+4KhtttwbMq4wbbPpBfVXA\n" 
      + "IAhvnLnCp/VyY/npkkjAid4c7RoVAgMBAAECgYBcCuy6kj+g20+G5YQp756g95oN\n" 
      + "dpoYC8T/c9PnXz6GCgkik2tAcWJ+xlJviihG/lObgSL7vtZMEC02YXdtxBxTBNmd\n" 
      + "upkruOkL0ElIu4S8CUwD6It8oNnHFGcIhwXUbdpSCr1cx62A0jDcMVgneQ8vv6vB\n" 
      + "/YKlj2dD2SBq3aaCYQJBAOvc5NDyfrdMYYTY+jJBaj82JLtQ/6K1vFIwdxM0siRF\n" 
      + "UYqSRA7G8A4ga+GobTewgeN6URFwWKvWY8EGb3HTwFkCQQDgmKtjjJlX3BotgnGD\n" 
      + "gdxVgvfYG39BL2GnotSwUbjjce/yZBtrbcClfqrrOWWw7lPcX1d0v8o3hJfLF5dT\n" 
      + "6NAdAkA8qAQYUCSSUwxJM9u0DOqb8vqjSYNUftQ9dsVIpSai+UitEEx8WGDn4SKd\n" 
      + "V8kupy/gJlau22uSVYI148fJSCGRAkBz+GEHFiJX657YwPI8JWHQBcBUJl6fGggi\n" 
      + "t0F7ibceOkbbsjU2U4WV7sHyk8Cei3Fh6RkPf7i60gxPIe9RtHVBAkAnPQD+BmND\n" 
      + "By8q5f0Kwtxgo2+YkxGDP5bxDV6P1vd2C7U5/XxaN53Kc0G8zu9UlcwhZcQ5BljH\n" 
      + "N24cUWZOo+60\n" 
      + "-----END PRIVATE KEY-----"; 

    public static void main(String[] args) throws Exception { 
     // Read in the key into a String 
     StringBuilder pkcs8Lines = new StringBuilder(); 
     BufferedReader rdr = new BufferedReader(new StringReader(PRIVATE_KEY)); 
     String line; 
     while ((line = rdr.readLine()) != null) { 
      pkcs8Lines.append(line); 
     } 

     // Remove the "BEGIN" and "END" lines, as well as any whitespace 

     String pkcs8Pem = pkcs8Lines.toString(); 
     pkcs8Pem = pkcs8Pem.replace("-----BEGIN PRIVATE KEY-----", ""); 
     pkcs8Pem = pkcs8Pem.replace("-----END PRIVATE KEY-----", ""); 
     pkcs8Pem = pkcs8Pem.replaceAll("\\s+",""); 

     // Base64 decode the result 

     byte [] pkcs8EncodedBytes = Base64.decode(pkcs8Pem, Base64.DEFAULT); 

     // extract the private key 

     PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(pkcs8EncodedBytes); 
     KeyFactory kf = KeyFactory.getInstance("RSA"); 
     PrivateKey privKey = kf.generatePrivate(keySpec); 
     System.out.println(privKey); 
    } 

} 
+0

これを印刷すると:Log.i( ""、 "Reversed PEM: "+ Base64.encodeToString(privkey.getEncoded()、Base64.Default)); オリジナルのPEM文字列を出力してはいけません。私の場合、それは同じではない.. – Farhan

+1

@ファーナン:いいえ、必ずしもそうではありません。実装は、例えば、符号化された形式のpおよびqの位置を入れ替えることができ、異なる(しかし同等の)出力が得られる。返信用の –

+0

thanxあなたはそれがSSLの握手に何の影響も持たないことを意味しますか? – Farhan

関連する問題