Java实现文件的RSA和DES加密算法

pub10 贡献于2012-10-16

作者 liujf  创建于2007-09-25 09:22:00   修改者liujf  修改于2007-09-25 09:22:00字数1450

文档摘要:基础知识根据密钥类型不同将现代密码技术分为两类:对称加密算法(秘密钥匙加密)和非对称加密算法(公开密钥加密)。对称钥匙加密系统是加密和解密均采用同一把秘密钥匙,而且通信双方都必须获得这把钥匙,并保持钥匙的秘密。非对称密钥加密系统采用的加密钥匙(公钥)和解密钥匙(私钥)是不同的。对称加密算法对称加密算法用来对敏感数据等信息进行加密,常用的算法包括:DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合。
关键词:

Java实现文件的RSA和DES加密算法 一、 基础知识 根据密钥类型不同将现代密码技术分为两类:对称加密算法(秘密钥匙加密)和非对称加密算法(公开密钥加密)。 对称钥匙加密系统是加密和解密均采用同一把秘密钥匙,而且通信双方都必须获得这把钥匙,并保持钥匙的秘密。 非对称密钥加密系统采用的加密钥匙(公钥)和解密钥匙(私钥)是不同的。 1.1 对称加密算法 对称加密算法用来对敏感数据等信息进行加密,常用的算法包括: DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合。 3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。 AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高; 1.2 对称算法 常见的非对称加密算法如下: RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的; DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准); ECC(Elliptic Curves Cryptography):椭圆曲线密码编码学。 1.3 加密算法的选择 前面简单介绍了各种对称和非对称加密算法,那我们在实际使用的过程中究竟该使用哪一种比较好呢? 我们应该根据自己的使用特点来确定,由于非对称加密算法的运行速度比对称加密算法的速度慢很多,当我们需要加密大量的数据时,建议采用对称加密算法,提高加解密速度。 对称加密算法不能实现签名,因此签名只能非对称算法。 由于对称加密算法的密钥管理是一个复杂的过程,密钥的管理直接决定着他的安全性,因此当数据量很小时,我们可以考虑采用非对称加密算法。 在实际的操作过程中,我们通常采用的方式是:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。 如果在选定了加密算法后,那采用多少位的密钥呢?一般来说,密钥越长,运行的速度就越慢,应该根据的我们实际需要的安全级别来选择,一般来说,RSA建议采用1024位的数字,ECC建议采用160位,AES采用128为即可。 1.4 JAVA中的实现 根据以上阐述说明,对于要加密的数据量大时,一般采用DES对称加密算法.对于需要实现签名的数据,则要采用RSA非对称加密算法.以下分别介绍这两种算法在JAVA的实现过程. 二、 java实现DES加密算法 为了实现一对密钥对整个项目所有加密解密文件都适用的方法,采用先生成一对密钥.保存到xml文件中,以后获得私匙和公钥只需要从xml文件中取得就可以了. /** * 把成生的一对密钥保存到DesKey.xml文件中 */ public static void saveDesKey(){ try { SecureRandom sr = new SecureRandom(); //为我们选择的DES算法生成一个KeyGenerator对象 KeyGenerator kg = KeyGenerator.getInstance ("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(); } } 获取密钥方法如下: /** * 获得DES加密的密钥。在交易处理的过程中应该定时更 * 换密钥。需要JCE的支持,如果jdk版本低于1.4,则需要 * 安装jce-1_2_2才能正常使用。 * @return Key 返回对称密钥 */ public static Key getKey() { Key kp = null; try { String fileName = "conf/DesKey.xml"; InputStream is = DesUtil.class.getClassLoader() .getResourceAsStream(fileName); ObjectInputStream oos = new ObjectInputStream(is); kp = (Key) oos.readObject(); oos.close(); } catch (Exception e) { e.printStackTrace(); } return kp; } 文件采用DES算法加密文件 /**   * 文件file进行加密并保存目标文件destFile中   * @param file   *            要加密的文件 如c:/test/srcFile.txt   * @param destFile   *            加密后存放的文件名 如c:/加密后文件.txt   */ public static void encrypt(String file, String destFile) throws Exception { Cipher cipher = Cipher.getInstance("DES"); cipher.init(Cipher.ENCRYPT_MODE, getKey()); InputStream is = new FileInputStream(file); OutputStream out = new FileOutputStream(dest); CipherInputStream cis = new CipherInputStream(is, cipher); byte[] buffer = new byte[1024]; int r; while ((r = cis.read(buffer)) > 0) { out.write(buffer, 0, r); } cis.close(); is.close(); out.close(); } 文件采用DES算法解密文件 /**   * 文件file进行加密并保存目标文件destFile中   * @param file   *            已加密的文件 如c:/加密后文件.txt   * @param destFile   *            解密后存放的文件名 如c:/ test/解密后文件.txt   */ public static void decrypt(String file, String dest) throws Exception { Cipher cipher = Cipher.getInstance("DES"); cipher.init(Cipher.DECRYPT_MODE, getKey()); InputStream is = new FileInputStream(file); OutputStream out = new FileOutputStream(dest); CipherOutputStream cos = new CipherOutputStream(out, cipher); byte[] buffer = new byte[1024]; int r; while ((r = is.read(buffer)) >= 0) { cos.write(buffer, 0, r); } cos.close(); out.close(); is.close(); }   三、 java实现RSA加密算法 同样为了实现一对密钥对整个项目所有加密解密文件都适用的方法,采用先生成一对密钥.保存到xml文件中,以后获得私匙和公钥只需要从xml文件中取得就可以了.但实现方法不一样了. /** * 把成生的一对密钥保存到RSAKey.xml文件中 */ public void saveRSAKey() { try { SecureRandom sr = new SecureRandom(); KeyPairGenerator kg = KeyPairGenerator.getInstance("RSA", new org.bouncycastle.jce.provider.BouncyCastleProvider()); //注意密钥大小最好为1024,否则解密会有乱码情况. 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(); } } 注意:需要从http://www.bouncycastle.org下载bcprov-jdk14-137.jar包. 获取密钥方法如下: /** * 获得RSA加密的密钥。 * @return KeyPair返回对称密钥 */ public static KeyPair getKeyPair() { //产生新密钥对 KeyPair kp; try { String fileName = "conf/RASKey.xml"; InputStream is = FileUtils.class.getClassLoader() .getResourceAsStream(fileName); ObjectInputStream oos = new ObjectInputStream(is); kp = (KeyPair) oos.readObject(); oos.close(); } catch (Exception e) { throw new EprasRuntimeException("读取加密文件出错.", e); } return kp; } 文件采用RSA算法加密文件 /**   * 文件file进行加密并保存目标文件destFile中   * @param srcFileName   *            要加密的文件 如c:/test/srcFile.txt   * @param destFileName   *            加密后存放的文件名 如c:/加密后文件.txt   */ public static void encryptFile(String srcFileName, String destFileName) throws Exception { OutputStream outputWriter = null; InputStream inputReader = null; try { Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", new org.bouncycastle.jce.provider.BouncyCastleProvider()); byte[] buf = new byte[100]; int bufl; cipher.init(Cipher.ENCRYPT_MODE, getKeyPair().getPublic()); outputWriter = new FileOutputStream(destFileName); inputReader = new FileInputStream(srcFileName); while ((bufl = inputReader.read(buf)) != -1) { byte[] encText = null; byte[] newArr = null; if (buf.length == bufl) { newArr = buf; } else { newArr = new byte[bufl]; for (int i = 0; i < bufl; i++) { newArr[i] = (byte) buf[i]; } } encText = cipher.doFinal(newArr); outputWriter.write(encText); } outputWriter.flush(); } catch (Exception e) { throw e; } 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进行加密并保存目标文件destFile中   * @param srcFileName   *            已加密的文件 如c:/加密后文件.txt   * @param destFileName   *            解密后存放的文件名 如c:/ test/解密后文件.txt   */ public static void decryptFile(String srcFileName, String destFileName) throws Exception { OutputStream outputWriter = null; InputStream inputReader = null; try { Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", new org.bouncycastle.jce.provider.BouncyCastleProvider()); byte[] buf = new byte[128]; int bufl; cipher.init(Cipher.DECRYPT_MODE, getKeyPair().getPrivate()); outputWriter = new FileOutputStream(destFileName); inputReader = new FileInputStream(srcFileName); while ((bufl = inputReader.read(buf)) != -1) { byte[] encText = null; byte[] newArr = null; if (buf.length == bufl) { newArr = buf; } else { newArr = new byte[bufl]; for (int i = 0; i < bufl; i++) { newArr[i] = (byte) buf[i]; } } encText = cipher.doFinal(newArr); outputWriter.write(encText); } outputWriter.flush(); } catch (Exception e) { throw e; } finally { try { if (outputWriter != null) { outputWriter.close(); } if (inputReader != null) { inputReader.close(); } } catch (Exception e) { } } } outputWriter.flush(); } catch (Exception e) { throw e; } finally { try { if (outputWriter != null) { outputWriter.close(); } if (inputReader != null) { inputReader.close(); } } catch (Exception e) { } } } 四、 总结 上述两种加密方法通过测试发现 如果对于大文件加密采用RSA算法执行速度要非常非常慢; 如果对加密文件密码安全性要求不高,可以采用DES算法,速度会有明显的提升.

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档