ตัวอย่างการเข้ารหัส AES ด้วย Java และถอดรหัสด้วย C#.NET
ตัวอย่างการเข้ารหัสแบบ AES 128 bit บน Java และ .NET
1. การทดสอบการเข้ารหัสและถอดรหัสระหว่าง Java และ .NET
1.1 การเข้ารหัสด้วย Java
ให้รันไฟล์ TestEncrypt.java จะได้ผลลัพธ์ดังนี้
สังเกตว่า cipher text ของภาษาไทยจะยาวกว่าเพราะเข้ารหัสตัวอักษรแบบ
UTF8
1.2 การถอดรหัสด้วย Java
ให้รันไฟล์ TestDecrypt.java จะได้ผลลัพธ์ดังนี้
1.3 การถอดรหัสด้วย .NET
ให้รันโปรเจค Encryption
จะปรากฏแบบฟอร์มดังนี้
ให้ก็อปปี้ cipher text ของคำว่า
Hello World จากภาพที่ 1 ที่ได้จากโปรแกรมฝั่ง
Java มาแปะไว้ในเท็กบ็อกซ์ Cipher Text แล้วกดปุ่ม Decrypt จะได้ผลลัพธ์ดังนี้
1.4 การถอดรหัสคำภาษาไทยด้วย .NET
ให้ก็อปปี Cipher Text ของคำว่า
“สวัสดีครับ” มาจากผลลัพธ์ในภาพที่ 1
ของโปรแกรม Java เอามาใส่ใน .NET แล้วกดปุ่ม Decrypt จะได้ผลลัพธ์กลับออกมาเป็นคำว่า “สวัสดีครับ” อย่างถูกต้อง
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.");
}
ความคิดเห็น
แสดงความคิดเห็น