2011年10月13日 星期四

使用 Java 進行 AES 加密

前天投了一家處理資安的公司,沒想到很快就回覆我了,而且還夾帶了一個小小的程式撰寫測驗!

----

程式寫作測驗:
請寫一個檔案加密的程式,輸入檔名,讀取內容,加密後輸出成另一加密檔。
請交原始碼、編譯環境相關檔案,可參考或使用現成的加密函式RSA, AES, DES…或者基本的XOR。
評分標準:
基本項目
1. coding style (Source Code)
2. 完成度(exe檔 或 JAR檔)


加分項目
1. 可以的話用不同語言(C++, Java)撰寫
2. 不同作業系統程式 (project or make file)
3. 視窗介面(console, Windows 或 手機)

----

加密的東西其實還蠻常用到的,像是 PHP 的使用者密碼都是會經過加密在儲存到資料庫,只是用 Java 到還是頭一遭!稍微做了點功課,發現大家比較推薦的加密演算法是 AES,而且在 Java 的官網就可以找到教學文章 ,所以就寫了一個簡單的 AES 加密、解密器。

核心程式碼如下:

AESEncrypter.java

package joujiahe.encrypt.AES;

import java.security.NoSuchAlgorithmException;

import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;

// AES Encrypt core
public class AESEncrypter {

 private SecretKeySpec skeySpec;
 private Cipher cipher;
 
 public AESEncrypter() throws NoSuchAlgorithmException, NoSuchPaddingException{
    // Get the KeyGenerator
    KeyGenerator kgen = KeyGenerator.getInstance("AES");
    kgen.init(128); // 192 and 256 bits may not be available
 
 
    // Generate the secret key specs.
    SecretKey skey = kgen.generateKey();
    byte[] raw = skey.getEncoded();
    this.skeySpec = new SecretKeySpec(raw, "AES");
 
 
    // Instantiate the cipher
    this.cipher = Cipher.getInstance("AES");
 }
 
 // output encrypted bytes
 public  byte[] encrypt( byte[] original ) throws Exception{
   
    this.getCipher().init(Cipher.ENCRYPT_MODE, skeySpec);
    byte[] encrypted = cipher.doFinal(original);
    
    return encrypted;
 }

 // output decrypted bytes
 public  byte[] decrypt( byte[] original ) throws Exception{
    
    this.getCipher().init(Cipher.DECRYPT_MODE, skeySpec);
    byte[] decrypted = cipher.doFinal(original);
    
    return decrypted;
 }

 // getter and setter
 public SecretKeySpec getSkeySpec() {
  return skeySpec;
 }

 public void setSkeySpec(SecretKeySpec skeySpec) {
  this.skeySpec = skeySpec;
 }

 public Cipher getCipher() {
  return cipher;
 }

 public void setCipher(Cipher cipher) {
  this.cipher = cipher;
 }
 
}


參考資料:Using AES with Java Technology

沒有留言: