2011-08-05 27 views
1

私はJava標準ライブラリを使いたいと思います。私が知っている限り、その関数の入力は限られています。そこで私はこの目的のために2つの方法を実装しました。ここで彼らは、次のとおりです。RSA暗号化とJavaでの長いメッセージの復号化

private byte[] RSAenc(String in) throws Exception { 
    Cipher c = Cipher.getInstance("RSA"); 
    c.init(Cipher.ENCRYPT_MODE, privKey); 
    int l = in.length(); 

    byte[] part; 
    byte[] result = new byte[(int)(64*java.lang.Math.ceil(l/20.0))]; 
    int i = 0; 
    while(i*20+20<l) { 
     part = c.doFinal(in.substring(i*20,i*20+19).getBytes("UTF-8")); 
     System.arraycopy(part, 0, result, i*64, part.length); 
     i = i+1; 
    } 
    part = c.doFinal(in.substring(i*20,l-1).getBytes("UTF-8")); 
    System.arraycopy(part, 0, result, i*64, part.length); 
    return result; 

} 

private String RSAdec(byte [] in) throws Exception { 
    Cipher c = Cipher.getInstance("RSA"); 
    c.init(Cipher.DECRYPT_MODE, privKey); 

    String result = ""; 
    byte[] part = new byte[64]; 
    int l = in.length; 
    int i = 0; 
    while(i+64<=l) { 
     System.arraycopy(in, i, part, 0, part.length); 
     result = result + new String(c.doFinal(part), "UTF-8"); 
     i= i+64; 
    } 
    return result; 
} 

彼らはこのように働く:20のサイズのサブストリング、暗号化のために私は高々に文字列を分割し、それらを暗号化するために暗号を使用します。解読のために、私はバイト配列を64バイトブロックに分割し、暗号解読をそれらに適用する。 これを行う関数は既にありますか?あるいは、少なくとももっと清潔な解決策がありますか?私のアプローチはどれくらい安全ですか?暗号化結果の長さ(result.length)は、JREのすべてのディストリビューションで常に64ですか?

ありがとう、

+0

参照[RSAなどの非対称暗号化を使用して任意の長さの平文を暗号化するにはどうすればよいですか?](http://crypto.stackexchange.com/questions/14/how-can-i-use-asymmetric crypto.stackexchange.comで-s暗号化 - と同様にrsaから任意の長さの暗号化)。 –

答えて

5

RSA鍵暗号化ではなく、バルクデータの暗号化に適しています。

RSAでメッセージを暗号化する代わりに、ほとんどのプロトコルはAESのような対称暗号の鍵を生成し、それを使ってメッセージを暗号化します。次に、RSAを使用してその対称鍵を暗号化し、メッセージ受信者のみが回復できるようにします。 RSAで暗号化された対称鍵は、AESで暗号化されたメッセージとともに受信者に送信されます。

+0

ありがとうございます...対称鍵(AESまたはDESの場合)は常に64(RSA暗号化装置の最大)バイトより小さいですか? –

+0

@kvphxga:良いRSAキーは少なくとも2048ビットでなければならないので、64バイト以上の暗号化が可能でなければなりません。しかし、はい、これらの暗号はすべて64バイト以下の鍵を使用します。 – erickson

+0

@kvphxga:DESには56ビットのキーがあります。これは非常に小さく、今日は使用すべきではありません(ブルートフォースにはあまり時間がかかりません)。 AESには、キーサイズ128ビット(16バイト)、192ビット(24バイト)、または256ビット(32バイト)の3種類があり、安全であると考えられています。 –

関連する問題