2

アプリケーションにSSL証明書とキーを実装しています。CertAndKeyGenクラスを使用して秘密鍵を作成しました。秘密鍵をパスワードで暗号化しようとしています。これは、PBEとCipherクラスを介して実現しました。暗号化された秘密鍵をPEM形式のファイルに書き込みたいのですが。動作しているFileOutputStreamを試してみましたが、PrintWriterが例外として動作していません。

以下は私のコードです、

    final CertAndKeyGen keypair = new CertAndKeyGen("RSA", "SHA1WithRSA", null);
    keypair.generate(1024);
    final PrivateKey privKey = keypair.getPrivateKey();
    byte[] encodedprivkey = privKey.getEncoded();
    String MYPBEALG = "PBEWithSHA1AndDESede";
    String password = "test123";
    int count = 20;// hash iteration count
    Random random = new Random();
    byte[] salt = new byte[8];
    random.nextBytes(salt);
    PBEParameterSpec pbeParamSpec = new PBEParameterSpec(salt, count);
    PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray());
    SecretKeyFactory keyFac = SecretKeyFactory.getInstance(MYPBEALG);
    SecretKey pbeKey = keyFac.generateSecret(pbeKeySpec);
    Cipher pbeCipher = Cipher.getInstance(MYPBEALG);
    // Initialize PBE Cipher with key and parameters
    pbeCipher.init(Cipher.ENCRYPT_MODE, pbeKey, pbeParamSpec);
    // Encrypt the encoded Private Key with the PBE key
    byte[] ciphertext = pbeCipher.doFinal(encodedprivkey);
    // Now construct  PKCS #8 EncryptedPrivateKeyInfo object
    AlgorithmParameters algparms = AlgorithmParameters.getInstance(MYPBEALG);
    algparms.init(pbeParamSpec);
    EncryptedPrivateKeyInfo encinfo = new EncryptedPrivateKeyInfo(algparms,ciphertext);
    byte[] encryptedPkcs8 = encinfo.getEncoded();

    // Now I am writing the encrypted private key into a file.
    // Using FileOutputStream 

    FileOutputStream out = new FileOutputStream("usingOutEncrypedPrivkey");
    out.write(Base64.encodeBase64(encryptedPkcs8, true));
    out.flush();
    out.close();

    // Using PrintWriter 
    PrintWriter pw = new PrintWriter("usingPwEncryptedPrivKey");
    pw.println("-----BEGIN "+ privKey.getAlgorithm() + " PRIVATE KEY-----");
    pw.println(Base64.encodeBase64(encryptedPkcs8));
    pw.println("-----END "+ privKey.getAlgorithm() +" PRIVATE KEY-----");
    pw.close();

保存されたファイルは次のとおりです。

    usingOutEncrypedPrivkey  // Which was saved using FileOutputStream

    MIICoTAbBgoqhkiG9w0BDAEDMA0ECL4xgraq2hXxAgEUBIICgFENaB8EA/kR0ymSC8vcyj1fNFbP
    iR+mXkBk7aH3eF7fpP8yqCvtN0/0VqHi/w/Z2CLgiib2s/zuiVPtWI8vsRRPXmD9PYxZp3ilLpD4
                            .....
                            .....   
    9nH8HdQf584c3sKYEErDQvJR2SmbUPtNq4cB6ocUuiOTztBqRXAHeaWavnqHFxHUT7c=


    usingPwEncryptedPrivKey  // Which was saved using PrintWriter
   -----BEGIN RSA PRIVATE KEY-----
   [B@19e3118a
   -----END RSA PRIVATE KEY-----

PrintWriterがFileOutputStreamのようなバイトではなく、「[B@19e3118a」」と書き込むのはなぜですか。PrintWriter.println()関数を利用したいので、PrintWriterを使用したいと思います。私を助けてください。前もって感謝します。

4

3 に答える 3

7
  • OutputStream.write(byte[])バイトをバイナリ データとして書き込みます。
  • PrintWriter.print(byte[])配列を呼び出しtoString()、結果を書き出します。は配列[B@19e3118aの表現です。toString()

文字列に ASCII 文字のみが含まれている場合String(byte[])、配列で を使用して、結果を出力できます。

または、Apache CommonsBase64クラスを使用している場合は、 [Thanks @SimonC]encodeBase64String()の代わりに単にメソッドを使用する必要があります。encodeBase64()

于 2013-01-22T07:54:09.367 に答える
2

[B@19e3118atoString()バイト配列を呼び出した結果です。どの Base64 クラスを使用しているかはわかりませんが、ライターを使用する場合は、バイト配列を他のバイト配列にエンコードするのではなく、バイト配列を文字列にエンコードするクラスを見つける必要があります。

于 2013-01-22T07:55:11.560 に答える
2

ふたつのやり方

  1. OutputStream.write() を使用してから、自分で行を分割します。
  2. PrintWrite.println() を使用すると、生のバイトを文字列にエンコードし、自分で行を分割する必要があります...
于 2013-01-22T07:58:21.870 に答える