2

BouncyCastle の SMIME パッケージを使用して、ECDSA X509 証明書を使用して暗号化されたメッセージを作成しようとしています。BouncyCastle のリリース ノートによると、これは 1.32 以降 (私は 1.46 を使用しています) からサポートされていますが、ECDSA OID の暗号が見つからないという例外が引き続き発生します。

org.bouncycastle.cms.CMSException: 例外ラッピング コンテンツ キー: 暗号を作成できません: 1.2.840.10045.2.1 をサポートするプロバイダーが見つかりません

これは、私が使用しているテスト証明書の 1 つからの抜粋です。

  Version: V3
  Subject: EMAILADDRESS=bob@example.com
  Signature Algorithm: SHA256withECDSA, OID = 1.2.840.10045.4.3.2

  Key:  EC Public Key

暗号化されたメッセージを作成するために使用しているコードは次のようになります。

// allow the use of the BC JCE
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

SMIMEEnvelopedGenerator gen = new SMIMEEnvelopedGenerator();
JceKeyTransRecipientInfoGenerator rig = new JceKeyTransRecipientInfoGenerator(cert);
gen.addRecipientInfoGenerator(rig);

MimeBodyPart msg = new MimeBodyPart();
msg.setText(message);

MimeBodyPart mp = gen.generate(
    msg,
    new JceCMSContentEncryptorBuilder(
        CMSAlgorithm.AES128_CBC).setProvider("BC").build());

Properties props = System.getProperties();
Session session = Session.getDefaultInstance(props, null);

// TODO: This is incorrect.  Perhaps AKA is better?
String to = cert.getSubjectDN().getName();

Address fromUser = new InternetAddress(from);
Address toUser = new InternetAddress(to);

MimeMessage body = new MimeMessage(session);
body.setFrom(fromUser);
body.setRecipient(Message.RecipientType.TO, toUser);
body.setSubject("example encrypted message");
body.setContent(mp.getContent(), mp.getContentType());
body.saveChanges();

body.writeTo(new FileOutputStream(filename));

私は明らかに間違ったことをしていると確信していますが、今は見ていません。何か案は?

4

2 に答える 2

2

Thomas Pornin が示唆したように (上記)、これを機能させるには ECDH を使用する必要がありました。したがって、JceKeyTransRecipientInfoGenerator を使用する代わりに、JceKeyAgreeRecipientInfoGenerator を使用する必要がありました。

SMIMEEnvelopedGenerator gen = new SMIMEEnvelopedGenerator();
JceKeyAgreeRecipientInfoGenerator rig = new JceKeyAgreeRecipientInfoGenerator(CMSAlgorithm.ECDH_SHA1KDF, senderPrivateKey, senderPublicKey, CMSAlgorithm.AES128_WRAP);
rig.setProvider(BouncyCastleProvider.PROVIDER_NAME);
rig.addRecipient(recipientX509Certificate);
gen.addRecipientInfoGenerator(rig);

MimeBodyPart msg = new MimeBodyPart();
msg.setText("This is a secret message");

MimeBodyPart mp = gen.generate(msg, new JceCMSContentEncryptorBuilder(CMSAlgorithm.AES128_CBC).setProvider("BC").build());

Properties props = System.getProperties();
Session session = Session.getDefaultInstance(props, null);

String to = "bob@example.com";

Address fromUser = new InternetAddress("alice@example.com");
Address toUser = new InternetAddress(to);

MimeMessage body = new MimeMessage(session);
body.setFrom(fromUser);
body.setRecipient(Message.RecipientType.TO, toUser);
body.setSubject("example encrypted message");
body.setContent(mp.getContent(), mp.getContentType());
body.saveChanges();

body.writeTo(new FileOutputStream("/tmp/encrypted.msg"));
于 2011-08-19T06:29:21.540 に答える
1

ECDSA は署名アルゴリズムであり、暗号化または鍵交換アルゴリズムではありません。メッセージを暗号化するには、受信者の RSA または Diffie-Hellman キー (おそらく ECDH) が必要です。

于 2011-08-17T11:37:01.277 に答える