English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تفصيل لأساليب التشفير والفك التشفير الشائعة في Java

أمان البيانات أصبح مشكلة مهمة بشكل متزايد، كيفية تشفير وفك تشفير البيانات المهمة في Java هو موضوع رئيسي لهذا المقال.

أولاً، خوارزميات التشفير/فك التشفير الشائعة

1.Base64

بشكل صحيح، Base64 ليس خوارزمية تشفير/فك تشفير، بل هو طريقة تشفير. لا يولد Base64 مفتاحًا، يمكن ترجمة النص المشفرة عبر Base64 مباشرة إلى نص واضح، ولكن يمكن استخدام إضافة حروف مزعجة إلى النص الواضح لتحقيق تأثير التشفير.

2.DES

DES هي خوارزمية تعتمد على مفتاح بطول 56 بت، وتم تحديدها من قبل مكتب المعايير الفيدرالية الأمريكية في عام 1976 كمعيار معالجة البيانات الفيدرالية (FIPS). بعد ذلك انتشرت على نطاق واسع في العالم. الآن، ليس DES خوارزمية تشفير آمنة بعد الآن، وقد تم اختراقها علناً، وقد تم استبدالها الآن بخوارزمية معيار التشفير المتقدم (AES).

3.3DES

3DES هي خوارزمية مشتقة من DES، حيث تم تحسين بعض الجوانب العملية الأمنية لـ DES.

4.AES

AES هو أحد أكثر خوارزميات التشفير الت对称 الشائعة الآن.

ثانيًا، المكتبات المطلوبة للتنفيذ

لتنفيذ هذه الألغام، يمكننا استخدام التنفيذ المدمج في JDK، أو استخدام مكتبات ثالثة مفتوحة المصدر مثل Bouncy Castle (https://www.bouncycastle.org/)وcomnons codec(https://commons.apache.org/proper/commons-codec/)。

ثالثاً، التنفيذ المحدد

1.Base64

الباقة com.tancky.security;
import java.io.IOException;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class Base64Demo {
 private static String src = "TestBase64";
 public static void main(String[] args) {
 Base64Demo.jdkBase64();
 Base64Demo.commonsCodecBase64 ();
 Base64Demo.bouncyCastleBase64 ();
 }
 //استخدام تنفيذ JDK للـ base64
 public static void jdkBase64 () {
 BASE64Encoder encoder = new BASE64Encoder();
 String encode = encoder.encode(Base64Demo.src.getBytes());
 System.out.println("encode: " + encode);
 BASE64Decoder decoder = new BASE64Decoder();
 try {
  String decode = new String ( decoder.decodeBuffer(encode));
  System.out.println("decode: " + decode);
 } catch (IOException e) {
  e.printStackTrace();
 } 
 }
 //استخدام مكتبة apache commons codec
 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);
 }
 //استخدام بونسي كاست DE
 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

الباقة com.tancky.security;
استيراد java.security.InvalidKeyException;
استيراد java.security.Key;
استيراد java.security.NoSuchAlgorithmException;
استيراد java.security.NoSuchProviderException;
استيراد java.security.Security;
import java.security.spec.InvalidKeySpecException;
استيراد javax.crypto.BadPaddingException;
استيراد javax.crypto.Cipher;
استيراد javax.crypto.IllegalBlockSizeException;
استيراد javax.crypto.KeyGenerator;
استيراد javax.crypto.NoSuchPaddingException;
استيراد javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
استيراد 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));
  catch (NoSuchPaddingException e) {
  cipher.init(Cipher.DECRYPT_MODE,convertSecretKey);
  byte[] DecodeResult = cipher.doFinal(encodeResult);
  System.out.println("DESDncode :" + new String (DecodeResult));
 catch (IllegalBlockSizeException e) {
  e.printStackTrace();
 catch (BadPaddingException e) {
  // TODO المربعات السوداء المولدة تلقائيًا
  e.printStackTrace();
 } سأل (InvalidKeySpecException e) {
  // TODO المربعات السوداء المولدة تلقائيًا
  e.printStackTrace();
 }
  // TODO المربعات السوداء المولدة تلقائيًا
  e.printStackTrace();
 }
  // TODO المربعات السوداء المولدة تلقائيًا
  e.printStackTrace();
 catch (NoSuchProviderException e) {
  // TODO المربعات السوداء المولدة تلقائيًا
  e.printStackTrace();
 }
 }
 public static void bcDES (){
 try {
  //استخدام تشفير DES من BouncyCastle
  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));
  catch (NoSuchPaddingException e) {
  cipher.init(Cipher.DECRYPT_MODE,convertSecretKey);
  byte[] DecodeResult = cipher.doFinal(encodeResult);
  System.out.println("DESDncode :" + new String (DecodeResult));
 catch (IllegalBlockSizeException e) {
  e.printStackTrace();
 catch (BadPaddingException e) {
  // TODO المربعات السوداء المولدة تلقائيًا
  e.printStackTrace();
 } سأل (InvalidKeySpecException e) {
  // TODO المربعات السوداء المولدة تلقائيًا
  e.printStackTrace();
 }
  // TODO المربعات السوداء المولدة تلقائيًا
  e.printStackTrace();
 }
  // TODO المربعات السوداء المولدة تلقائيًا
  e.printStackTrace();
 catch (NoSuchProviderException e) {
  // TODO المربعات السوداء المولدة تلقائيًا
  e.printStackTrace();
 }
  // TODO المربعات السوداء المولدة تلقائيًا
  e.printStackTrace();
 }
 }
 public static void main(String[] args) {
 DESDemo.jdkDES ();
 DESDemo.bcDES();
 }
}

3.3DES

الباقة com.tancky.security;
استيراد java.security.InvalidKeyException;
استيراد java.security.Key;
استيراد java.security.NoSuchAlgorithmException;
استيراد java.security.NoSuchProviderException;
استيراد java.security.Security;
import java.security.spec.InvalidKeySpecException;
استيراد javax.crypto.BadPaddingException;
استيراد javax.crypto.Cipher;
استيراد javax.crypto.IllegalBlockSizeException;
استيراد javax.crypto.KeyGenerator;
استيراد javax.crypto.NoSuchPaddingException;
استيراد javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
استيراد 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));
  catch (NoSuchPaddingException e) {
  cipher.init(Cipher.DECRYPT_MODE,convertSecretKey);
  byte[] DecodeResult = cipher.doFinal(encodeResult);
  System.out.println("TripleDESDncode :" + new String (DecodeResult));
 catch (IllegalBlockSizeException e) {
  e.printStackTrace();
 catch (BadPaddingException e) {
  // TODO المربعات السوداء المولدة تلقائيًا
  e.printStackTrace();
 } سأل (InvalidKeySpecException e) {
  // TODO المربعات السوداء المولدة تلقائيًا
  e.printStackTrace();
 }
  // TODO المربعات السوداء المولدة تلقائيًا
  e.printStackTrace();
 }
  // TODO المربعات السوداء المولدة تلقائيًا
  e.printStackTrace();
 catch (NoSuchProviderException e) {
  // TODO المربعات السوداء المولدة تلقائيًا
  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));
  catch (NoSuchPaddingException e) {
  cipher.init(Cipher.DECRYPT_MODE,convertSecretKey);
  byte[] DecodeResult = cipher.doFinal(encodeResult);
  System.out.println("TripleDESDncode :" + new String (DecodeResult));
 catch (IllegalBlockSizeException e) {
  e.printStackTrace();
 catch (BadPaddingException e) {
  // TODO المربعات السوداء المولدة تلقائيًا
  e.printStackTrace();
 } سأل (InvalidKeySpecException e) {
  // TODO المربعات السوداء المولدة تلقائيًا
  e.printStackTrace();
 }
  // TODO المربعات السوداء المولدة تلقائيًا
  e.printStackTrace();
 }
  // TODO المربعات السوداء المولدة تلقائيًا
  e.printStackTrace();
 catch (NoSuchProviderException e) {
  // TODO المربعات السوداء المولدة تلقائيًا
  e.printStackTrace();
 }
  // TODO المربعات السوداء المولدة تلقائيًا
  e.printStackTrace();
 }
 }
 public static void main(String[] args) {
 jdkTripleDES();
 bcTripleDES();
 }
}

4.AES

الباقة com.tancky.security;
استيراد java.security.InvalidKeyException;
استيراد java.security.Key;
استيراد java.security.NoSuchAlgorithmException;
استيراد java.security.NoSuchProviderException;
استيراد java.security.SecureRandom;
استيراد java.security.Security;
استيراد javax.crypto.BadPaddingException;
استيراد javax.crypto.Cipher;
استيراد javax.crypto.IllegalBlockSizeException;
استيراد javax.crypto.KeyGenerator;
استيراد javax.crypto.NoSuchPaddingException;
استيراد javax.crypto.SecretKey;
استيراد javax.crypto.spec.SecretKeySpec;
استيراد 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) );
  catch (NoSuchPaddingException e) {
  }
  catch (InvalidKeyException e) {
  }
 catch (IllegalBlockSizeException e) {
  // TODO المربعات السوداء المولدة تلقائيًا
  e.printStackTrace();
 }
  // TODO المربعات السوداء المولدة تلقائيًا
  e.printStackTrace();
 catch (BadPaddingException e) {
  // TODO المربعات السوداء المولدة تلقائيًا
  e.printStackTrace();
 }
  // TODO المربعات السوداء المولدة تلقائيًا
  e.printStackTrace();
 catch (NoSuchProviderException e) {
  // TODO المربعات السوداء المولدة تلقائيًا
  e.printStackTrace();
 }
 }
 public static void bcAES (){
 try {
  //استخدام تشفير DES من BouncyCastle
  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) );
  catch (NoSuchPaddingException e) {
  }
  catch (InvalidKeyException e) {
  }
 catch (IllegalBlockSizeException e) {
  // TODO المربعات السوداء المولدة تلقائيًا
  e.printStackTrace();
 }
  // TODO المربعات السوداء المولدة تلقائيًا
  e.printStackTrace();
 catch (BadPaddingException e) {
  // TODO المربعات السوداء المولدة تلقائيًا
  e.printStackTrace();
 }
  // TODO المربعات السوداء المولدة تلقائيًا
  e.printStackTrace();
 catch (NoSuchProviderException e) {
  // TODO المربعات السوداء المولدة تلقائيًا
  e.printStackTrace();
 }
  // TODO المربعات السوداء المولدة تلقائيًا
  e.printStackTrace();
 }
 }
 public static void main(String[] args) {
 jdkAES();
 bcAES();
 }
}

هذا هو محتوى المقال كله، نأمل أن يكون محتوى هذا المقال قد ساعدكم في التعلم أو العمل، ونأمل أيضًا أن تدعموا تعليمات الصياح!

بيان: محتوى هذا المقال تم استنساخه من الإنترنت، وله حقوق الملكية الأصلية للمالك، تم إدراجه من قبل المستخدمين على الإنترنت بتحميله بشكل تلقائي، ويتمتع هذا الموقع بعدم امتلاك حقوق الملكية، ولا يتم تعديل المحتوى بشكل يدوي، ولا يتحمل الموقع أي مسؤولية قانونية ذات صلة. إذا كنت قد وجدت محتوى يشتبه في حقوق النسخ، فالرجاء إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال '#' ب '@') للإبلاغ، وقدم الدليل على الدليل، وإذا تم التحقق من ذلك، سيتم حذف محتوى يشتبه في حقوق النسخ فورًا.

أنت قد تستمتع بهذا