Re: [問題] AES加解密..

看板java作者 (!H45)時間17年前 (2008/07/02 20:40), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/3 (看更多)
※ 引述《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
文章代碼(AID): #18QtTMUe (java)
討論串 (同標題文章)
文章代碼(AID): #18QtTMUe (java)