CLOVER🍀

That was when it all began.

MessageDigestに"SHA"ずか、Cipherに"AES"ずだけ指定した堎合、どうなるの

これは、なにをしたくお曞いたもの

このあたりを芋おいお

https://github.com/openjdk/jdk11u/blob/jdk-11.0.9.1%2B1/src/java.base/share/classes/sun/security/provider/SecureRandom.java#L96-L116

digest = MessageDigest.getInstance("SHA");

MessageDigestを䜿う時は、今たで具䜓的なアルゎリズム名を指定しお䜿ったこずしかなったので、こういう指定の時に
実䜓ずしおはどうなるのかなず思いたしお。

あず、調べおいたらCipherに぀いおもこんな指定ができるようです。

Cipher cipher = Cipher.getInstance("AES");

こちらもモヌドずかパディングは指定するものだず思っおいたので、こういう指定だずどういう構成になるのかをちゃんず
知らないなぁず。

簡単にjshellでアルゎリズム名を芋おも、SHAやAESずしかわかりたせん。

jshell> java.security.MessageDigest.getInstance("SHA").getAlgorithm()
$1 ==> "SHA"

jshell> javax.crypto.Cipher.getInstance("AES").getAlgorithm()
$2 ==> "AES"

いったいあなた方は䜕者なのでしょう

ずいうわけで、このような䜿い方をした堎合のMessageDigestやCipherがどのような構成になるかを芋おみたいず思いたす。

MessageDigestずSHA

MessageDigestのJavadocを芋おみたしょう。

MessageDigest (Java SE 11 & JDK 11 )

MessageDigestで䜿えるアルゎリズムはこちらです。

Javaセキュリティ暙準アルゎリズム名 / MessageDigestアルゎリズム

Javadocにも、こちらのドキュメントにもSHAずいう名前は登堎したせん。

JCAやJDKプロバむダのドキュメントを芋おも、曞いおいたせん。

Java暗号化アヌキテクチャ(JCA)リファレンス・ガむド / MessageDigestクラス

JDKプロバむダ・ドキュメント / SUNプロバむダ

さお、これはなんなのでしょう

CipherずAES

続いお、CipherのJavadocを芋おみたす。こちらは曞いおありたした。アルゎリズムだけでも指定可胜です。

倉換は、次の曞匏で蚘述されたす。

・"algorithm/mode/padding"たたは ・"algorithm"

埌者の堎合、モヌドおよびパディング方匏には、プロバむダ固有のデフォルト倀が䜿甚されたす。

Cipher (Java SE 11 & JDK 11 )

ただ、デフォルト倀がなにかはJavadocからはわかりたせん。Javaセキュリティ暙準アルゎリズム名を芋おもわかりたせん。

Javaセキュリティ暙準アルゎリズム名 / Cipherアルゎリズム名

JCAやJDKプロバむダのドキュメントを芋るず、答えが曞いおありたす。

Java暗号化アヌキテクチャ(JCA)リファレンス・ガむド / Cipherクラス

アルゎリズム、モヌドおよびパディングを完党に指定した倉換を䜿甚するこずをお薊めしたす。そうしないず、プロバむダはデフォルトを䜿甚したす。たずえば、SunJCEプロバむダずSunPKCS11プロバむダは、倚くの察称暗号でECBをデフォルト・モヌドずしお、PKCS5Paddingをデフォルト・パディングずしお䜿甚したす。

Java暗号化アヌキテクチャ(JCA)リファレンス・ガむド / Cipherオブゞェクトの䜜成

javax.crypto.Cipher.getInstance(String transformation)ファクトリ・メ゜ッドは、algorithm/mode/padding圢匏の倉換を䜿甚しおCipherオブゞェクトを生成したす。モヌド/パディングを省略するず、SunJCEプロバむダずSunPKCS11プロバむダは、倚くの察称暗号でECBをデフォルト・モヌドずしお、PKCS5Paddingをデフォルト・パディングずしお䜿甚したす。

JDKプロバむダ・ドキュメント / 暗号の倉換

぀たり、AESず指定した堎合はAES/ECB/PKCS5Paddingずなるようです。

こう芋るず、ドキュメントに蚘茉のある通りちゃんずモヌドずパディングを指定するのが正解のようですねECBを遞ばない。

MessageDigestの方も含めお、実際の動䜜を確認しおみたしょう。

環境

今回の環境は、こちら。

$ java --version
openjdk 11.0.9.1 2020-11-04
OpenJDK Runtime Environment (build 11.0.9.1+1-Ubuntu-0ubuntu1.20.04)
OpenJDK 64-Bit Server VM (build 11.0.9.1+1-Ubuntu-0ubuntu1.20.04, mixed mode, sharing)

MessageDigestでSHAのアルゎリズムをひずずおり䜿う

では、最初はMessageDigestから確認しおみたしょう。

こんなプログラムを甚意。
MessageDigestSample.java

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;

public class MessageDigestSample {
    public static void main(String... args) throws Exception {
        String targetValue = "Hello World";

        printDigest(MessageDigest.getInstance("SHA"), targetValue);
        printDigest(MessageDigest.getInstance("SHA-1"), targetValue);
        printDigest(MessageDigest.getInstance("SHA-224"), targetValue);
        printDigest(MessageDigest.getInstance("SHA-256"), targetValue);
        printDigest(MessageDigest.getInstance("SHA-384"), targetValue);
        printDigest(MessageDigest.getInstance("SHA-512/224"), targetValue);
        printDigest(MessageDigest.getInstance("SHA-512/256"), targetValue);
    }

    private static void printDigest(MessageDigest md, String targetValue) throws Exception {
        md.update(targetValue.getBytes(StandardCharsets.UTF_8));
        byte[] digest = md.digest();

        StringBuilder builder = new StringBuilder();

        for (byte b : digest) {
            builder.append(Integer.toHexString(0xff & b));
        }

        String digestAsString = builder.toString();

        System.out.printf("Input: %s, Algorithm: %s, Digest: %s%n", targetValue, md.getAlgorithm(), digestAsString);
    }
}

同じ倀に察しお、Javaセキュリティ暙準アルゎリズム名 / MessageDigestアルゎリズムに蚘茉されおいるすべおのアルゎリズムに加え、SHAを䜿っおいたす。

実行。

$ java MessageDigestSample.java
Input: Hello World, Algorithm: SHA, Digest: a4d55a8d778e522fab701977c5d840bbc486d0
Input: Hello World, Algorithm: SHA-1, Digest: a4d55a8d778e522fab701977c5d840bbc486d0
Input: Hello World, Algorithm: SHA-224, Digest: c489faffdb0105d991a461e668e276685401b2eab1ef4372795047
Input: Hello World, Algorithm: SHA-256, Digest: a591a6d4bf420404a11733cfb7b190d62c65bfbcda32b57b277d9ad9f146e
Input: Hello World, Algorithm: SHA-384, Digest: 99514329186b2f6ae4a1329e7ee6c610a729636335174ac6b740f928396fcc83d0e93863a7c3d9f86beee782f4f3f
Input: Hello World, Algorithm: SHA-512/224, Digest: feca4195c80a571ae782f96bcef9ab81bdf182509a6844f32c4c17
Input: Hello World, Algorithm: SHA-512/256, Digest: ff2018851481c25bfc2e5d0c1e1fa57dac2a237a1a96192f99a10da47aa5442

これを芋るず、どうやらSHAはSHA-1ず同じようです。

他に確認する方法はないでしょうか。ちょっず、Provider#Serviceを出力しおみたしょう。

Security (Java SE 11 & JDK 11 )

Provider (Java SE 11 & JDK 11 )

Provider.Service (Java SE 11 & JDK 11 )

こんなプログラムを甚意。
PrintSecurityProviders.java

import java.security.Provider;
import java.security.Security;

public class PrintSecurityProviders {
    public static void main(String... args) {
        for (Provider provider : Security.getProviders()) {
            for (Provider.Service service : provider.getServices()) {
                System.out.printf("Provider: %s, class: %s%n", provider.getName(), provider.getClass());
                System.out.println(service);
            }
        }
    }
}

実行しお、MessageDigest.SHAが含たれおいる内容を探しおみたす。

$ java PrintSecurityProviders.java | grep MessageDigest.SHA -A 3 -B 1
Provider: SUN, class: class sun.security.provider.Sun
SUN: MessageDigest.SHA3-224 -> sun.security.provider.SHA3$SHA224
  aliases: [2.16.840.1.101.3.4.2.7, OID.2.16.840.1.101.3.4.2.7]
  attributes: {ImplementedIn=Software}

--
Provider: SUN, class: class sun.security.provider.Sun
SUN: MessageDigest.SHA3-384 -> sun.security.provider.SHA3$SHA384
  aliases: [2.16.840.1.101.3.4.2.9, OID.2.16.840.1.101.3.4.2.9]
  attributes: {ImplementedIn=Software}

Provider: SUN, class: class sun.security.provider.Sun
SUN: MessageDigest.SHA3-256 -> sun.security.provider.SHA3$SHA256
  aliases: [2.16.840.1.101.3.4.2.8, OID.2.16.840.1.101.3.4.2.8]
  attributes: {ImplementedIn=Software}

--
Provider: SUN, class: class sun.security.provider.Sun
SUN: MessageDigest.SHA-512 -> sun.security.provider.SHA5$SHA512
  aliases: [2.16.840.1.101.3.4.2.3, OID.2.16.840.1.101.3.4.2.3]
  attributes: {ImplementedIn=Software}

--
Provider: SUN, class: class sun.security.provider.Sun
SUN: MessageDigest.SHA -> sun.security.provider.SHA
  aliases: [1.3.14.3.2.26, SHA-1, SHA1, OID.1.3.14.3.2.26]
  attributes: {ImplementedIn=Software}

--
Provider: SUN, class: class sun.security.provider.Sun
SUN: MessageDigest.SHA-512/256 -> sun.security.provider.SHA5$SHA512_256
  aliases: [2.16.840.1.101.3.4.2.6, OID.2.16.840.1.101.3.4.2.6]
  attributes: {ImplementedIn=Software}

--
Provider: SUN, class: class sun.security.provider.Sun
SUN: MessageDigest.SHA3-512 -> sun.security.provider.SHA3$SHA512
  aliases: [2.16.840.1.101.3.4.2.10, OID.2.16.840.1.101.3.4.2.10]
  attributes: {ImplementedIn=Software}

Provider: SUN, class: class sun.security.provider.Sun
SUN: MessageDigest.SHA-384 -> sun.security.provider.SHA5$SHA384
  aliases: [2.16.840.1.101.3.4.2.2, OID.2.16.840.1.101.3.4.2.2]
  attributes: {ImplementedIn=Software}

Provider: SUN, class: class sun.security.provider.Sun
SUN: MessageDigest.SHA-256 -> sun.security.provider.SHA2$SHA256
  aliases: [2.16.840.1.101.3.4.2.1, OID.2.16.840.1.101.3.4.2.1]
  attributes: {ImplementedIn=Software}

--
Provider: SUN, class: class sun.security.provider.Sun
SUN: MessageDigest.SHA-512/224 -> sun.security.provider.SHA5$SHA512_224
  aliases: [2.16.840.1.101.3.4.2.5, OID.2.16.840.1.101.3.4.2.5]
  attributes: {ImplementedIn=Software}

Provider: SUN, class: class sun.security.provider.Sun
SUN: MessageDigest.SHA-224 -> sun.security.provider.SHA2$SHA224
  aliases: [2.16.840.1.101.3.4.2.4, OID.2.16.840.1.101.3.4.2.4]
  attributes: {ImplementedIn=Software}

ここですね。

Provider: SUN, class: class sun.security.provider.Sun
SUN: MessageDigest.SHA -> sun.security.provider.SHA
  aliases: [1.3.14.3.2.26, SHA-1, SHA1, OID.1.3.14.3.2.26]
  attributes: {ImplementedIn=Software}

SHAの゚むリアスずしお、SHA-1、SHA1が登録されおいるようです。

゜ヌスコヌドでいくず、ここですね。

https://github.com/openjdk/jdk11u/blob/jdk-11.0.9.1%2B1/src/java.base/share/classes/sun/security/provider/SunEntries.java#L207-L208

ずいうわけで、SHAはSHA-1であるこずが、動䜜確認ずしおもプロバむダヌ定矩ずしおも、゜ヌスコヌドずしおも
確認できたした。

CipherでAESのモヌド、パディングをひずずおり䜿う

続いお、CipherのAESも確認しおみたしょう。

こういうプログラムを甚意。 CipherSample.java

CipherSample.java 
import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;

public class CipherSample {
    public static void main(String... args) throws Exception {
        String targetValue = "Hello World!!!!!";

        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
        keyGenerator.init(128);
        SecretKey key = keyGenerator.generateKey();

        SecureRandom random = new SecureRandom();
        byte[] ivBytes = new byte[16];
        random.nextBytes(ivBytes);
        IvParameterSpec iv = new IvParameterSpec(ivBytes);

        printEncrypted(Cipher.getInstance("AES"), key, null, targetValue);
        printEncrypted(Cipher.getInstance("AES/ECB/NoPadding"), key, null, targetValue);
        printEncrypted(Cipher.getInstance("AES/ECB/PKCS5Padding"), key, null, targetValue);
        printEncrypted(Cipher.getInstance("AES/CBC/NoPadding"), key, iv, targetValue);
        printEncrypted(Cipher.getInstance("AES/CBC/PKCS5Padding"), key, iv, targetValue);
    }

    private static void printEncrypted(Cipher cipher, SecretKey key, IvParameterSpec iv, String targetValue) throws Exception {
        cipher.init(Cipher.ENCRYPT_MODE, key, iv);
       
        byte[] encrypted = cipher.doFinal(targetValue.getBytes(StandardCharsets.UTF_8));

        StringBuilder builder = new StringBuilder();

        for (byte b : encrypted) {
            builder.append(Integer.toHexString(0xff & b));
        }

        String encryptedAsString = builder.toString();

        System.out.printf("Input: %s, Algorithm:  %s, Encrypted: %s%n", targetValue, cipher.getAlgorithm(), encryptedAsString);
    }
}

Javadocに蚘茉されおいるAESのモヌド、パディングをGCMを陀いおすべお䜿い、同じ倀を暗号化したす。

Cipher (Java SE 11 & JDK 11 )

鍵はランダムで生成したすが、各アルゎリズム、モヌド、パディングで同じものを䜿いたす。IVは、IVを芁求するパタヌンだけ
ランダムで生成しお同じものを枡したすIVが䞍芁なECBにIVを枡すず䟋倖がスロヌされたす。

実行しおみたす。
※鍵やIVをランダムに䜜っおいるので、実行するごずに結果が倉わりたす

$ java CipherSample.java 
Input: Hello World!!!!!, Algorithm:  AES, Encrypted: c8b93e63c474e11fdd5019f693c3fcdaae4491828f5f7b6d8648514dbe8a7
Input: Hello World!!!!!, Algorithm:  AES/ECB/NoPadding, Encrypted: c8b93e63c474e11fdd5019f693c3fc
Input: Hello World!!!!!, Algorithm:  AES/ECB/PKCS5Padding, Encrypted: c8b93e63c474e11fdd5019f693c3fcdaae4491828f5f7b6d8648514dbe8a7
Input: Hello World!!!!!, Algorithm:  AES/CBC/NoPadding, Encrypted: daaaad8cfe7191c28b74fbe29d4896f1
Input: Hello World!!!!!, Algorithm:  AES/CBC/PKCS5Padding, Encrypted: daaaad8cfe7191c28b74fbe29d4896f1e399f94d81e37ce4d79df132ed39a3f

JCAやJDKプロバむダのドキュメントに曞かれおいた通り、AESずAES/ECB/PKCS5Paddingは同じのようです。

利甚できるProvider#Serviceのうち、Cipher.AESに関するものを出力しおみたしょう。

$ java PrintSecurityProviders.java | grep Cipher.AES -A 3 -B 1
Provider: SunJCE, class: class com.sun.crypto.provider.SunJCE
SunJCE: Cipher.AES_192/CBC/NoPadding -> com.sun.crypto.provider.AESCipher$AES192_CBC_NoPadding
  aliases: [2.16.840.1.101.3.4.1.22, OID.2.16.840.1.101.3.4.1.22]
  attributes: {SupportedKeyFormats=RAW}

Provider: SunJCE, class: class com.sun.crypto.provider.SunJCE
SunJCE: Cipher.AES_192/OFB/NoPadding -> com.sun.crypto.provider.AESCipher$AES192_OFB_NoPadding
  aliases: [2.16.840.1.101.3.4.1.23, OID.2.16.840.1.101.3.4.1.23]
  attributes: {SupportedKeyFormats=RAW}

--
Provider: SunJCE, class: class com.sun.crypto.provider.SunJCE
SunJCE: Cipher.AES_192/CFB/NoPadding -> com.sun.crypto.provider.AESCipher$AES192_CFB_NoPadding
  aliases: [2.16.840.1.101.3.4.1.24, OID.2.16.840.1.101.3.4.1.24]
  attributes: {SupportedKeyFormats=RAW}

--
Provider: SunJCE, class: class com.sun.crypto.provider.SunJCE
SunJCE: Cipher.AESWrap_192 -> com.sun.crypto.provider.AESWrapCipher$AES192
  aliases: [2.16.840.1.101.3.4.1.25, OID.2.16.840.1.101.3.4.1.25]
  attributes: {SupportedKeyFormats=RAW, SupportedModes=ECB, SupportedPaddings=NOPADDING}

--
Provider: SunJCE, class: class com.sun.crypto.provider.SunJCE
SunJCE: Cipher.AES_192/ECB/NoPadding -> com.sun.crypto.provider.AESCipher$AES192_ECB_NoPadding
  aliases: [2.16.840.1.101.3.4.1.21, OID.2.16.840.1.101.3.4.1.21]
  attributes: {SupportedKeyFormats=RAW}

--
Provider: SunJCE, class: class com.sun.crypto.provider.SunJCE
SunJCE: Cipher.AES_192/GCM/NoPadding -> com.sun.crypto.provider.AESCipher$AES192_GCM_NoPadding
  aliases: [2.16.840.1.101.3.4.1.26, OID.2.16.840.1.101.3.4.1.26]
  attributes: {SupportedKeyFormats=RAW}

--
Provider: SunJCE, class: class com.sun.crypto.provider.SunJCE
SunJCE: Cipher.AES_128/ECB/NoPadding -> com.sun.crypto.provider.AESCipher$AES128_ECB_NoPadding
  aliases: [2.16.840.1.101.3.4.1.1, OID.2.16.840.1.101.3.4.1.1]
  attributes: {SupportedKeyFormats=RAW}

--
Provider: SunJCE, class: class com.sun.crypto.provider.SunJCE
SunJCE: Cipher.AES_128/OFB/NoPadding -> com.sun.crypto.provider.AESCipher$AES128_OFB_NoPadding
  aliases: [2.16.840.1.101.3.4.1.3, OID.2.16.840.1.101.3.4.1.3]
  attributes: {SupportedKeyFormats=RAW}

--
Provider: SunJCE, class: class com.sun.crypto.provider.SunJCE
SunJCE: Cipher.AES_128/CBC/NoPadding -> com.sun.crypto.provider.AESCipher$AES128_CBC_NoPadding
  aliases: [2.16.840.1.101.3.4.1.2, OID.2.16.840.1.101.3.4.1.2]
  attributes: {SupportedKeyFormats=RAW}

Provider: SunJCE, class: class com.sun.crypto.provider.SunJCE
SunJCE: Cipher.AESWrap_128 -> com.sun.crypto.provider.AESWrapCipher$AES128
  aliases: [2.16.840.1.101.3.4.1.5, OID.2.16.840.1.101.3.4.1.5]
  attributes: {SupportedKeyFormats=RAW, SupportedModes=ECB, SupportedPaddings=NOPADDING}

Provider: SunJCE, class: class com.sun.crypto.provider.SunJCE
SunJCE: Cipher.AES_128/CFB/NoPadding -> com.sun.crypto.provider.AESCipher$AES128_CFB_NoPadding
  aliases: [2.16.840.1.101.3.4.1.4, OID.2.16.840.1.101.3.4.1.4]
  attributes: {SupportedKeyFormats=RAW}

--
Provider: SunJCE, class: class com.sun.crypto.provider.SunJCE
SunJCE: Cipher.AES_128/GCM/NoPadding -> com.sun.crypto.provider.AESCipher$AES128_GCM_NoPadding
  aliases: [2.16.840.1.101.3.4.1.6, OID.2.16.840.1.101.3.4.1.6]
  attributes: {SupportedKeyFormats=RAW}

--
Provider: SunJCE, class: class com.sun.crypto.provider.SunJCE
SunJCE: Cipher.AES_256/GCM/NoPadding -> com.sun.crypto.provider.AESCipher$AES256_GCM_NoPadding
  aliases: [2.16.840.1.101.3.4.1.46, OID.2.16.840.1.101.3.4.1.46]
  attributes: {SupportedKeyFormats=RAW}

--
Provider: SunJCE, class: class com.sun.crypto.provider.SunJCE
SunJCE: Cipher.AES_256/CFB/NoPadding -> com.sun.crypto.provider.AESCipher$AES256_CFB_NoPadding
  aliases: [2.16.840.1.101.3.4.1.44, OID.2.16.840.1.101.3.4.1.44]
  attributes: {SupportedKeyFormats=RAW}

Provider: SunJCE, class: class com.sun.crypto.provider.SunJCE
SunJCE: Cipher.AESWrap_256 -> com.sun.crypto.provider.AESWrapCipher$AES256
  aliases: [2.16.840.1.101.3.4.1.45, OID.2.16.840.1.101.3.4.1.45]
  attributes: {SupportedKeyFormats=RAW, SupportedModes=ECB, SupportedPaddings=NOPADDING}

--
Provider: SunJCE, class: class com.sun.crypto.provider.SunJCE
SunJCE: Cipher.AES_256/ECB/NoPadding -> com.sun.crypto.provider.AESCipher$AES256_ECB_NoPadding
  aliases: [2.16.840.1.101.3.4.1.41, OID.2.16.840.1.101.3.4.1.41]
  attributes: {SupportedKeyFormats=RAW}

Provider: SunJCE, class: class com.sun.crypto.provider.SunJCE
SunJCE: Cipher.AES_256/CBC/NoPadding -> com.sun.crypto.provider.AESCipher$AES256_CBC_NoPadding
  aliases: [2.16.840.1.101.3.4.1.42, OID.2.16.840.1.101.3.4.1.42]
  attributes: {SupportedKeyFormats=RAW}

--
Provider: SunJCE, class: class com.sun.crypto.provider.SunJCE
SunJCE: Cipher.AES_256/OFB/NoPadding -> com.sun.crypto.provider.AESCipher$AES256_OFB_NoPadding
  aliases: [2.16.840.1.101.3.4.1.43, OID.2.16.840.1.101.3.4.1.43]
  attributes: {SupportedKeyFormats=RAW}

--
Provider: SunJCE, class: class com.sun.crypto.provider.SunJCE
SunJCE: Cipher.AES -> com.sun.crypto.provider.AESCipher$General
  aliases: [Rijndael]
  attributes: {SupportedKeyFormats=RAW, SupportedModes=ECB|CBC|PCBC|CTR|CTS|CFB|OFB|CFB8|CFB16|CFB24|CFB32|CFB40|CFB48|CFB56|CFB64|OFB8|OFB16|OFB24|OFB32|OFB40|OFB48|OFB56|OFB64|GCM|CFB72|CFB80|CFB88|CFB96|CFB104|CFB112|CFB120|CFB128|OFB72|OFB80|OFB88|OFB96|OFB104|OFB112|OFB120|OFB128, SupportedPaddings=NOPADDING|PKCS5PADDING|ISO10126PADDING}

--
Provider: SunJCE, class: class com.sun.crypto.provider.SunJCE
SunJCE: Cipher.AESWrap -> com.sun.crypto.provider.AESWrapCipher$General
  attributes: {SupportedKeyFormats=RAW, SupportedModes=ECB, SupportedPaddings=NOPADDING}

Provider: SunJCE, class: class com.sun.crypto.provider.SunJCE

最埌の1行は䜙蚈でした 。こちらはSHAの時のような゚むリアスはないですね。

むしろ、Rijndaelっおなっおたす。

Provider: SunJCE, class: class com.sun.crypto.provider.SunJCE
SunJCE: Cipher.AES -> com.sun.crypto.provider.AESCipher$General
  aliases: [Rijndael]
  attributes: {SupportedKeyFormats=RAW, SupportedModes=ECB|CBC|PCBC|CTR|CTS|CFB|OFB|CFB8|CFB16|CFB24|CFB32|CFB40|CFB48|CFB56|CFB64|OFB8|OFB16|OFB24|OFB32|OFB40|OFB48|OFB56|OFB64|GCM|CFB72|CFB80|CFB88|CFB96|CFB104|CFB112|CFB120|CFB128|OFB72|OFB80|OFB88|OFB96|OFB104|OFB112|OFB120|OFB128, SupportedPaddings=NOPADDING|PKCS5PADDING|ISO10126PADDING}

確かに。

jshell> javax.crypto.Cipher.getInstance("Rijndael").getAlgorithm()
$1 ==> "Rijndael"

なので、Rijndael/CBC/PKCS5Paddingずいった指定も可胜だったりしたす。

゜ヌスコヌド䞊も確認しおみたしょう。

Cipher.AES_128/ECB/NoPaddingなどの、パディングなしの堎合は固有にクラスがありたすね。

https://github.com/openjdk/jdk11u/blob/jdk-11.0.9.1%2B1/src/java.base/share/classes/com/sun/crypto/provider/AESCipher.java#L57-L145

そうでない堎合は、こちらのようです。

https://github.com/openjdk/jdk11u/blob/jdk-11.0.9.1%2B1/src/java.base/share/classes/com/sun/crypto/provider/AESCipher.java#L54

https://github.com/openjdk/jdk11u/blob/jdk-11.0.9.1%2B1/src/java.base/share/classes/com/sun/crypto/provider/AESCipher.java#L185

キヌサむズは-1です。-1は制限なし、を衚すようですが 。

https://github.com/openjdk/jdk11u/blob/jdk-11.0.9.1%2B1/src/java.base/share/classes/com/sun/crypto/provider/AESCipher.java#L173

で、肝心のデフォルト倀はここを芋るずわかりたす。

モヌドはECBですね。

https://github.com/openjdk/jdk11u/blob/jdk-11.0.9.1%2B1/src/java.base/share/classes/com/sun/crypto/provider/CipherCore.java#L110

パディングは、PKCS5Paddingです。

https://github.com/openjdk/jdk11u/blob/jdk-11.0.9.1%2B1/src/java.base/share/classes/com/sun/crypto/provider/CipherCore.java#L164

ずいうわけで、動䜜でも゜ヌスコヌド䞊でも確認できたした、ず。

たずめ

MessageDigestにSHAずか、CipherにAESずだけ指定した堎合に、どうなるんだろうずいう疑問からいろいろ調べお
みたした。

動䜜確認から、実際の゜ヌスコヌドたで远っお確認できたので、いい勉匷になったなぁず思いたす。