10

一部のコンテンツをRSA秘密鍵で暗号化しようとしています。

私はこの例に従っています: http

://www.junkheap.net/content/public_key_encryption_javaです が、公開ではなく秘密鍵を使用するように変換しています。その例に従って、私がする必要があるのは次のとおりだと思います。

  • DER形式の秘密鍵を読み込む
  • PCKS8EncodedKeySpecを生成します
  • KeyFactoryからgeneratePrivate()を呼び出して、秘密鍵オブジェクトを取得します
  • その秘密鍵オブジェクトをCipherオブジェクトとともに使用して、暗号化を行います

したがって、手順は次のとおりです。

キーはopensslから次のように生成されました。

openssl genrsa -aes256 -out private.pem 2048

次に、次の方法でDER形式に変換されました。

openssl rsa -in private.pem -outform DER -out private.der

次のコマンドでPKCS8EncodedKeySpecを生成します。

byte[] encodedKey = new byte[(int)inputKeyFile.length()];

try {
    new FileInputStream(inputKeyFile).read(encodedKey);
} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(encodedKey);
return privateKeySpec;

次に、次のコマンドで秘密鍵オブジェクトを生成します。

PrivateKey pk = null;

try {
    KeyFactory kf = KeyFactory.getInstance(RSA_METHOD);
    pk = kf.generatePrivate(privateKeySpec);
} catch (NoSuchAlgorithmException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (InvalidKeySpecException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
return pk;

ただし、次の呼び出しで:

pk = kf.generatePrivate(privateKeySpec);

私は得る:

java.security.spec.InvalidKeySpecException: Unknown key spec.
at com.sun.net.ssl.internal.ssl.JS_KeyFactory.engineGeneratePrivate(DashoA12275)
at com.sun.net.ssl.internal.ssl.JSA_RSAKeyFactory.engineGeneratePrivate(DashoA12275)
at java.security.KeyFactory.generatePrivate(KeyFactory.java:237)

質問:

  • 一般的なアプローチは正しいですか?
  • PCKS8EncodedKeySpecは使用するのに適切なkeyspecですか?
  • 無効なキースペックエラーについて何か考えはありますか?
4

5 に答える 5

10

秘密鍵で暗号化することはできません。JCEで許可されている場合、それは偶然です。

署名を使用する必要があります。これを行うためのコードスニペットは次のとおりです。

signer = Signature.getInstance("SHA1withRSA");
signer.initSign(privateKey); // PKCS#8 is preferred
signer.update(dataToSign);
byte[] signature = signer.sign();
于 2009-09-08T08:40:58.533 に答える
8

まず第一に、なぜあなたが。Cipherで署名するのではなく、秘密鍵で暗号化するためにを使用することを計画しているのか混乱していSignatureます。すべてのRSAプロバイダーがセットアップに正しいブロックタイプを使用するかどうかはわかりませんCipherが、試してみる価値はあります。

それはさておき、非標準のOpenSSL形式のキーを読み込もうとしていると思います。を使用してDERに変換するrsaのは、基本的にはbase-64デコードです。キーの構造はPKCS#8ではありません。

代わりに、の後genrsaに、openssl pkcs8コマンドを使用して、生成されたキーを暗号化されていないPKCS#8、DER形式に変換します。

openssl pkcs8 -topk8 -nocrypt -in private.pem -outform der -out private.der

これにより、でロードできる暗号化されていない秘密鍵が生成されますPKCS8EncodedKeySpec

于 2009-09-08T03:18:42.890 に答える
4

秘密鍵による暗号化が許可されているのは偶然ではありません。署名を個別のハッシュと暗号化に分割する場合は、秘密鍵による暗号化が不可欠です。署名する必要のあるドキュメントがあり、キーがネットワークHSMにあるとします。これで、ドキュメント全体をHSMにストリーミングして署名するか、ローカルハッシュを作成してHSMにストリーミングして暗号化のみを行うことができます。私の選択は、ローカルハッシュ計算によってパフォーマンスが向上するかどうか、つまりネットワーク遅延を伴う委任ハッシュ計算が得られるかどうかによって異なります。

于 2010-04-22T09:15:03.190 に答える
3

この質問はかなり古いものですが、最近問題に遭遇しました(秘密鍵による暗号化を必要とするプロトコルの要件を実装しています)。フォーラムからの投稿を引用します:

私は最近同じ問題に遭遇し、PMR 22265,49Rを提出し、「開発」(誰でも)との協議の結果、秘密鍵は暗号化に使用できないと判断した後、IBMサポートに提出しました。暗号化の背後にある唯一の目的であるデータ保護に秘密鍵を使用すべきではなく、否認防止を実現するために暗号化に秘密鍵を使用することはまったく問題ないことを彼らとどれほど議論しようとしても、彼らは揺るぎないものでした彼らの信念で。あなたは2x2=5を主張する人々を愛さなければなりません。

この問題を回避する方法は次のとおりです。基本的に、秘密鍵の暗号素材を使用して公開鍵オブジェクトを作成しました。「公開鍵は復号化に使用できません」という例外を回避したい場合は、逆の操作を行い、公開鍵の暗号素材を使用して秘密鍵オブジェクトを作成し、公開鍵を使用して復号化する必要があります。

RSAPrivateCrtKey privateKey = (RSAPrivateCrtKey) ks.getKey(keyAlias, ksPassword.trim().toCharArray());
RSAPublicKeySpec spec = new RSAPublicKeySpec(
   privateKey.getModulus(),
   privateKey.getPrivateExponent()
);
Key fakePublicKey = KeyFactory.getInstance("RSA").generatePublic(spec);
encryptCipher.init(Cipher.ENCRYPT_MODE, fakePublicKey);
于 2014-02-08T14:58:24.300 に答える
0

これを試して:

java.security.Security.addProvider(
                     new org.bouncycastle.jce.provider.BouncyCastleProvider()
            );
于 2015-05-06T08:48:16.630 に答える