Re: [問題] AES加解密..
※ 引述《reon (完成這條天堂路)》之銘言:
: ※ 引述《jet113102 (傳說中的Yi)》之銘言:
: : 小弟在網路上有找到AES加密的source code
: : 然而他是以字串去處理的
: : 我把它改成其他的檔案 (EX:JPEG) 之類的使他強制讀取文字後加密
: : 加密沒出問題, 但解密時出現了錯誤= =
: : javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16
: : when decrypting with padded cipher
: : 我似乎太天真了 囧...
: : 如果說我要進行加解密有辦法以檔案直接做嗎?
: : 還是說以讀取字串的方法進行修改即可?
: 感覺你講的沒很清楚
: 如果你要用AES加密 那Java本身就有了 不需要額外去找Source Code吧?
: 因為Java本身支援的加解密已經頗完整了
: 我覺得你解不出來是不是 你把密文 用同樣的key 加密的souce code來解密?
: AES雖然是對稱式加密 但是加密和解密函式不同!! 不要被DES誤導
: DES才是加密和解密函式相同!!
: 要用Java內建的AES加密 資料必須是byte array型態
: 有興趣的話自己去看一下歐萊禮出的 JAVA安全防護 和 官網JCA guide
大家好!我又來了....
剛剛把有關加解密串流的類別稍微看了一下:
Cipher, CipherInputStream, CipherOutputStream, KeyGenerator
消化之後,變成下面的程式碼,把字串加密至檔案,再從該檔案解密至另一個檔案。
public static void main(String[] args) throws Exception {
// 產生 AES 專用的鑰匙,以後加密解密都用這一把。
Key key = KeyGenerator.getInstance("AES").generateKey();
// 加解密的演算法是 AES, 模式是 CBC, 填充是 PKCS5Padding
String transformation = "AES/CBC/PKCS5Padding";
// 依上述演算法、模式與填充的方法建立一個加密器
Cipher encryption = Cipher.getInstance(transformation);
encryption.init(Cipher.ENCRYPT_MODE, key);
// 依上述演算法、模式與填充的方法建立一個解密器
Cipher decryption = Cipher.getInstance(transformation);
decryption.init(Cipher.DECRYPT_MODE, key, encryption.getParameters());
// 開始加密的示範
encrypt(encryption, key);
// 開始解密的示範
decrypt(decryption, key);
// 執行完之後來個 OK!
System.out.println("OK!");
}
private static void encrypt(Cipher encryption, Key key)
throws Exception {
// 建立加密的檔案輸出串流,放置加密後的資料,檔名為 test.txt
FileOutputStream fos = new FileOutputStream(new File("test.txt"));
CipherOutputStream cos = new CipherOutputStream(fos, encryption);
// 即將要被加密的訊息
String messages[] = { "BOOK", "DESK" };
// 寫入檔案串流中
for (int i = 0; i < messages.length; i++) {
cos.write(messages[i].getBytes());
}
// 把該關的關一關
cos.flush();
cos.close();
fos.close();
}
private static void decrypt(Cipher decryption, Key key) throws Exception {
// 建立解密的檔案輸入串流,檔名為 test.txt
FileInputStream fis = new FileInputStream(new File("test.txt"));
CipherInputStream cis = new CipherInputStream(fis, decryption);
// 建立檔案輸出串流,放置解密之後的結果,檔名為 result.txt
FileOutputStream fos = new FileOutputStream(new File("result.txt"));
// 把那些從 test.txt 讀到的東西寫到 result.txt
while (fis.available() > 0) {
byte[] buffer = new byte[1024];
int length = cis.read(buffer);
fos.write(buffer, 0, length);
}
// 把該關的東西關一關
fos.flush();
fos.close();
fis.close();
cis.close();
}
打開 test.txt 一看,結果是亂碼:
,?軱v?wg ?M絃
然而 result.txt 十分正常:
BOOKDESK
如果想要加密其他的東西,只要有辦法把資料轉換至 byte[] 就可以了!
或者您可以利用 OutputStream 本身的裝飾者模式,利用衍生的裝飾者來做加密。
舉例而言: new ObjectOutputStream(new CipherOutputStream(..., ...))
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.116.247.13
討論串 (同標題文章)