ããã¯ããªã«ãããããŠæžãããã®ïŒ
ãã®ããããèŠãŠããŠ
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"
åŸè ã®å Žåãã¢ãŒãããã³ããã£ã³ã°æ¹åŒã«ã¯ããããã€ãåºæã®ããã©ã«ãå€ã䜿çšãããŸãã
ãã ãããã©ã«ãå€ããªã«ãã¯Javadocããã¯ããããŸãããJavaã»ãã¥ãªãã£æšæºã¢ã«ãŽãªãºã åãèŠãŠãããããŸããã
Javaã»ãã¥ãªãã£æšæºã¢ã«ãŽãªãºã å / Cipherã¢ã«ãŽãªãºã å
JCAãJDKãããã€ãã®ããã¥ã¡ã³ããèŠããšãçããæžããŠãããŸãã
Javaæå·åã¢ãŒããã¯ãã£(JCA)ãªãã¡ã¬ã³ã¹ã»ã¬ã€ã / Cipherã¯ã©ã¹
ã¢ã«ãŽãªãºã ãã¢ãŒãããã³ããã£ã³ã°ãå®å šã«æå®ããå€æã䜿çšããããšããèŠãããŸããããããªããšããããã€ãã¯ããã©ã«ãã䜿çšããŸããããšãã°ãSunJCEãããã€ããšSunPKCS11ãããã€ãã¯ãå€ãã®å¯Ÿç§°æå·ã§ECBãããã©ã«ãã»ã¢ãŒããšããŠãPKCS5Paddingãããã©ã«ãã»ããã£ã³ã°ãšããŠäœ¿çšããŸãã
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
ãç»é²ãããŠããããã§ãã
ãœãŒã¹ã³ãŒãã§ãããšãããã§ããã
ãšããããã§ã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
ãé€ããŠãã¹ãŠäœ¿ããåãå€ãæå·åããŸãã
éµã¯ã©ã³ãã ã§çæããŸãããåã¢ã«ãŽãªãºã ãã¢ãŒããããã£ã³ã°ã§åããã®ã䜿ããŸãã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
ãªã©ã®ãããã£ã³ã°ãªãã®å Žåã¯åºæã«ã¯ã©ã¹ããããŸããã
ããã§ãªãå Žåã¯ããã¡ãã®ããã§ãã
ããŒãµã€ãºã¯-1
ã§ãã-1
ã¯å¶éãªãããè¡šãããã§ããâŠã
ã§ãèå¿ã®ããã©ã«ãå€ã¯ãããèŠããšããããŸãã
ã¢ãŒãã¯ECB
ã§ããã
ããã£ã³ã°ã¯ãPKCS5Padding
ã§ãã
ãšããããã§ãåäœã§ããœãŒã¹ã³ãŒãäžã§ã確èªã§ããŸããããšã
ãŸãšã
MessageDigest
ã«SHA
ãšããCipher
ã«AES
ãšã ãæå®ããå Žåã«ãã©ããªããã ããïŒãšããçåãããããã調ã¹ãŠ
ã¿ãŸããã
åäœç¢ºèªãããå®éã®ãœãŒã¹ã³ãŒããŸã§è¿œã£ãŠç¢ºèªã§ããã®ã§ãããå匷ã«ãªã£ããªããšæããŸãã