0

これを java 経由で実装します。BouncyCastle Provider はブロック モード = ECB およびパディング モード = PKCS7Padding を使用します。

長さが 32 バイトのデータ (abababababababab の 16 進値である 61626162616261626162616261626162 など) を暗号化すると、長さが 64 バイトの暗号テキスト (f21ee0564ebd5274e10bf4590594b1e16a19592b917b19ee106f1) が得られることに注意してください。私が読んだところによると、長さが32バイト未満のデータを暗号化すると、アルゴリズムはそれを32バイト長にパディングし、32バイト長の暗号テキストを生成しますが、正確に32バイト長のデータを入力すると、32を受け取るべきではありませんバイト長の暗号テキスト、また、32 バイトを超える長さのデータを入力すると、64 バイトの暗号テキストに正しくパディングされます

これは私のコードがどのように見えるかです:

    public static byte[] encrypt(byte[] plainText, byte[] keyBytes)
        throws GeneralSecurityException {

    SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");

    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
    cipher.init(Cipher.ENCRYPT_MODE, key);

    byte[] cipherText = cipher.doFinal(plainText);

    return cipherText;
}

お返事ありがとうございます

4

2 に答える 2

3

16 進文字とバイトを混同しています。2 つの 16 進数文字を使用して、1 バイトを表すことができます。したがって、入力はおそらく 16 バイトで、出力は 32 バイトになります。AES は 128 ビット = 16 バイトのブロック暗号です。

PKCS#7 パディングは、16 バイトのブロック暗号をパディングするために定義されています。プレーン テキストの最後のバイトがパディングと間違えられないようにするために、PKCS#7 パディングは常にパディングされます。これは、平文が 16 で割り切れる不幸な状況では、パディングのブロック全体を追加することを意味します。パディングは、各バイトの文字列の長さを示すバイト文字列で構成されるため、この場合、パディングは 16 進数で表される次のバイトで構成されます10101010101010101010101010101010

Java のデフォルト プロバイダーは、"PKCS5Padding"代わりに を使用することに注意してください"PKCS7Padding"。どちらも同じですが、公式には PKCS#5 パディングは 64 ビット = 8 バイトのブロック暗号専用です。Bouncy Castle はその文字列も受け入れるので"PKCS5Padding"、互換性のために指定することをお勧めします。

AES は 16 バイトのブロック暗号であるため、32 バイトを使用するパディングは指定されていません。32 バイトのブロック暗号である Rijndael-256 には意味がありますが、そのアルゴリズムは NIST によって標準化されていないため、避ける必要があります。

于 2012-11-06T14:55:27.757 に答える
1

PKCS7 パディングについては、http: //en.wikipedia.org/wiki/Padding_ (cryptography)#Byte_padding で説明されています。

1とバイトの間に追加されblockLength、そのすべてがパディングのサイズに等しくなります。これは、メッセージが 16 の 16 でパディングされ、その後 AES でエンコードされる 32 バイトのメッセージを作成することを意味します。

メッセージは 32 バイトではなく 16 バイトであることに注意してください。

一般に、長さがゼロのパディングは、ゼロ以外のパディングと区別できないため、決して使用されません (また、パディングは可逆的な方法で行う必要があります)。

于 2012-11-06T10:27:52.140 に答える