English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
セキュリティ問題はますます重要な問題となっており、Javaで重要データを暗号化・復号化する方法は、この記事の主題です。
1. 常用の暗号化/デコードアルゴリズムではありません。
1.Base;64
厳密にはBase64は暗号化方法ではありません。/デコードアルゴリズムではなく、コーディング方法です。Base64キーを生成せず、Base64暗号化された暗号を直接「翻訳」して明文にすることができますが、明文に混淆文字を追加することで暗号化効果を達成することができます。
2.DES
DESは、56ビットの鍵を持つ対称暗号化アルゴリズムです。1976年にアメリカ連邦政府の標準技術研究所(NIST)によってFIPS(Federal Information Processing Standard)として確定され、その後世界中で広く使用されました。現在、DESは安全な暗号化アルゴリズムではなく、公開で解読可能であり、DESはAES(Advanced Encryption Standard)に取って代わられています。
3.3DES
3DESはDESの派生アルゴリズムで、DESの実用的な安全性を向上させました。
4.AES
AESは現在、対称暗号化アルゴリズムの中で最も人気のあるアルゴリズムの1つです。
2. 実装に必要なライブラリ
これらのアルゴリズムを実装するために、JDKに組み込まれた実装を使用することもできますし、Bouncy Castle(https://www.bouncycastle.org/)およびcomnons codec(https://commons.apache.org/proper/commons-codec/)。
3. 具体的実装
1.Base;64
package com.tancky.security; import java.io.IOException; import sun.misc.BASE;64Decoder; import sun.misc.BASE;64Encoder; public class Base64Demo { private static String src = "TestBase64"; public static void main(String[] args) { Base64Demo.jdkBase64(); Base64Demo.commonsCodecBase64 (); Base64Demo.bouncyCastleBase64 (); } //JDKのbaseを使用して、64実装, public static void jdkBase64 (){ BASE;64Encoder encoder = new BASE;64Encoder(); String encode = encoder.encode(Base;64Demo.src.getBytes()); System.out.println("encode: "); + encode); BASE;64Decoder decoder = new BASE;64Decoder(); try { String decode = new String(decoder.decodeBuffer(encode)); System.out.println("decode: "); + decode); } catch (IOException e) { e.printStackTrace(); } } //使用apache的commonsCodec实现 public static void commonsCodecBase64 (){ byte[] encodeBytes = org.apache.commons.codec.binary.Base64.encodeBase64(Base64Demo.src.getBytes()); String encode = new String (encodeBytes); System.out.println("encode: "); + encode); byte[] decodeBytes = org.apache.commons.codec.binary.Base64.decodeBase64(encode); String decode = new String(decodeBytes); System.out.println("decode: "); + decode); } //使用bouncyCastlede实现 public static void bouncyCastleBase64 () { byte[] encodeBytes = org.bouncycastle.util.encoders.Base64.encode(Base64Demo.src.getBytes()) ; String encode = new String (encodeBytes); System.out.println("encode: "); + encode); byte[] decodeBytes = org.bouncycastle.util.encoders.Base64.decode(encode); String decode = new String(decodeBytes); System.out.println("decode: "); + decode); } }
2.DES
package com.tancky.security; import java.security.InvalidKeyException; import java.security.Key; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.Security; import java.security.spec.InvalidKeySpecException; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.KeyGenerator; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.util.encoders.Hex; public class DESDemo { private static String src = "TestDES"; public static void jdkDES () { try { //密钥Key生成 KeyGenerator keyGenerator = KeyGenerator.getInstance("DES"); keyGenerator.init(56); SecretKey secretKey = keyGenerator.generateKey(); byte[] bytesKey = secretKey.getEncoded(); //KEY変換 DESKeySpec deSedeKeySpec = new DESKeySpec(bytesKey); SecretKeyFactory factory = SecretKeyFactory.getInstance("DES"); Key convertSecretKey = factory.generateSecret(deSedeKeySpec); //暗号化 Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey); byte[] encodeResult = cipher.doFinal(DESDemo.src.getBytes()); System.out.println("DESEncode :" + Hex.toHexString(encodeResult); //解密 cipher.init(Cipher.DECRYPT_MODE, convertSecretKey); byte[] DecodeResult = cipher.doFinal(encodeResult); System.out.println("DESDncode :" + new String(DecodeResult); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (InvalidKeyException e) { // TODO 自動生成の catch ブロック e.printStackTrace(); } catch (InvalidKeySpecException e) { // TODO 自動生成の catch ブロック e.printStackTrace(); } catch (NoSuchPaddingException e) { // TODO 自動生成の catch ブロック e.printStackTrace(); } catch (IllegalBlockSizeException e) { // TODO 自動生成の catch ブロック e.printStackTrace(); } catch (BadPaddingException e) { // TODO 自動生成の catch ブロック e.printStackTrace(); } } public static void bcDES (){ try { //BouncyCastleのDES暗号化を使用 Security.addProvider(new BouncyCastleProvider()); //密钥Key生成 KeyGenerator keyGenerator = KeyGenerator.getInstance("DES","BC"); keyGenerator.init(56); SecretKey secretKey = keyGenerator.generateKey(); byte[] bytesKey = secretKey.getEncoded(); //KEY変換 DESKeySpec deSedeKeySpec = new DESKeySpec(bytesKey); SecretKeyFactory factory = SecretKeyFactory.getInstance("DES"); Key convertSecretKey = factory.generateSecret(deSedeKeySpec); //暗号化 Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey); byte[] encodeResult = cipher.doFinal(DESDemo.src.getBytes()); System.out.println("DESEncode :" + Hex.toHexString(encodeResult); //解密 cipher.init(Cipher.DECRYPT_MODE, convertSecretKey); byte[] DecodeResult = cipher.doFinal(encodeResult); System.out.println("DESDncode :" + new String(DecodeResult); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (InvalidKeyException e) { // TODO 自動生成の catch ブロック e.printStackTrace(); } catch (InvalidKeySpecException e) { // TODO 自動生成の catch ブロック e.printStackTrace(); } catch (NoSuchPaddingException e) { // TODO 自動生成の catch ブロック e.printStackTrace(); } catch (IllegalBlockSizeException e) { // TODO 自動生成の catch ブロック e.printStackTrace(); } catch (BadPaddingException e) { // TODO 自動生成の catch ブロック e.printStackTrace(); } catch (NoSuchProviderException e) { // TODO 自動生成の catch ブロック e.printStackTrace(); } } public static void main(String[] args) { DESDemo.jdkDES (); DESDemo.bcDES(); } }
3.3DES
package com.tancky.security; import java.security.InvalidKeyException; import java.security.Key; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.Security; import java.security.spec.InvalidKeySpecException; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.KeyGenerator; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESedeKeySpec; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.util.encoders.Hex; public class TripleDESDemo { private static String src = "TestTripleDES"; public static void jdkTripleDES () { try { //密钥Key生成 KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede"); keyGenerator.init(168); SecretKey secretKey = keyGenerator.generateKey(); byte[] bytesKey = secretKey.getEncoded(); //KEY変換 DESedeKeySpec deSedeKeySpec = new DESedeKeySpec(bytesKey); SecretKeyFactory factory = SecretKeyFactory.getInstance("DESede"); Key convertSecretKey = factory.generateSecret(deSedeKeySpec); //暗号化 Cipher cipher = Cipher.getInstance("DESede"}/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey); byte[] encodeResult = cipher.doFinal(TripleDESDemo.src.getBytes()); System.out.println("TripleDESEncode : "); + Hex.toHexString(encodeResult); //解密 cipher.init(Cipher.DECRYPT_MODE, convertSecretKey); byte[] DecodeResult = cipher.doFinal(encodeResult); System.out.println("TripleDESDncode : "); + new String(DecodeResult); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (InvalidKeyException e) { // TODO 自動生成の catch ブロック e.printStackTrace(); } catch (InvalidKeySpecException e) { // TODO 自動生成の catch ブロック e.printStackTrace(); } catch (NoSuchPaddingException e) { // TODO 自動生成の catch ブロック e.printStackTrace(); } catch (IllegalBlockSizeException e) { // TODO 自動生成の catch ブロック e.printStackTrace(); } catch (BadPaddingException e) { // TODO 自動生成の catch ブロック e.printStackTrace(); } } public static void bcTripleDES () { try { Security.addProvider(new BouncyCastleProvider()); //密钥Key生成 KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede","BC"); keyGenerator.getProvider(); keyGenerator.init(168); SecretKey secretKey = keyGenerator.generateKey(); byte[] bytesKey = secretKey.getEncoded(); //KEY変換 DESedeKeySpec deSedeKeySpec = new DESedeKeySpec(bytesKey); SecretKeyFactory factory = SecretKeyFactory.getInstance("DESede"); Key convertSecretKey = factory.generateSecret(deSedeKeySpec); //暗号化 Cipher cipher = Cipher.getInstance("DESede"}/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey); byte[] encodeResult = cipher.doFinal(TripleDESDemo.src.getBytes()); System.out.println("TripleDESEncode : "); + Hex.toHexString(encodeResult); //解密 cipher.init(Cipher.DECRYPT_MODE, convertSecretKey); byte[] DecodeResult = cipher.doFinal(encodeResult); System.out.println("TripleDESDncode : "); + new String(DecodeResult); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (InvalidKeyException e) { // TODO 自動生成の catch ブロック e.printStackTrace(); } catch (InvalidKeySpecException e) { // TODO 自動生成の catch ブロック e.printStackTrace(); } catch (NoSuchPaddingException e) { // TODO 自動生成の catch ブロック e.printStackTrace(); } catch (IllegalBlockSizeException e) { // TODO 自動生成の catch ブロック e.printStackTrace(); } catch (BadPaddingException e) { // TODO 自動生成の catch ブロック e.printStackTrace(); } catch (NoSuchProviderException e) { // TODO 自動生成の catch ブロック e.printStackTrace(); } } public static void main(String[] args) { jdkTripleDES(); bcTripleDES(); } }
4.AES
package com.tancky.security; import java.security.InvalidKeyException; import java.security.Key; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.SecureRandom; import java.security.Security; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.KeyGenerator; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.util.encoders.Hex; public class AESDemo { private static String src = "TestAES"; public static void jdkAES (){ try { //キー生成 KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); keyGenerator.init(128); //keyGenerator.init(128, new SecureRandom("seedseedseed".getBytes())); //このような初期化方法を使用すると、特定のシードでキーを生成することができ、暗号化された暗号は一意で固定されます。 SecretKey secretKey = keyGenerator.generateKey(); byte[] keyBytes = secretKey.getEncoded(); //キー変換 Key key = new SecretKeySpec(keyBytes, "AES"); //暗号化 Cipher cipher = Cipher.getInstance("AES",/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, key); byte[] encodeResult = cipher.doFinal(AESDemo.src.getBytes()); System.out.println("AESエンコード: ") + Hex.toHexString(encodeResult) ); //解密 cipher.init(Cipher.DECRYPT_MODE, key); byte[] decodeResult = cipher.doFinal(encodeResult); System.out.println("AESdecode : " + new String (decodeResult)); } catch (NoSuchAlgorithmException e) { // TODO 自動生成の catch ブロック e.printStackTrace(); } catch (NoSuchPaddingException e) { // TODO 自動生成の catch ブロック e.printStackTrace(); } catch (InvalidKeyException e) { // TODO 自動生成の catch ブロック e.printStackTrace(); } catch (IllegalBlockSizeException e) { // TODO 自動生成の catch ブロック e.printStackTrace(); } catch (BadPaddingException e) { // TODO 自動生成の catch ブロック e.printStackTrace(); } } public static void bcAES (){ try { //BouncyCastleのDES暗号化を使用 Security.addProvider(new BouncyCastleProvider()); //キー生成 KeyGenerator keyGenerator = KeyGenerator.getInstance("AES","BC"); keyGenerator.getProvider(); keyGenerator.init(128); SecretKey secretKey = keyGenerator.generateKey(); byte[] keyBytes = secretKey.getEncoded(); //キー変換 Key key = new SecretKeySpec(keyBytes, "AES"); //暗号化 Cipher cipher = Cipher.getInstance("AES",/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, key); byte[] encodeResult = cipher.doFinal(AESDemo.src.getBytes()); System.out.println("AESエンコード: ") + Hex.toHexString(encodeResult) ); //解密 cipher.init(Cipher.DECRYPT_MODE, key); byte[] decodeResult = cipher.doFinal(encodeResult); System.out.println("AESdecode : " + new String (decodeResult)); } catch (NoSuchAlgorithmException e) { // TODO 自動生成の catch ブロック e.printStackTrace(); } catch (NoSuchPaddingException e) { // TODO 自動生成の catch ブロック e.printStackTrace(); } catch (InvalidKeyException e) { // TODO 自動生成の catch ブロック e.printStackTrace(); } catch (IllegalBlockSizeException e) { // TODO 自動生成の catch ブロック e.printStackTrace(); } catch (BadPaddingException e) { // TODO 自動生成の catch ブロック e.printStackTrace(); } catch (NoSuchProviderException e) { // TODO 自動生成の catch ブロック e.printStackTrace(); } } public static void main(String[] args) { jdkAES(); bcAES(); } }
これで本文のすべての内容が終わります。本文の内容が皆様の学習や仕事に少しでも役立つことを願っています。また、呐喊教程!を多くのサポートをお願いします。
声明:本文の内容はインターネットから取得しており、著作権者は所有しておりません。インターネットユーザーが自発的に貢献し、自己でアップロードしたものであり、本サイトは所有権を持ちません。また、人工的な編集は行われていません。著作権侵害が疑われる内容がある場合は、以下のメールアドレスまでご連絡ください:notice#oldtoolbag.com(メールを送信する際には、#を@に変更してください。侵害を報告する場合、関連する証拠を提供してください。一旦確認がとれましたら、本サイトは侵害された内容をすぐに削除します。)