Java實(shí)現(xiàn)文件的RSA和DES加密_第1頁(yè)
Java實(shí)現(xiàn)文件的RSA和DES加密_第2頁(yè)
Java實(shí)現(xiàn)文件的RSA和DES加密_第3頁(yè)
Java實(shí)現(xiàn)文件的RSA和DES加密_第4頁(yè)
Java實(shí)現(xiàn)文件的RSA和DES加密_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Java實(shí)現(xiàn)文件的RSA和DES加密算法一、 基礎(chǔ)知識(shí) 根據(jù)密鑰類型不同將現(xiàn)代密碼技術(shù)分為兩類:對(duì)稱加密算法(秘密鑰匙加密)和非對(duì)稱加密算法(公開密鑰加密)。對(duì)稱鑰匙加密系統(tǒng)是加密和解密均采用同一把秘密鑰匙,而且通信雙方都必須獲得這把鑰匙,并保持鑰匙的秘密。非對(duì)稱密鑰加密系統(tǒng)采用的加密鑰匙(公鑰)和解密鑰匙(私鑰)是不同的。1.1 對(duì)稱加密算法對(duì)稱加密算法用來(lái)對(duì)敏感數(shù)據(jù)等信息進(jìn)行加密,常用的算法包括:DES(Data Encryption Standard):數(shù)據(jù)加密標(biāo)準(zhǔn),速度較快,適用于加密大量數(shù)據(jù)的場(chǎng)合。3DES(Triple DES):是基于DES,對(duì)一塊數(shù)據(jù)用三個(gè)不同的密鑰進(jìn)行三次加密

2、,強(qiáng)度更高。AES(Advanced Encryption Standard):高級(jí)加密標(biāo)準(zhǔn),是下一代的加密算法標(biāo)準(zhǔn),速度快,安全級(jí)別高; 1.2 對(duì)稱算法常見的非對(duì)稱加密算法如下:RSA:由 RSA 公司發(fā)明,是一個(gè)支持變長(zhǎng)密鑰的公共密鑰算法,需要加密的文件塊的長(zhǎng)度也是可變的;DSA(Digital Signature Algorithm):數(shù)字簽名算法,是一種標(biāo)準(zhǔn)的 DSS(數(shù)字簽名標(biāo)準(zhǔn));ECC(Elliptic Curves Cryptography):橢圓曲線密碼編碼學(xué)。1.3 加密算法的選擇前面簡(jiǎn)單介紹了各種對(duì)稱和非對(duì)稱加密算法,那我們?cè)趯?shí)際使用的過(guò)程中究竟該使用哪一種比較好呢?我

3、們應(yīng)該根據(jù)自己的使用特點(diǎn)來(lái)確定,由于非對(duì)稱加密算法的運(yùn)行速度比對(duì)稱加密算法的速度慢很多,當(dāng)我們需要加密大量的數(shù)據(jù)時(shí),建議采用對(duì)稱加密算法,提高加解密速度。對(duì)稱加密算法不能實(shí)現(xiàn)簽名,因此簽名只能非對(duì)稱算法。由于對(duì)稱加密算法的密鑰管理是一個(gè)復(fù)雜的過(guò)程,密鑰的管理直接決定著他的安全性,因此當(dāng)數(shù)據(jù)量很小時(shí),我們可以考慮采用非對(duì)稱加密算法。在實(shí)際的操作過(guò)程中,我們通常采用的方式是:采用非對(duì)稱加密算法管理對(duì)稱算法的密鑰,然后用對(duì)稱加密算法加密數(shù)據(jù),這樣我們就集成了兩類加密算法的優(yōu)點(diǎn),既實(shí)現(xiàn)了加密速度快的優(yōu)點(diǎn),又實(shí)現(xiàn)了安全方便管理密鑰的優(yōu)點(diǎn)。如果在選定了加密算法后,那采用多少位的密鑰呢?一般來(lái)說(shuō),密鑰越長(zhǎng),

4、運(yùn)行的速度就越慢,應(yīng)該根據(jù)的我們實(shí)際需要的安全級(jí)別來(lái)選擇,一般來(lái)說(shuō),RSA建議采用1024位的數(shù)字,ECC建議采用160位,AES采用128為即可。1.4 JAVA中的實(shí)現(xiàn)根據(jù)以上闡述說(shuō)明,對(duì)于要加密的數(shù)據(jù)量大時(shí),一般采用DESJAVA的實(shí)現(xiàn)過(guò)程.二、 java實(shí)現(xiàn)DES加密算法為了實(shí)現(xiàn)一對(duì)密鑰對(duì)整個(gè)項(xiàng)目所有加密解密文件都適用的方法,采用先生成一對(duì)密鑰.保存到xml文件中,以后獲得私匙和公鑰只需要從xml文件中取得就可以了./*/public static void saveDesKey()try SecureRandom sr = new SecureRandom();/為我們選擇的DES算

5、法生成一個(gè)KeyGenerator對(duì)象tance ("DES" );kg.init (sr);FileOutputStream fos = new FileOutputStream("C:/DesKey.xml"); ObjectOutputStream oos = new ObjectOutputStream(fos);/生成密鑰Key key = kg.generateKey(); oos.writeObject(key); oos.close(); catch (Exception e) e.printStackTrace();獲取密鑰方法如下:/

6、* 獲得DES加密的密鑰。在交易處理的過(guò)程中應(yīng)該定時(shí)更* 換密鑰。需要JCE的支持,如果jdk版本低于1.4,則需要* 安裝jce-1_2_2才能正常使用。 * return Key 返回對(duì)稱密鑰 */public static Key getKey() Key kp = null;try String fileName = "conf/DesKey.xml"InputStream is = DesUtil.class.getClassLoader().getResourceAsStream(fileName);ObjectInputStream oos = new Obj

7、ectInputStream(is);kp = (Key) oos.readObject();oos.close(); catch (Exception e) e.printStackTrace();return kp;文件采用DES算法加密文件/*  * 文件file進(jìn)行加密并保存目標(biāo)文件destFile中  * param file  *            要加密的文件 如  * param destFile  * &

8、#160;          加密后存放的文件名 如c:/加密后文件.txt  */public static void encrypt(String file, String destFile) throws Exception stance("DES");cipher.init(Cipher.ENCRYPT_MODE, getKey();InputStream is = new FileInputStream(file);OutputStream out = new Fi

9、leOutputStream(dest);CipherInputStream cis = new CipherInputStream(is, cipher);byte buffer = new byte1024;int r;while (r = cis.read(buffer) > 0) out.write(buffer, 0, r);cis.close();is.close();out.close();文件采用DES算法解密文件/*  * 文件file進(jìn)行加密并保存目標(biāo)文件destFile中  * param file  *  

10、0;         已加密的文件 如c:/加密后文件.txt  * param destFile  *            解密后存放的文件名 如c:/ test/解密后文件.txt  */public static void decrypt(String file, String dest) throws Exception e("DES");ciph

11、er.init(Cipher.DECRYPT_MODE, getKey();InputStream is = new FileInputStream(file);OutputStream out = new FileOutputStream(dest);CipherOutputStream cos = new CipherOutputStream(out, cipher);byte buffer = new byte1024;int r;while (r = is.read(buffer) >= 0) cos.write(buffer, 0, r);cos.close();out.clo

12、se();is.close(); 三、 java實(shí)現(xiàn)RSA加密算法同樣為了實(shí)現(xiàn)一對(duì)密鑰對(duì)整個(gè)項(xiàng)目所有加密解密文件都適用的方法,采用先生成一對(duì)密鑰.保存到xml文件中,以后獲得私匙和公鑰只需要從xml文件中取得就可以了.但實(shí)現(xiàn)方法不一樣了./* 把成生的一對(duì)密鑰保存到RSA*/public void saveRSAKey() try SecureRandom sr = new SecureRandom();KeyPairGenerator kg = KeyPairGenerator.getInstance("RSA",new org.bouncycastle.jce

13、.provider.BouncyCastleProvider();/注意密鑰大小最好為1024,否則解密會(huì)有亂碼情況.kg.initialize(1024, sr);FileOutputStream fos = new FileOutputStream("C:/RSAKey.xml");ObjectOutputStream oos = new ObjectOutputStream(fos);/生成密鑰oos.writeObject(kg.generateKeyPair();oos.close(); catch (Exception e) e.printStackTrace(

14、);注意:需要從下載包.獲取密鑰方法如下:/* 獲得RSA加密的密鑰。 * return KeyPair返回對(duì)稱密鑰 */public static KeyPair getKeyPair() /產(chǎn)生新密鑰對(duì)KeyPair kp;try String fileName = "conf/RASKey.xml"InputStream is = FileUtils.class.getClassLoader().getResourceAsStream(fileName);ObjectInputStream oos = new ObjectInputStream(is);kp = (K

15、eyPair) oos.readObject();oos.close(); catch (Exception e) throw new EprasRuntimeException("讀取加密文件出錯(cuò).", e);return kp;文件采用RSA算法加密文件/*  * 文件file進(jìn)行加密并保存目標(biāo)文件destFile中  * param srcFileName  *            要加密的文件 如  * param

16、destFileName  *            加密后存放的文件名 如c:/加密后文件.txt  */public static void encryptFile(String srcFileName,String destFileName) throws Exception OutputStream outputWriter = null;InputStream inputReader = null;try Cipher cipher = Cipher.ge

17、tInstance("RSA/ECB/PKCS1Padding",new vider.BouncyCastleProvider();byte buf = new byte100;int bufl;cipher.init(Cipher.ENCRYPT_MODE, getKeyPair().getPublic();outputWriter = new FileOutputStream(destFileName);inputReader = new FileInputStream(srcFileName);while (bufl =

18、 inputReader.read(buf) != -1) byte encText = null;byte newArr = null;if (buf.length = bufl) newArr = buf; else newArr = new bytebufl;for (int i = 0; i < bufl; i+) newArri = (byte) bufi;encText = cipher.doFinal(newArr);outputWriter.write(encText);outputWriter.flush(); catch (Exception e) throw e;

19、finally try if (outputWriter != null) outputWriter.close();if (inputReader != null) inputReader.close(); catch (Exception e) if (inputReader != null) inputReader.close(); catch (Exception e) 文件采用RSA算法解密文件/*  * 文件file進(jìn)行加密并保存目標(biāo)文件destFile中  * param srcFileName  *    &

20、#160;       已加密的文件 如c:/加密后文件.txt  * param destFileName  *            解密后存放的文件名 如c:/ test/解密后文件.txt  */public static void decryptFile(String srcFileName,String destFileName) throws Exception OutputStre

21、am outputWriter = null;InputStream inputReader = null;try Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding",new vider.BouncyCastleProvider();byte buf = new byte128;int bufl;cipher.init(Cipher.DECRYPT_MODE, getKeyPair().getPrivate();outputWriter = new FileOutputStream(destFileName);inputReader = new FileInputStream(srcF

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論