0

AES を使用して文字列を暗号化しました。そのために AES のキーを指定しました。今、私はその特定のキーを RSA で暗号化しようとしています (ここまではすべてうまくいきました)。今度は、この暗号化されたキーを RSA でもう一度暗号化する必要があります。「データは 117 バイトを超えてはなりません」というエラーが表示されます。

public String encrypt(String DATA,String key_string) throws Exception {
    String separator = "//msit//";
    byte[] data = key_string.getBytes();
    MessageDigest sha = MessageDigest.getInstance("SHA-1");
    data = sha.digest(data);
    data = Arrays.copyOf(data, 16); // use only first 128 bit
    SecretKey key = new SecretKeySpec(data, "AES");
    String final_matter = DATA + separator;
    System.out.println(final_matter);
    ecipher = Cipher.getInstance("AES");
    ecipher.init(Cipher.ENCRYPT_MODE, key);
    byte[] utf8 = final_matter.getBytes("UTF8");
    byte[] enc = ecipher.doFinal(utf8);
    return new sun.misc.BASE64Encoder().encode(enc);
    }

公開鍵インフラ構造

4

1 に答える 1

1

RSAキーが暗号化できるデータの最大量は、そのモジュラス長に等しくなります。したがって、1024ビットのRSAキーは128バイトしか暗号化できません。おそらくPKCS#1パディングを使用しています。これにより、可能なサイズがさらに117バイトに削減されます。

AESキーは最大値よりはるかに小さい必要があります。可能な最大のAESキーサイズは256ビット、つまり32バイトです。

コードを調べて、キーデータのみを暗号化しようとしていることを確認してください。


上記のコメントに基づくと、暗号化するデータが多すぎるようです。次のことを試してください。

  • 送信者の秘密鍵を使用してAES鍵に署名しますが、結果は別にしてください。

  • 受信者の公開鍵を使用してAES鍵を暗号化します。

  • 両方の部分を受信者に送信します。

秘密鍵を使用して署名した結果、鍵のモジュラスと同じサイズのデータ​​が作成されます。したがって、同じ長さの公開鍵でそれを暗号化することはできません。あなたのスキームは壊れており、私が上で提案したように機能するように変更する必要があります。

自家製のものの代わりに使用する既存のPKIシステムを探すことを強くお勧めします。多分EJBCA

于 2012-11-22T11:15:30.623 に答える