1

長さの制約を尊重する必要があるため、暗号化されたデータを元のテキストと同じ長さにしたいと考えています。を使用してBouncyCastleいます。

キーペアを生成するコードは次のとおりです。

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(512);
KeyPair keypair = keyGen.genKeyPair();
PublicKey pub = keypair.getPublic();
byte[] pubs = pub.getEncoded();

そして、暗号化するコードは次のとおりです。

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING");
PublicKey pk = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(pubs));
cipher.init(Cipher.ENCRYPT_MODE, pk);
byte[] cipherBytes = cipher.doFinal(plainArray);

エンコードされたデータは非常に大きいです。元のデータと同じくらい小さくするにはどうすればよいですか?

4

3 に答える 3

3

少なくともRSAに関しては何もありません。RSA では、安全を確保するために一定量のパディングが必要です。また、データはどの圧縮方法でもランダム データと見なされるため、圧縮することもできません。

もちろん、RSA を使用してデータを直接暗号化するべきではありません。代わりに、ランダムなセッション/データ キーを暗号化する必要があります。ただし、その場合でも、暗号化されたセッション キーがオーバーヘッドとして使用されます。

楕円曲線暗号を使用して、非対称暗号化データ/キーの一部のビットを削除できます (その出力はキー サイズの最小値の 2 倍ですが、同じレベルのセキュリティを実現するためにキー サイズははるかに小さくなっています)。ただし、EC 暗号化はおとなしい人向けではなく、非常に複雑です。

ちなみに、512 ビット RSA は安全ではないと考えられています。最小値として 1024 を使用するか、http://www.keylength.com/ にリストされている ECRYPT II または NIST の推奨事項に従ってください

于 2012-06-08T20:23:10.607 に答える
1

キーを秘密にできる場合は、AES のような対称暗号システムを使用できます。CFB モードで使用する場合、任意のビット長に適応できます。つまり、#bits の入力と出力は同じです。

主要な公開鍵暗号システムである RSA と ElGamal は、選択した 512 ビットでも数時間で解読できます。1024 ~ 4096 ビットが正常です。対戦相手が 1990 年代のハードウェアの使用に制限されていない限り、512 ビット未満は無意味です。:-)

于 2012-06-08T20:26:08.800 に答える