1

Java を使用して、DES 暗号化を使用してメッセージを暗号化するおもちゃのプログラムを作成しています。暗号化したいメッセージは次のとおりです。

String msg="This is a secret message";

次のようにバイトに変換します。

byte [] msgBytes=msg.getBytes();

そして、次のように機能する暗号化機能に送信します。

//encryption function
public static String encryptMsg(byte [] msgBytes, SecretKey myDesKey) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException
{
    Cipher desCipher;
    // Create the cipher 
    desCipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
    desCipher.init(Cipher.ENCRYPT_MODE, myDesKey);
    byte[] textEncrypted = desCipher.doFinal(msgBytes);

// converts to base64 for easier display.
byte[] base64Cipher = Base64.encode(textEncrypted);
return new String(base64Cipher);
} //end encryptMsg

次に、暗号、暗号、および平文の長さを表示すると、次のようになります。

Encrypted Message: FDCU+kgWz25urbQB5HbFtqm0HqWHGlGBHlwwEatFTiI=
Original msg length: 24
Encrypted msg length: 44

元のメッセージの長さが 24 であるのに、暗号の長さが 44 である理由を教えてください。

編集: 親切に、明確な回答が必要です。暗号は常に = で終わります。これはパディングのせいでしょうか?この長さで暗号化が行われる理由/方法を説明できますか? そして常に =? で終わります。私のコードは正しいですか、それとも間違いがありますか? エンコード部分に疑問があります。

4

2 に答える 2

2

DES 暗号化の結果は、常に 8 バイトの倍数になります。入力は、指定されたパディング アルゴリズムに従って、8 バイトの倍数にパディングされます。

Base 64 エンコーディングは、各 3 バイトを 4 文字 (3x8 = 4x6 = 24) にエンコードし、= 文字でパディングすることにより、出力の長さが 4 の倍数になるようにします。

したがって、44 文字の出力は 33 バイトに相当しますが、最後の = は、実際には 32 バイトしかなかったことを示しています。PKCS5 パディングを使用した 24 バイトのクリア データは 32 バイトになるため、これは問題ありません。

于 2013-10-19T17:25:00.417 に答える