ตัวอย่างการเข้ารหัส AES ด้วย Java และถอดรหัสด้วย C#.NET

ตัวอย่างการเข้ารหัสแบบ AES 128 bit บน Java และ .NET

1. การทดสอบการเข้ารหัสและถอดรหัสระหว่าง Java และ .NET

1.1 การเข้ารหัสด้วย Java

ให้รันไฟล์ TestEncrypt.java จะได้ผลลัพธ์ดังนี้

รูปภาพ 1 ผลลัพธ์การรันไฟล์ TestEncrypt.java
สังเกตว่า cipher text ของภาษาไทยจะยาวกว่าเพราะเข้ารหัสตัวอักษรแบบ UTF8

1.2 การถอดรหัสด้วย Java

ให้รันไฟล์ TestDecrypt.java จะได้ผลลัพธ์ดังนี้

รูปภาพ 2 ผลลัพธ์การรันไฟล์ TestDecrypt.java

1.3 การถอดรหัสด้วย .NET

ให้รันโปรเจค Encryption จะปรากฏแบบฟอร์มดังนี้

รูปภาพ 3 แบบฟอร์มการทดสอบที่ .NET
ให้ก็อปปี้ cipher text ของคำว่า Hello World จากภาพที่ 1 ที่ได้จากโปรแกรมฝั่ง Java มาแปะไว้ในเท็กบ็อกซ์ Cipher Text แล้วกดปุ่ม Decrypt จะได้ผลลัพธ์ดังนี้

รูปภาพ 4 ผลลัพธ์การถอดรหัสที่ฝั่ง .NET ได้คำว่า Hello World กลับมาถูกต้อง

1.4 การถอดรหัสคำภาษาไทยด้วย .NET

ให้ก็อปปี Cipher Text ของคำว่า สวัสดีครับ มาจากผลลัพธ์ในภาพที่ 1 ของโปรแกรม Java เอามาใส่ใน .NET แล้วกดปุ่ม Decrypt จะได้ผลลัพธ์กลับออกมาเป็นคำว่า สวัสดีครับ อย่างถูกต้อง

รูปภาพ 5 ผลลัพธ์การถอดรหัสที่ฝั่ง .NET ของข้อความภาษาไทย

2. ซอร์สโค้ดของโปรแกรมเข้ารหัสและถอดรหัส

2.1 TestEncrypt.java

package aczept.utils;

public class TestEncrypt {
       public static void main(String[] args) throws Exception {
              AES aes = new AES();
              aes.setInitialVector("0000111122223333");
              aes.setKey("0123012301230123");
              aes.init();
             
              encrypt(aes, "Hello World");
              System.out.println("-------------------------");
             
              encrypt(aes, "สวัสดีครับ");
              System.out.println("-------------------------");
       }

       private static void encrypt(AES aes, String plain) throws Exception {
              System.out.println("plain text : [" + plain + "]");
              String base64 = aes.encrypt(plain);
              System.out.println("base64 cipher text : [" + base64 + "]");
             
              byte[] raw = Base64Coder.decode(base64);
              System.out.println("cipher text : [" + HexUtils.toHexString(raw) + "]");
       }
}

2.2 TestDecrypt.java

package aczept.utils;

public class TestDecrypt {
       public static void main(String[] args) throws Exception {
              AES aes = new AES();
              aes.setInitialVector("0000111122223333");
              aes.setKey("0123012301230123");
              aes.init();
             
              decrypt(aes, "DIhj/eKjYz4Ti6p8lOResg==");
              System.out.println("-------------------------");
             
              decrypt(aes, "/eXjIgRLBW10MZPi+CYsrM/PafW0Y94qPVm5pnBMUZ8=");
              System.out.println("-------------------------");
       }

       private static void decrypt(AES aes, String base64) throws Exception {
              System.out.println("base64 cipher text : [" + base64 + "]");
              String plain = aes.decrypt(base64);
              System.out.println("plain text : [" + plain + "]");
       }
}

2.3 บางส่วนของ AES.java แสดงการตั้งค่าพารามิเตอร์

       public void init() throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException {
              keyBytes = HexUtils.toBytes(key);
              initialVectorBytes = HexUtils.toBytes(initialVector);
             
              secretKey = new SecretKeySpec(keyBytes, "AES");
              ivParamSpec = new IvParameterSpec(initialVectorBytes);
             
              encryptor = Cipher.getInstance("AES/CBC/PKCS5Padding");
              encryptor.init(Cipher.ENCRYPT_MODE, secretKey, ivParamSpec);
             
              decryptor = Cipher.getInstance("AES/CBC/PKCS5Padding");
              decryptor.init(Cipher.DECRYPT_MODE, secretKey, ivParamSpec);
       }

2.4 โปรแกรมทางฝั่ง .NET ทำงานตอบสนองปุ่ม Encrypt และ Decrypt

        private void encryptBtn_Click(object sender, EventArgs e)
        {
            AES aes = new AES();
            aes.key = "0123012301230123";
            aes.initialVector = "0000111122223333";
            aes.init();

            cipherTxt.Text = aes.encrypt(plainTxt.Text);
        }

        private void decryptBtn_Click(object sender, EventArgs e)
        {
            AES aes = new AES();
            aes.key = "0123012301230123";
            aes.initialVector = "0000111122223333";
            aes.init();

            plainTxt2.Text = aes.decrypt(cipherTxt2.Text);
        }

2.5 การตั้งค่าพารามิเตอร์ทางฝั่ง .NET (บางส่วนจากไฟล์ AES.cs)

        private SymmetricAlgorithm algorithm;
        private byte[] secretKey;
        private byte[] iv;
        private ICryptoTransform encryptor;
        private ICryptoTransform decryptor;

        public void init()
        {
            algorithm = SymmetricAlgorithm.Create("Rijndael");
            algorithm.Mode = CipherMode.CBC;
            algorithm.Padding = PaddingMode.PKCS7;
            algorithm.KeySize = 128;
            algorithm.BlockSize = 128;

            secretKey = Encoding.ASCII.GetBytes(key);
            iv = Encoding.ASCII.GetBytes(initialVector);
            encryptor = algorithm.CreateEncryptor(secretKey, iv);
            decryptor = algorithm.CreateDecryptor(secretKey, iv);
            Console.WriteLine("Initialize AES successful.");
        }



ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

การติดตั้ง Shibboleth Single Sign-On
ตอนที่ 12 - การทำ SLO (Single Log-out)

การรักษาความปลอดภัยแบบ OWASP