2011-02-06 13 views
2

アプリケーションでは、後でリサーチに使用できるように機密データ(任意に大きい可能性があります)を保存する必要があります。要点は、データが保護されていない状態にあることを望んでいないため、保存する前に暗号化したいと考えています。JavaとOpenSSLを使用した公開鍵暗号

(信頼性の高い環境で)別のコンピュータで、そのデータを後で復号化したいと思います。解読は容易に利用可能なツール、例えばOpenSSLで可能でなければなりません。今私の質問は:どのように私はすべてを行うのですか?

私はすでに抽象的手順を知っている:

  1. 一度、すべてのは、公開鍵/秘密鍵のペアを生成します。
  2. 公開鍵を使用してbyte[]をJavaで暗号化し、どこかに格納します。
  3. 暗号化されたデータを「安全な」コンピュータにコピーします。
  4. 単純なOpenSSLコマンドラインを使用して、保存したデータを解読します。

私は何をしないのよ今の詳細は以下のとおりです。

は、[更新は2011年2月13日]

少し研究した後、私はまさに私が何をしたいのかを説明ページを発見しました。基本的に私のステップ4に対する答えは、このコマンドラインされています。今、私の質問は

openssl smime -decrypt \ 
    -in data.smime -binary -inform DER \ 
    -inkey key.pem \ 
    -out data 

:どのように私はフォーマットのOpenSSLと互換性があるので、私は、このコマンドラインを使用して、それを解凍することができますJavaからファイルを生成することができますか?私は毎秒何回もこのhundretsをやりたいので、外部プロセスを呼び出すのは遅すぎるようです。だからこそ私はJavaで直接それをやりたいのです。

答えて

1

私は最終的に私が探していたものを正確に見つけました。私はちょうどS/MIMEASN.1DERのようなすべての用語で混乱していました。しかし最終的には、一見一致して、私は、私が欲しいものすべてを行う、バウンスキャスルからCMS(それが意味するものであれば)パッケージに達しました。だからここに私のコード:

package de.roland_illig.crypto; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.security.GeneralSecurityException; 
import java.security.Security; 
import java.security.cert.CertificateFactory; 
import java.security.cert.X509Certificate; 

import org.apache.commons.io.IOUtils; 
import org.bouncycastle.cms.CMSEnvelopedDataStreamGenerator; 
import org.bouncycastle.cms.CMSEnvelopedGenerator; 
import org.bouncycastle.cms.CMSException; 
import org.bouncycastle.jce.provider.BouncyCastleProvider; 

public class CryptDemo { 

    private static final File DIR = new File("c:/program files/cygwin/home/roland/crypto/"); 

    private static X509Certificate certificate() throws IOException, GeneralSecurityException { 
    InputStream is = new FileInputStream(new File(DIR, "key.pub.der")); 
    CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
    X509Certificate cert = (X509Certificate) cf.generateCertificate(is); 
    is.close(); 
    return cert; 
    } 

    private static void encrypt() throws IOException, GeneralSecurityException, CMSException { 
    CMSEnvelopedDataStreamGenerator gen = new CMSEnvelopedDataStreamGenerator(); 
    gen.addKeyTransRecipient(certificate()); 

    InputStream is = new FileInputStream(new File(DIR, "secret")); 
    OutputStream out = new FileOutputStream(new File(DIR, "secret.encrypted")); 
    OutputStream encryptingOut = gen.open(out, CMSEnvelopedGenerator.AES128_CBC, "BC"); 

    IOUtils.copy(is, encryptingOut); 

    is.close(); 
    encryptingOut.close(); 
    out.close(); 
    } 

    public static void main(String[] args) throws Exception { 
    Security.addProvider(new BouncyCastleProvider()); 

    encrypt(); 
    } 
} 
+0

私は真剣にあなたのソリューションにPKIを混在させようとしているのですが、なぜならあなたには明らかな理由はなく、あなたのようなポイント・ツー・ポイント・ソリューションでは余計な価値が生まれません。 – erloewe

+0

暗号化されたデータには、容易に復号化できない情報が含まれています。対称暗号化を使用すると、キーをサーバーのどこかに残しておかなければなりません。そのキーが公開されていれば、最初にデータを暗号化する必要はありませんので、非対称暗号化を使用したいと思っていました。私は簡単に利用できるツールでデータを解読できるようにしたいと考えており、OpenSSLは十分に普及しているようです。 –

+0

私はあなたの要点を理解しています。単純な公開鍵/秘密鍵のペアで十分です。だから私は簡単な方法で目標を達成する方法を教えていただけますか? –

0

SSLはネットワークトラフィックを暗号化することに注意してください。証明書を持つ公開鍵システムは、当事者間の信頼を検証するのに適しています。後で自分自身を使用することになるものを保護する必要がある場合は、前のコンセプトをソリューションにミックスしなくてもかまいません。それはあなたの人生を楽にします。

たとえば、ポインタとしてthis question and the accepted answer it hasをとります。おそらく、パスワードから鍵を生成するためにハッシュ関数を使用する必要があります。次に、AESを使用してデータを暗号化します。その後、安全な場所で同じパスワードを使用して実際の鍵を生成し、データを解読します。

+0

私はすでにすべての概念を理解すると思います。私は、暗号化されたデータスニペットのために私自身のファイルフォーマットを増やすのではなく、ほとんどのマシンにすでにインストールされているツールで簡単に理解できる暗号化されたフォーマットを持っていたいだけです。 –

+0

@Rolandそのような場合http://bsdsupport.org/2007/01/q-how-do-i-use-openssl-to-encrypt-files/のようになります:) – erloewe

+0

ありがとうございます。 'rsautl'は大きなファイルを暗号化できないというコメントを書きましたので、これは解決策ではありません。とにかく、私はこれまでに得たもので質問を更新しました。 –

関連する問題