简单的文件加密程序JAVA 1

合集下载

java 密码加密解密方法

java 密码加密解密方法

java 密码加密解密方法在Java中,密码的加密和解密可以通过多种方式实现。

其中,常用的方法包括使用MessageDigest类进行加密,以及使用对称加密和非对称加密算法进行加密和解密。

一种常见的密码加密方法是使用MessageDigest类进行加密。

这可以通过以下步骤实现:首先,将密码转换为字节数组。

然后,使用MessageDigest类的getInstance方法获取特定的加密算法实例,例如SHA-256或MD5。

接下来,使用update方法将密码的字节数组传递给MessageDigest实例。

最后,使用digest方法获得加密后的字节数组,并将其转换为十六进制字符串或其他格式存储在数据库或其他地方。

另一种常见的方法是使用对称加密算法,例如AES或DES。

这些算法使用相同的密钥进行加密和解密。

在Java中,可以使用javax.crypto包中的类来实现对称加密。

通常,需要生成一个密钥并将其存储在安全的地方,然后使用该密钥对密码进行加密和解密。

此外,还可以使用非对称加密算法,例如RSA。

这种方法使用公钥对数据进行加密,然后使用私钥进行解密。

在Java中,可以使用java.security包中的类来实现非对称加密。

无论使用哪种方法,都需要注意密码安全的问题。

例如,密钥的安全存储和管理,以及密码传输过程中的安全性。

另外,还需要考虑密码的哈希加盐等技术来增加密码的安全性。

总之,在Java中实现密码的加密和解密有多种方法,开发人员可以根据实际需求和安全要求选择合适的加密算法和实现方式。

希望这些信息能够帮助你更好地理解Java中密码加密解密的方法。

使用Java实现安全性加密与解密

使用Java实现安全性加密与解密

使用Java实现安全性加密与解密在当今信息时代,数据的安全性越来越受到重视。

无论是个人的隐私信息还是企业的商业机密,都需要得到有效的保护。

而加密与解密技术就是一种常用的保护数据安全的手段。

本文将介绍如何使用Java语言实现安全性加密与解密。

1. 加密与解密的基本概念加密是将明文转换为密文的过程,而解密则是将密文转换回明文的过程。

加密算法通常使用一个密钥,密钥用于控制加密过程的转换规则,只有拥有正确的密钥才能进行解密。

常见的加密算法有对称加密算法和非对称加密算法。

对称加密算法使用相同的密钥进行加密和解密,速度较快,但密钥的传输和管理相对困难。

非对称加密算法使用一对密钥,公钥用于加密,私钥用于解密,安全性较高,但速度较慢。

2. 使用Java实现对称加密Java提供了多种对称加密算法的实现,如DES、AES等。

下面以AES算法为例,介绍如何使用Java实现对称加密。

首先,需要导入Java加密扩展(JCE)的包。

在Java 8及以上版本中,JCE已经被默认包含在JDK中,无需额外导入。

接下来,可以使用以下代码进行AES加密:```javaimport javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;public class AESUtil {private static final String ALGORITHM = "AES";public static String encrypt(String plainText, String key) throws Exception {KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);keyGenerator.init(128);SecretKey secretKey = keyGenerator.generateKey();byte[] enCodeFormat = secretKey.getEncoded();SecretKeySpec secretKeySpec = new SecretKeySpec(enCodeFormat, ALGORITHM);Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());return Base64.getEncoder().encodeToString(encryptedBytes);}public static String decrypt(String encryptedText, String key) throws Exception {KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);keyGenerator.init(128);SecretKey secretKey = keyGenerator.generateKey();byte[] enCodeFormat = secretKey.getEncoded();SecretKeySpec secretKeySpec = new SecretKeySpec(enCodeFormat, ALGORITHM);Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText);byte[] decryptedBytes = cipher.doFinal(encryptedBytes);return new String(decryptedBytes);}}```以上代码中,`encrypt`方法用于对明文进行加密,`decrypt`方法用于对密文进行解密。

JAVA实现AES的加密和解密算法

JAVA实现AES的加密和解密算法

JAVA实现AES的加密和解密算法AES(高级加密标准)是一种对称加密算法,可以通过Java的javax.crypto库来实现。

下面我们将介绍一种基于Java的AES加密和解密算法的实现方法。

1.导入所需的包在Java中使用AES加密和解密算法需要导入以下两个包:```import javax.crypto.Cipher;import javax.crypto.spec.SecretKeySpec;```2.创建加密和解密函数首先,我们需要创建加密函数和解密函数。

加密函数将输入的明文数据加密为密文,解密函数将输入的密文数据解密为明文。

```javaprivate static byte[] encrypt(byte[] key, byte[] data) throws ExceptionSecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);return cipher.doFinal(data);private static byte[] decrypt(byte[] key, byte[] encryptedData) throws ExceptionSecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);return cipher.doFinal(encryptedData);```3.测试加密和解密函数为了验证加密和解密函数的正确性,我们可以创建一个测试函数来测试它们。

如何利用java程序实现加密所需的公钥、密钥、数字证书

如何利用java程序实现加密所需的公钥、密钥、数字证书

如何利⽤java程序实现加密所需的公钥、密钥、数字证书本篇的主要⽬的在于实现pdf的数字签名问题,只是作为我学习知识的总结。

1、数字签名算法的概述数字签名:私钥⽤于签名,公钥⽤于验证。

数字签名的作⽤:验证数据的完整性,认证数据来源,抗否认。

数字签名实现的具体原理:1、将报⽂按双⽅约定的HASH算法计算得到⼀个固定位数的报⽂摘要。

在数学上保证,只要改动报⽂中任何⼀位,重新计算出的报⽂摘要值就会与原先的值不相符。

这样就保证了报⽂的不可更改性。

(详见参考资料的"公钥密码技术原理"章节)2、将该报⽂摘要值⽤发送者的私⼈密钥加密,然后连同原报⽂和数字证书(包含公钥)⼀起发送给接收者⽽产⽣的报⽂即称数字签名。

3、接收⽅收到数字签名后,⽤同样的HASH算法对报⽂计算摘要值,然后与⽤发送者的公开密钥进⾏解密解开的报⽂摘要值相⽐较,如相等则说明报⽂确实来⾃所称的发送者。

4、同时通过证书颁发机构CA确认证书的有效性即可确认发送的真实⾝份。

常⽤的数字签名有:RSA、DSA、ECDSA2、RSA算法概述RSA是⽬前为⽌应⽤最为⼴泛的⾮对称加密算法。

⾮对称加密算法简单的说就是分成公钥和私钥。

加密和解密采⽤不同的算法实现,这样的好处是不需要像传统对称加密算法⼀样将相同算法的密钥分发给对⽅,从⽽减少密钥被获取所带来的严重危害,⽬前基本上都是采⽤⾮对称算法,⽽RSA是最为⼴泛的。

理论上1024位以上的RSA是⽆法破解的(或者未公开)。

基本原理:⾮对称算法将密码将密码分为公钥和私钥,公钥发送给⽤户(可以是多个),⽤户⽤公钥加密想要发送的数据,然后发送给服务器,服务器通过私钥解密加密后的数据。

基本步骤:⽣成公钥和私钥步骤:1. 随机选择两个不相等的质数p和q2. 计算p和q的乘积n (n的长度就是密钥长度。

3233写成⼆进制是110010100001,⼀共有12位,所以这个密钥就是12位。

实际应⽤中,RSA密钥⼀般是1024位,重要场合则为2048位。

java 文件锁 用法

java 文件锁 用法

java 文件锁用法Java 文件锁(File Lock)的用法引言:在Java编程中,文件锁(File Lock)是一种机制,用于控制对文件的并发访问,以避免多个线程或进程同时对同一个文件进行读写操作而引发的数据竞争和不一致问题。

它可以确保在一个时间点只有一个线程或进程可以对文件进行访问,并且其他线程或进程需要等待直到文件被释放。

本文将介绍Java中文件锁的用法,包括文件锁的基本概念、实现文件锁的不同方法和如何正确使用文件锁来保护文件的并发访问。

一、文件锁的基本概念1. 文件锁的定义文件锁(File Lock)是一种独占锁(Exclusive Lock),它允许一个进程在同一时间内独占地对文件进行读写操作。

当一个进程获取了文件锁后,其他进程将无法获取该锁,直到文件锁被释放。

2. 文件锁的类型Java提供了两种类型的文件锁:共享锁(Shared Lock)和独占锁(Exclusive Lock)。

共享锁允许多个进程同时对文件进行读操作,但不允许写操作;独占锁则只允许一个进程对文件进行读写操作。

在实际应用中,可以根据需要选择使用适合的锁类型。

二、实现文件锁的不同方法1. 使用FileChannel实现文件锁Java的NIO(New IO)库提供了FileChannel类,该类可以用于实现文件锁。

通过FileChannel的lock方法可以获取文件的独占锁或共享锁,使用tryLock方法可以尝试获取锁并返回锁的状态。

示例代码:获取文件的FileChannel对象FileChannel channel = new RandomAccessFile("file.txt", "rw").getChannel();获取文件的独占锁FileLock lock = channel.lock();或者获取文件的共享锁FileLock lock = channel.lock(0, Long.MAX_VALUE, true);尝试获取文件的独占锁,并返回锁的状态FileLock lock = channel.tryLock();2. 使用FileLock接口实现文件锁Java的NIO库还提供了FileLock接口,通过该接口可以实现对文件的锁定和解锁操作。

java 加密解密简单实现

java 加密解密简单实现

java 加密解密简单实现加密算法有很多种:这里只大约列举几例:1:消息摘要:(数字指纹):既对一个任意长度的一个数据块进行计算,产生一个唯一指纹。

MD5/SHA1发送给其他人你的信息和摘要,其他人用相同的加密方法得到摘要,最后进行比较摘要是否相同。

2:单匙密码体制:DES:比较简便高效,密钥简短,加解密速度快,破译极其困难,但其安全性依赖于密匙的安全性。

DES(Data Encryption Standard)是发明最早的最广泛使用的分组对称加密算法。

DES算法的入口参数有三个:Key、Data、Mode。

其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密3:数字签名:就是信息发送者用其私钥对从所传报文中提取出的特征数据(或称数字指纹)进行RSA算法操作,以保证发信人无法抵赖曾发过该信息(即不可抵赖性),同时也确保信息报文在经签名后末被篡改(即完整性)。

当信息接收者收到报文后,就可以用发送者的公钥对数字签名进行验证。

代表:DSA4:非对称密匙密码体制(公匙体系):加密密匙不同于解密密匙,加密密匙公之于众,谁都可以使用,解密密匙只有解密人自己知道。

代表:RSA下面是对上面几个例子进行的简单实现:Java代码1.package test;2.import java.io.FileInputStream;3.import java.io.FileOutputStream;4.import java.io.IOException;5.import java.io.ObjectInputStream;6.import java.io.ObjectOutputStream;7.import java.security.*;8.import javax.crypto.Cipher;9.import javax.crypto.KeyGenerator;10.import javax.crypto.SecretKey;11./**12. * 加密解密13. *14. * @author shy.qiu15. * @since /qiushyfm16. */17.public class CryptTest {18. /**19. * 进行MD5加密20. *21. * @param info22. * 要加密的信息23. * @return String 加密后的字符串24. */25. public String encryptToMD5(String info) {26. byte[] digesta = null;27. try {28. // 得到一个md5的消息摘要29. MessageDigest alga = MessageDigest.getInstance("MD5");30. // 添加要进行计算摘要的信息31. alga.update(info.getBytes());32. // 得到该摘要33. digesta = alga.digest();34. } catch (NoSuchAlgorithmException e) {35. e.printStackTrace();36. }37. // 将摘要转为字符串38. String rs = byte2hex(digesta);39. return rs;40. }41. /**42. * 进行SHA加密43. *44. * @param info45. * 要加密的信息46. * @return String 加密后的字符串47. */48. public String encryptToSHA(String info) {49. byte[] digesta = null;50. try {51. // 得到一个SHA-1的消息摘要52. MessageDigest alga = MessageDigest.getInstance("SHA-1");53. // 添加要进行计算摘要的信息54. alga.update(info.getBytes());55. // 得到该摘要56. digesta = alga.digest();57. } catch (NoSuchAlgorithmException e) {58. e.printStackTrace();59. }60. // 将摘要转为字符串61. String rs = byte2hex(digesta);62. return rs;63. }64. // //////////////////////////////////////////////////////////////////////////65. /**66. * 创建密匙67. *68. * @param algorithm69. * 加密算法,可用 DES,DESede,Blowfish70. * @return SecretKey 秘密(对称)密钥71. */72. public SecretKey createSecretKey(String algorithm) {73. // 声明KeyGenerator对象74. KeyGenerator keygen;75. // 声明密钥对象76. SecretKey deskey = null;77. try {78. // 返回生成指定算法的秘密密钥的 KeyGenerator 对象79. keygen = KeyGenerator.getInstance(algorithm);80. // 生成一个密钥81. deskey = keygen.generateKey();82. } catch (NoSuchAlgorithmException e) {83. e.printStackTrace();84. }85. // 返回密匙86. return deskey;87. }88. /**89. * 根据密匙进行DES加密90. *91. * @param key92. * 密匙93. * @param info94. * 要加密的信息95. * @return String 加密后的信息96. */97. public String encryptToDES(SecretKey key, String info) {98. // 定义加密算法,可用 DES,DESede,Blowfish99. String Algorithm = "DES";100. // 加密随机数生成器 (RNG),(可以不写)101. SecureRandom sr = new SecureRandom();102. // 定义要生成的密文103. byte[] cipherByte = null;104. try {105. // 得到加密/解密器106. Cipher c1 = Cipher.getInstance(Algorithm); 107. // 用指定的密钥和模式初始化Cipher对象108. // 参数:(ENCRYPT_MODE, DECRYPT_MODE, WRAP_MODE,UNWRAP_MODE) 109. c1.init(Cipher.ENCRYPT_MODE, key, sr); 110. // 对要加密的内容进行编码处理,111. cipherByte = c1.doFinal(info.getBytes()); 112. } catch (Exception e) {113. e.printStackTrace();114. }115. // 返回密文的十六进制形式116. return byte2hex(cipherByte);117. }118. /**119. * 根据密匙进行DES解密120. *121. * @param key122. * 密匙123. * @param sInfo124. * 要解密的密文125. * @return String 返回解密后信息126. */127. public String decryptByDES(SecretKey key, String sInfo ) {128. // 定义加密算法,129. String Algorithm = "DES";130. // 加密随机数生成器 (RNG)131. SecureRandom sr = new SecureRandom();132. byte[] cipherByte = null;133. try {134. // 得到加密/解密器135. Cipher c1 = Cipher.getInstance(Algorithm); 136. // 用指定的密钥和模式初始化Cipher对象137. c1.init(Cipher.DECRYPT_MODE, key, sr); 138. // 对要解密的内容进行编码处理139. cipherByte = c1.doFinal(hex2byte(sInfo)); 140. } catch (Exception e) {141. e.printStackTrace();142. }143. // return byte2hex(cipherByte);144. return new String(cipherByte);145. }146. // /////////////////////////////////////////////////// //////////////////////////147. /**148. * 创建密匙组,并将公匙,私匙放入到指定文件中149. *150. * 默认放入mykeys.bat文件中151. */152. public void createPairKey() {153. try {154. // 根据特定的算法一个密钥对生成器155. KeyPairGenerator keygen = KeyPairGenerator.get Instance("DSA");156. // 加密随机数生成器 (RNG)157. SecureRandom random = new SecureRandom(); 158. // 重新设置此随机对象的种子159. random.setSeed(1000);160. // 使用给定的随机源(和默认的参数集合)初始化确定密钥大小的密钥对生成器161. keygen.initialize(512, random);// keygen.initi alize(512);162. // 生成密钥组163. KeyPair keys = keygen.generateKeyPair(); 164. // 得到公匙165. PublicKey pubkey = keys.getPublic();166. // 得到私匙167. PrivateKey prikey = keys.getPrivate(); 168. // 将公匙私匙写入到文件当中169. doObjToFile("mykeys.bat", new Object[] { prike y, pubkey });170. } catch (NoSuchAlgorithmException e) {171. e.printStackTrace();172. }173. }174. /**175. * 利用私匙对信息进行签名把签名后的信息放入到指定的文件中176. *177. * @param info178. * 要签名的信息179. * @param signfile180. * 存入的文件181. */182. public void signToInfo(String info, String signfile) {183. // 从文件当中读取私匙184. PrivateKey myprikey = (PrivateKey) getObjFromFile( "mykeys.bat", 1);185. // 从文件中读取公匙186. PublicKey mypubkey = (PublicKey) getObjFromFile("m ykeys.bat", 2);187. try {188. // Signature 对象可用来生成和验证数字签名189. Signature signet = Signature.getInstance("DSA");190. // 初始化签署签名的私钥191. signet.initSign(myprikey);192. // 更新要由字节签名或验证的数据193. signet.update(info.getBytes());194. // 签署或验证所有更新字节的签名,返回签名195. byte[] signed = signet.sign();196. // 将数字签名,公匙,信息放入文件中197. doObjToFile(signfile, new Object[] { signed, m ypubkey, info });198. } catch (Exception e) {199. e.printStackTrace();200. }201. }202. /**203. * 读取数字签名文件根据公匙,签名,信息验证信息的合法性204. *205. * @return true 验证成功 false 验证失败206. */207. public boolean validateSign(String signfile) { 208. // 读取公匙209. PublicKey mypubkey = (PublicKey) getObjFromFile(si gnfile, 2);210. // 读取签名211. byte[] signed = (byte[]) getObjFromFile(signfile,1);212. // 读取信息213. String info = (String) getObjFromFile(signfile, 3) ;214. try {215. // 初始一个Signature对象,并用公钥和签名进行验证216. Signature signetcheck = Signature.getInstance( "DSA");217. // 初始化验证签名的公钥218. signetcheck.initVerify(mypubkey);219. // 使用指定的 byte 数组更新要签名或验证的数据220. signetcheck.update(info.getBytes());221. System.out.println(info);222. // 验证传入的签名223. return signetcheck.verify(signed);224. } catch (Exception e) {225. e.printStackTrace();226. return false;227. }228. }229. /**230. * 将二进制转化为16进制字符串231. *232. * @param b233. * 二进制字节数组234. * @return String235. */236. public String byte2hex(byte[] b) {237. String hs = "";238. String stmp = "";239. for (int n = 0; n < b.length; n++) {240. stmp = (ng.Integer.toHexString(b[n] & 0 XFF));241. if (stmp.length() == 1) {242. hs = hs + "0" + stmp;243. } else {244. hs = hs + stmp;245. }246. }247. return hs.toUpperCase();248. }249. /**250. * 十六进制字符串转化为2进制251. *252. * @param hex253. * @return254. */255. public byte[] hex2byte(String hex) {256. byte[] ret = new byte[8];257. byte[] tmp = hex.getBytes();258. for (int i = 0; i < 8; i++) {259. ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1] );260. }261. return ret;262. }263. /**264. * 将两个ASCII字符合成一个字节;如:"EF"--> 0xEF 265. *266. * @param src0267. * byte268. * @param src1269. * byte270. * @return byte271. */272. public static byte uniteBytes(byte src0, byte src1) {273. byte _b0 = Byte.decode("0x" + new String(new byte[ ] { src0 }))274. .byteValue();275. _b0 = (byte) (_b0 << 4);276. byte _b1 = Byte.decode("0x" + new String(new byte[ ] { src1 }))277. .byteValue();278. byte ret = (byte) (_b0 ^ _b1);279. return ret;280. }281. /**282. * 将指定的对象写入指定的文件283. *284. * @param file285. * 指定写入的文件286. * @param objs287. * 要写入的对象288. */289. public void doObjToFile(String file, Object[] objs) {290. ObjectOutputStream oos = null;291. try {292. FileOutputStream fos = new FileOutputStream(fi le);293. oos = new ObjectOutputStream(fos);294. for (int i = 0; i < objs.length; i++) { 295. oos.writeObject(objs[i]);296. }297. } catch (Exception e) {298. e.printStackTrace();299. } finally {300. try {301. oos.close();302. } catch (IOException e) {303. e.printStackTrace();304. }305. }306. }307. /**308. * 返回在文件中指定位置的对象309. *310. * @param file311. * 指定的文件312. * @param i313. * 从1开始314. * @return315. */316. public Object getObjFromFile(String file, int i) { 317. ObjectInputStream ois = null;318. Object obj = null;319. try {320. FileInputStream fis = new FileInputStream(file );321. ois = new ObjectInputStream(fis);322. for (int j = 0; j < i; j++) {323. obj = ois.readObject();324. }325. } catch (Exception e) {326. e.printStackTrace();327. } finally {328. try {329. ois.close();330. } catch (IOException e) {331. e.printStackTrace();332. }333. }334. return obj;335. }336. /**337. * 测试338. *339. * @param args340. */341. public static void main(String[] args) {342. CryptTest jiami = new CryptTest();343. // 执行MD5加密"Hello world!"344. System.out.println("Hello经过MD5:" + jiami.encryptToMD5("Hello"));345. // 生成一个DES算法的密匙346. SecretKey key = jiami.createSecretKey("DES"); 347. // 用密匙加密信息"Hello world!"348. String str1 = jiami.encryptToDES(key, "Hello"); 349. System.out.println("使用des加密信息Hello 为:" + str1);350. // 使用这个密匙解密351. String str2 = jiami.decryptByDES(key, str1); 352. System.out.println("解密后为:" + str2);353. // 创建公匙和私匙354. jiami.createPairKey();355. // 对Hello world!使用私匙进行签名356. jiami.signToInfo("Hello", "mysign.bat");357. // 利用公匙对签名进行验证。

Java 加密、解密Word文档

Java 加密、解密Word文档

Java加密、解密Word文档对一些重要文档,我们为保证其文档内容不被泄露,常需要对文件进行加密,查看文件时,需要正确输入密码才能打开文件。

下面介绍了一种比较简单的方法给Word文件添加密码保护以及如何给已加密的Word文件取消密码保护。

使用工具:Free Spire.Doc for Java 2.0.0(免费版)Jar文件导入:方法1:通过官网下载控件包。

在程序下新建一个directory目录,并命名(本示例中命名为lib);将控件包lib文件夹下的jar(如下图1)复制到程序中新建的目录下。

复制jar文件后,鼠标右键点击jar文件,选择”Add as Library”。

完成导入(如下图2)。

图1:图2:方法2:通过maven导入。

参考导入方法。

Java代码示例【示例1】设置Word密码保护import com.spire.doc.*;public class Encrypt {public static void main(String[] args){//加载测试文档String input = "test.docx";String output= "result.docx";Document doc = new Document(input);//调用方法加密文档doc.encrypt("123");//保存加密后的文档doc.saveToFile(output);}}文件加密结果:【示例2】取消Word密码保护import com.spire.doc.*;public class Decrypt {public static void main(String[] args){//加载带密码的文件,输入原密码并解除Document doc = new Document();doc.loadFromFile("result.docx",FileFormat.Docx_2013,"123");//将解密后的文档另存doc.saveToFile("Decrypt.docx",FileFormat.Docx_2013);}}运行程序后,生成的文件将不再有密码保护。

加密Java源代码

加密Java源代码

Java语言是一种非常适用于网络编程的语言,它的基本结构与C++极为相似,但抛弃了C/C++中指针等内容,同时它吸收了Smalltalk、C++面向对象的编程思想。

它具有简单性、鲁棒性、可移植性、动态性等特点。

这些特点使得Java成为跨平台应用开发的一种规范,在世界范围内广泛流传。

加密Java源码的原因Java源代码经过编译以后在JVM中执行。

由于JVM界面是完全透明的,Java类文件能够很容易通过反编译器重新转换成源代码。

因此,所有的算法、类文件等都可以以源代码的形式被公开,使得软件不能受到保护,为了保护产权,一般可以有以下几种方法:(1)"模糊"类文件,加大反编译器反编译源代码文件的难度。

然而,可以修改反编译器,使之能够处理这些模糊类文件。

所以仅仅依赖"模糊类文件"来保证代码的安全是不够的。

(2)流行的加密工具对源文件进行加密,比如PGP(Pretty Good Privacy)或GPG(GNU Privacy Guard)。

这时,最终用户在运行应用之前必须先进行解密。

但解密之后,最终用户就有了一份不加密的类文件,这和事先不进行加密没有什么差别。

(3)加密类文件,在运行中JVM用定制的类装载器(Class Loader)解密类文件。

Java 运行时装入字节码的机制隐含地意味着可以对字节码进行修改。

JVM每次装入类文件时都需要一个称为ClassLoader的对象,这个对象负责把新的类装入正在运行的JVM。

JVM给ClassLoader一个包含了待装入类(例如ng.Object)名字的字符串,然后由ClassLoader负责找到类文件,装入原始数据,并把它转换成一个Class对象。

用户下载的是加密过的类文件,在加密类文件装入之时进行解密,因此可以看成是一种即时解密器。

由于解密后的字节码文件永远不会保存到文件系统,所以窃密者很难得到解密后的代码。

由于把原始字节码转换成Class对象的过程完全由系统负责,所以创建定制ClassLoader 对象其实并不困难,只需先获得原始数据,接着就可以进行包含解密在内的任何转换。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如图一,运行后出现程序界面。
5
图二,选择待加密的文件
图三,输入你的密码或者随机产生
图四,加密成功并 6
生成文件
图五,解密成功
5.1 关于对程序编写的心得 这个程序看起来挺简单的,但对于对 java 语言还是初学者的我,还是显得
有些难度的。 在编写的过程中,由于粗心经常出现一些比较简单的错误,比 如遗漏逗号、双引号、小括号,以及项目名称,从而导致出现乱码。我是使用 的 My Eclipse5.0 编辑器下编写调试的,通过几次摸索学习对这个软件的使用 方法逐渐熟练起来,我以前学过《Java 面向对象基础设计》这个课程,当时只 是懵懵懂懂的了解一些,知道了什么是多态什么是继承,接口,api 之类的。 这次课程设计我觉得可以试试 java 语言水平了,非常感谢这个课程设计,它能 够把我们所学到的《网络信息安全》这门课和所学的语言深入的结合,在实践 中理解了安全的原理以及 java 代码的实现。有时候会遇到一些错误但不知道错 在哪,更不知道怎么解决;看着有错的程序,不知该如何改起!但是,通过上 网查询还有在老师、同学的帮助下,我最终还是完成了程序的编写。
2
2.2 关于 DES 算法的介绍:
DES 算法是美国国家标准局在 1973 年开始研究除国防部门外的计算机系统 的数据加密标准;于 1973 年 5 月 15 日和 1974 年 8 月 27 日先后两次向公众真 征求加密算法公告。加密算法要达到的目的主要是以下四点:
1. 提供高质量的数据保护,防止数据未经授权的泄露和未被察觉的修改;
文件选择类 系

密码随机产生



加密类

解密类
I/O 方法对象 Random 方法 DES 加密/解密 事件监听器/响应器 Java 中各种 api 方法
3.2 主函数流程图
在 java 主函数中,通过调用一个类中的方法来实现调用各个类方法,体现了 java 语言的简洁性和高效性。
Public static void Main 主方法
FileEncrypter 方法 show();
java.awt.
Container
ActionList
图形化3.界3 内部函数e流ne程r 图监听


File 文件 操作方法 类
IO 读写方 法类
3.3 内部函数流程图 开始
4
输入加密 DES 方法加密 生成指定后缀名的加密文件
是否继续加 密? 是
河南理工大学 计算机科学与技术学院
课程设计报告
2014— 2015 学年第一学期
课程名称 网络安全 设计题目 实现加解密程序 姓 名 _____________ 学 号 __________ 专业班级 网络 1203 _ 指导教师 ________
2014 年 12 月 29 日
0


1.1 设计目的 ------------------------------------------------------------------------- 2 1.2 设计要求 ----------------------------------------------------------------------- 2 2.1 设计前提 ------------------------------------------------------------------------- 2 2.2 关于 DES 算法的介绍 ------------------------------------------------------------- 3 2.3DES 算法原理 ---------------------------------------------------------------------3 2.4 功能需求----------------------------------------------------------------------------3 3.1 系统模块图-------------------------------------------------------------------------4 3.2 主函数流程图-----------------------------------------------------------------------4 3.3 内部函数流程图 -----------------------------------------------------------------5 4.1 程序使用运行 ------------------------------------------------------------------5 5.1 关于对程序编写的心得-------------------------------------------------------------7 6.1 参考文献 ----------------------------------------------------------------------------8
6. 强化上机动手编程能力,闯过理论与实践相结合的难关!
1.2 设计要求
1. 分析课程设计题目的要求,根据所要求的程序功能,画出程序的流程图。
2. 对系统功能模块进行分析,写出详细设计说明文档。
3. 对程序源代码进行调试与测试,使其能正确运行。
4. 设计完成的软件要便于操作和使用。
5. 设计完成后提交课程设计报告。
public static final int WIDTH = 550; public static final int HEIGHT = 200; public static void main(String args[]) {
FileEncrypter fe = new FileEncrypter(); fe.show();} FileEncrypter() { this.setSize(WIDTH, HEIGHT); this.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); this.setResizable(false); this.setTitle("文件加密器(TriDES)"); java.awt.Container c = this.getContentPane(); c.setLayout(new FlowLayout()); final FilePanel fp = new FilePanel("文件选择"); c.add(fp);
简单地说,算法只不过是加密的两个技术---混乱和扩散的组合。DES 基 本组件分组是这些技术的一个组合。它基于密钥作用于明文,这就是众所 周知的轮。DES 有十六轮,这意味着在明文分组上 16 次实施相同的组合技 术。
DES 对 64bit 的明文分组进行操作。通过一个初始置换,将明文分为左 半部分和右半部分,各长 32bit 然后进行 16 轮完全相同的迭代,在迭代过 程中数据与密钥结合。经过 16 轮后,左右部分合在一起经过一个置换,该 算法就完成了。
2.3.DES 算法工作原理
DES 算法是这样工作的:如 Mode 为加密,则用 Key 去把数据 Date 进行 加密,生成 Date 的密码形式作为 DES 的输入结果;如果 Mode 为解密,则 用 Key 去把密码形式的数据 Date 解密,还原为 Date 的明码形式作为输出 结果。在通信网络的两端,双方约定一致的 Key,在通信的源点用 Key 对核 心数据进行加密,然后以密码形式在公共通信网中传输到通信网络的终点, 数据到达目的地后用同样的 Key 进行解密;再现了核心数据。保证了核心 数据的安全传输。
经过一个周的网络安全课程设计,我认识到编程是一项很慎密的工作,来不 得一点马虎,否则就会给编程工作带来很多不必要的麻烦。 这次的课程设计加
7
深了我对 java 语言的理解,也了解了加密算法的一些原理和使用方法。并且提 高了我查阅相关参考资料和独立分析解决问题以及自己上机动手的能力。 课 程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知 识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。应实际,实 践编程的能力。 6.1 参考文件: 《网络信息安全》 安葳鹏 刘沛骞 主编 《Java 基础程序设计》 吴正江 主编 百科否是否解 密?

是 结束
输入解密码 DES 方法解密 删除制定后后缀名文件
4.1.程序使用运行
当把代码编译好之后,点击运行,系统会弹出如下图界面,然后根据说明就可 以实现对指定的文件进行加密了,加密的过程中可以选择任何类型的文件进行 加密,既然是加密那么就必须输入加密密码,该加密密码我们设置成 48 位的了, 数字大写英文字母混合的类型;用户也可以自行的输入自己的密码,记住就可 以。然后运行加密,这时会在这个文件夹下生成一个后缀名为.tdes 文件;那 么这就是你加密后的文件。要解密的话只需要选中改后缀名的文件输入密码解 密即可。
本课程设计的目标:
1. 巩固《Java 面向对象程序设计》课程学习的内容和加深学生对基本知识 的理解和掌握。同时加深对《网络信息安全》中的密码技术有了更深得理 解。
2. 掌握编程和程序调试的基本技能。
3. 掌握软件设计的方法。
4. 提高运用程序设计解决实际问题的能力。
5. 培养独立思考、 综合运用所学有关相应知识的能力。
DES 的算法特点:分组比较短,密钥太短,密码生命周期短,运算速度 慢。
2.4 功能需求
1.首先是能够有可视化的图形化界面。
2.能够查看选择本地文件。
3.能够随机产生大于等于 48 位的随机密码。用户自行输入也可以。
3
4.能够将加密后的文件更改后缀名生成到当前文件夹中。 5.能够解密曾经加密后的文件。 3.1 系统模块图
相关文档
最新文档