简单的文件加密程序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 对象其实并不困难,只需先获得原始数据,接着就可以进行包含解密在内的任何转换。

java中常用的zip加密方法

java中常用的zip加密方法

文稿:标题:深度探讨Java中常用的Zip加密方法在日常编程开发中,我们经常会遇到对文件进行压缩和加密的需求。

而在Java中,Zip是一种常用的文件压缩格式,而对Zip文件进行加密也是经常需求之一。

本文将从简单到复杂,由浅入深地探讨Java中常用的Zip加密方法,以帮助您全面理解和灵活运用这一技术。

一、基本概念:Zip文件和加密方法在谈论Zip加密方法之前,我们首先来了解一下Zip文件的基本概念以及加密方法的原理。

Zip文件是一种常见的文件压缩格式,它能将多个文件或文件夹打包成一个文件,以减小文件大小,便于传输和存储。

而加密则是通过对文件内容进行转换或者使用密码算法,以使文件内容对他人不可读或不可用。

二、Zip加密的基本用法在Java中,可以使用`java.util.zip`包中的`ZipOutputStream`和`ZipEntry`类来对文件进行压缩,同时也可以通过密码来对Zip文件进行加密和解密。

通过简单的示例代码,我们可以很容易地了解到如何使用Java对Zip文件进行加密和解密的基本用法。

三、常见的Zip加密方法除了基本用法之外,Java中还提供了一些常见的Zip加密方法,如使用密码对Zip文件进行加密、使用AES算法对Zip文件进行加密等。

这些方法各自有着不同的特点和适用场景,我们可以根据需求选择最合适的方法来进行实现。

四、实践操作:示例演练在本节中,我们将结合实际的示例演练来对之前所学习到的Zip加密方法进行实际操作。

通过实际的演练,我们可以更加深入地理解和掌握这些方法的具体细节和注意事项。

五、个人观点和总结在本节中,我将共享我的个人观点和理解,以及对Zip加密方法在实际开发中的应用和注意事项进行总结和回顾。

通过对Zip加密方法的全面评估和实际应用,我们可以更好地掌握这一技术,并在实际项目中灵活运用。

结语通过本文的深度探讨和示例演练,我相信您已经对Java中常用的Zip 加密方法有了更深入的理解和掌握。

jdk filelock 文件锁实现原理

jdk filelock 文件锁实现原理

文件锁(FileLock)是Java Development Kit(JDK)中用于实现文件加锁的机制,主要用于控制对文件的读写操作,确保并发访问时不会出现数据不一致或损坏的情况。

文件锁能够确保在多线程或多进程同时访问同一个文件时,只有一个线程或进程能够获得锁,其他线程或进程必须等待。

文件锁实现原理主要涉及文件系统和操作系统的相关知识,通过对文件的底层控制实现锁定和释放的操作。

下面就文件锁的实现原理进行详细介绍。

一、文件锁的类型文件锁主要分为独占锁(Exclusive Lock)和共享锁(Shared Lock)两种类型:1. 独占锁:当一个线程或进程获得了独占锁之后,其他线程或进程将无法获得该文件的任何锁,即无法读取或写入该文件。

2. 共享锁:当一个线程或进程获得了共享锁之后,其他线程或进程依然可以获得该文件的共享锁,但无法获得独占锁。

二、文件锁的实现原理文件锁的实现原理主要依赖于操作系统和文件系统的支持,下面分别介绍在Windows和Unix/Linux系统下文件锁的实现原理。

1. Windows系统下的文件锁实现原理在Windows系统中,文件锁的实现主要依赖于CreateFile函数和LockFileEx函数。

当一个进程打开一个文件并请求对其进行锁定时,系统会在文件的File Control Block(FCB)中记录锁定信息,包括锁定起始位置、锁定长度、锁定类型等。

当其他进程也请求对该文件进行锁定时,系统会根据文件的锁定信息判断是否允许锁定,如果其他进程已经获得了独占锁或部分共享锁,则该请求将被阻塞,直到前一个锁定释放。

2. Unix/Linux系统下的文件锁实现原理在Unix/Linux系统中,文件锁的实现主要依赖于tl函数和flock函数。

通过tl函数可以对文件进行分区锁定,可以指定锁定的起始位置和长度,以及锁定类型(共享锁或独占锁)。

而flock函数则是一种简化的文件锁定机制,它可以对整个文件进行独占或共享锁定,但不能指定锁定的精确位置和长度。

Java使用数字证书加密文件(含代码)

Java使用数字证书加密文件(含代码)

JA V A 使用数字证书加密解密文件总结目录1.编写目的 (3)2.JA V A生产数字证书 (4)2.1.1 keystore(JKS) 的生成 (4)2.1.2 导出公钥 (5)3.使用JKS私钥加密文件 (5)4.转换为PFX格式私钥 (6)5.使用PFX加密文件 (7)6 源代码 (8)6.1 用到的JAR包 (8)6.2 示例代码 (8)6.2.1 Test.java (8)6.2.2 RsaUtil.java (10)6.2.3 Base64.java (19)7.结束语 (26)1.编写目的学习RSA算法,读取数字证书中的私钥对文件进行加密,使用数字证书的公钥解密,这种方式就是RSA算法.自己对RSA算法的理解:⏹私钥加密公钥解密:如果用私钥对文件加密,发给别人,别人用我公布的公钥进行解密,实现这个文件就是我本人制作的,不是别人做的.⏹公钥加密私钥解密:如果别人用我的公钥加密文件,那么只能我一个人看,只有使用我的私钥进行解密,私钥一定是不能告诉其他人的.本文讲解如何用JKS私钥对文件进行加密,用对于CRT公钥进行解密,将JKS私钥转换为PFX格式私钥,并用PFX私钥对文件进行加密解密Jks:是JA V A的keytools证书工具支持的证书私钥格式pfx:是微软支持的私钥格式⏹2.JAVA生产数字证书为了实现数字证书加密文件,我们首先要制作几个数字证书,如果你已经有了pfx格式的数字证书并且知道其密码,以及对应crt或者cer格式的公钥证书则跳过本章.2.1 keytool 创建数字证书Keytool是一个Java数据证书的管理工具,Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中在keystore里,包含两种数据:⏹密钥实体(Key entity):密钥(secret key)又或者是私钥⏹配对公钥(采用非对称加密):可信任的证书实体(trusted certificate entries),只包含公钥2.1.1 keystore(JKS) 的生成●分阶段生成:命令格式:keytool -genkey -alias yushan(别名) -keypass yushan(别名密码) -keyalg RSA(算法) -keysize 1024(密钥长度) -validity 365(有效期,天单位) -keystore e:\yushan.keystore(指定生成证书的位置和证书名称) -storepass 123456(获取keystore信息的密码);示例:1)cmd下进入java/bin2)输入命令keytool -genkey -alias myalias-keypass 123456-keyalg RSA-keysize 1024 -validity 365 -keystore d: \myalias.keystore -storepass 123456●一次性生成:keytool -genkey -alias yushan -keypass yushan -keyalg RSA -keysize 1024 -validity 365 -keystore e:\yushan.keystore -storepass 123456 -dname "CN=(名字与姓氏), OU=(组织单位名称), O=(组织名称), L=(城市或区域名称), ST=(州或省份名称), C=(单位的两字母国家代码)";(中英文即可)无例图2.1.2 导出公钥命令:keytool -export -alias myalias -keystore d:\myalias.keystore -file d:\myalias.crt -storepass 123456创建结果:3.使用JKS私钥加密文件//工具类RSAUtil rsa = new RSAUtil();//从jks私钥中获取私钥加密串PrivateKey priKeyFromKs = rsa.getPriKeyFromKS("d:\\myalias.keystore","123456", "myalias", "123456");//从jks私钥中获取公钥解密串PublicKey pubKeyFromKS = rsa.getPubKeyFromKS("d:\\myalias.keystore", "123456", "myalias");//从crt公钥中获取公钥解密串PublicKey pubKeyFromCrt = rsa.getPubKeyFromCRT("d:\\myalias.crt");//用私钥串加密rsa.encryptWithPrv("d:\\file.xml",priKeyFromKs,"d:\\file_encWithKSPri.xml", true);//用jks公钥串解密rsa.decryptWithPub("d:\\file_encWithKSPri.xml", pubKeyFromKS, true,"d:\\file_encWithKSPri_decKs.xml");//用crt公钥串解密rsa.decryptWithPub("d:\\file_encWithKSPri.xml", pubKeyFromCrt, true, "d:\\file_encWithKSPri_decCrt.xml");4.转换为PFX格式私钥如果你已经有了pfx格式的数字证书并且知道其密码,以及对应crt或者cer格式的公钥证书则跳过本章.4.1 转换工具转换工具我使用的是kestore-export下载kestore-export.rar 请百度搜索,我也会往CSDN上上传,请直接搜索kestore-export.rar。

基于Misty1算法的加密软件(JAVA)的实现-JAVA毕业设计论文

基于Misty1算法的加密软件(JAVA)的实现-JAVA毕业设计论文

学位论文基于Misty1算法的加密软件(Java)的实现论文作者姓名:XXX申请学位专业:申请学位类别:论文提交日期:XXXX年XX月XX日基于Misty1算法的加密软件(Java)的实现摘要随着计算机网络及通信技术的飞速发展,信息安全成了信息社会急需解决的最重要的问题之一,密码技术是保证信息安全的核心技术。

本文用JA V A语言开发了一个基于Misty1算法的加密软件,该软件能对文件进行加密和解密。

在具体实现时,首先分析了Misty1算法的基本结构,设计出相应的实施方法,正确实现了该算法,其次,设计了一个图形用户界面,最后对软件进行了测试,验证了实现方法的正确性。

关键词:Misty1;Java;加密;解密The Implementation of Encryption Software (Java) Basedon Misty1 AlgorithmAbstractWith the rapid development of computer networks technology and communication technology, Information security has become one of the most important problems urgent to resolve in information society, Cryptographic technology is the core technology to guarantee information security. In this paper, the software of encryption based on Misty1 algorithm is developed by using JA V A language. It can encrypt and decrypt a file. During the process of implementation, the basic structure of the algorithm is analyzed first and the counterpart method is designed, secondly, a GUI is designed, finally, the software is tested, the result shows that method of implementation is right.Key words:Misty1; Java ; Encryption;Decrypt目录论文总页数:24页1 引言 (1)1.1 课题背景 (1)1.2 国内外研究现状 (1)1.3 本课题研究的意义 (2)1.4 本课题的研究方法 (3)2 MISTY1算法描述 (3)2.1 秘钥产生部分 (3)2.2 数据随机化部分 (4)2.3 函数描述 (4)2.3.1 FI函数 (4)2.3.2 FO函数 (5)2.3.3 FL函数 (6)2.3.4 FL-1函数 (7)3 MISTY1加密软件的设计与实现 (8)3.1 工作环境介绍 (8)3.2 J AVA及程序编辑工具介绍 (9)3.2.1 Java介绍 (9)3.2.2 程序编辑工具介绍 (10)3.3 M ISTY1算法应用于文件加密的分析 (11)3.4 M ISTY1算法的实现 (12)3.4.1 加密 (12)3.4.2 解密 (15)3.5 设计流程图、图形界面及事件处理 (17)3.5.1 加密/解密流程图 (17)3.5.2 图形界面 (17)3.5.3 处理按钮事件 (19)4 程序演示 (20)4.1 程序演示 (20)4.2 结果及存在的问题 (20)结论 (21)参考文献 (21)致谢 (22)声明 (23)1引言1.1课题背景现代密码学是一门迅速发展的应用科学。

jsencrypt对应java代码

jsencrypt对应java代码

jsencrypt对应java代码使用jsencrypt对应的java代码在web开发中,安全性是一个非常重要的考虑因素。

在网络传输中,我们经常需要对敏感数据进行加密,以保证数据的安全性。

在前端开发中,我们可以使用jsencrypt库来对数据进行加密,而在后端开发中,我们则可以使用相应的java代码来进行解密。

jsencrypt是一个用于在浏览器中进行加密和解密的JavaScript库。

它基于RSA算法,通过生成公钥和私钥对来实现加密和解密功能。

在前端开发中,我们可以使用jsencrypt库来加密前端传输的数据,然后将加密后的数据发送到后端。

而在后端开发中,我们则需要使用相应的java代码来进行解密操作。

在java中,我们可以使用常见的加密算法库来实现解密操作。

下面是一段使用jsencrypt对应的java代码示例:```javaimport java.io.BufferedReader;import java.io.FileReader;import java.security.KeyFactory;import java.security.interfaces.RSAPrivateKey;import java.security.spec.PKCS8EncodedKeySpec;import javax.crypto.Cipher;public class RSAUtil {public static String decrypt(String encryptedData, String privateKeyPath) throws Exception {// 读取私钥文件BufferedReader br = new BufferedReader(new FileReader(privateKeyPath));String privateKey = "";String line;while ((line = br.readLine()) != null) {privateKey += line;}br.close();// 解密byte[] encryptedBytes = hexToBytes(encryptedData);byte[] privateKeyBytes = base64ToBytes(privateKey); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);KeyFactory keyFactory = KeyFactory.getInstance("RSA");RSAPrivateKey privateKeyObj = (RSAPrivateKey) keyFactory.generatePrivate(keySpec);Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");cipher.init(Cipher.DECRYPT_MODE, privateKeyObj);byte[] decryptedBytes = cipher.doFinal(encryptedBytes);return new String(decryptedBytes);}private static byte[] hexToBytes(String hex) {int len = hex.length();byte[] result = new byte[len / 2];for (int i = 0; i < len; i += 2) {result[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4)+ Character.digit(hex.charAt(i + 1), 16));}return result;}private static byte[] base64ToBytes(String base64) {return Base64.getDecoder().decode(base64);}}```在这段java代码中,我们首先需要读取私钥文件。

Java-文件加密传输(摘要+签名)

Java-文件加密传输(摘要+签名)

Java-⽂件加密传输(摘要+签名)Java-⽂件加密传输(摘要+签名)⽂件加密传输其实就是将⽂件以⼆进制格式进⾏传输。

其中加密⽂件主要由:源⽂件⼆进制⽂件、源⽂件数字摘要、数字签名、特征码等等组成。

摘要可确认⽂件的唯⼀性,数字签名则是对摘要进⾏了加密。

本⽂主要记录使⽤RSA加密⽅式其中⽣成RSA密钥主要介绍⼆种⽅式:1、安装openssl情况下使⽤Linux命令⽣成2、Java代码实现⼀、公私钥⽣成1、linux1、查看openssl版本 openssl version -a2、⽣成私钥 openssl genrsa -out rsa_private_key.pem 2048 会⽣成rsa_private_key.pem私钥⽂件,私钥⽂件不能使⽤3、⽣成公钥 openssl rsa -in rsa_private_key.pem -out rsa_public_key.pem -puboutopenssl pkcs8 -topk8 -inform PEM -outform DER -in private_key.pem -out private_key.der -nocrypt 私钥⽂件不能使⽤4、私钥⽂件PKCS#8编码 openssl pkcs8 -topk8 -in rsa_private_key.pem -out pkcs8_rsa_private_key.pem 此处⽣成的私钥⽂件⽅可⽤于Java2、Javaimport java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.security.InvalidKeyException;import java.security.KeyFactory;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import java.security.interfaces.RSAPrivateKey;import java.security.interfaces.RSAPublicKey;import java.security.spec.InvalidKeySpecException;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import javax.crypto.BadPaddingException;import javax.crypto.Cipher;import javax.crypto.IllegalBlockSizeException;import javax.crypto.NoSuchPaddingException;import mons.codec.binary.Base64;public class RSAEncrypt {/*** 字节数据转字符串专⽤集合*/private static final char[] HEX_CHAR = {'0', '1', '2', '3', '4', '5', '6','7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};private static final String PRIVATE_BEGIN = "-----BEGIN PRIVATE KEY-----";private static final String PRIVATE_END = "-----END PRIVATE KEY-----";private static final String PUBLIC_BEGIN = "-----BEGIN PUBLIC KEY-----";private static final String PUBLIC_END = "-----END PUBLIC KEY-----";/*** 1、随机⽣成密钥对** @param filePath 密钥存放⽬录*/public void genKeyPair(String filePath) {// KeyPairGenerator类⽤于⽣成公钥和私钥对,基于RSA算法⽣成对象KeyPairGenerator keyPairGen = null;try {keyPairGen = KeyPairGenerator.getInstance("RSA");} catch (NoSuchAlgorithmException e) {e.printStackTrace();}// 初始化密钥对⽣成器,密钥⼤⼩为96-1024位keyPairGen.initialize(1024, new SecureRandom());// ⽣成⼀个密钥对,保存在keyPair中KeyPair keyPair = keyPairGen.generateKeyPair();// 得到私钥RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();// 得到公钥RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();try {// 得到公钥字符串Base64 base64 = new Base64();String publicKeyString = new String(base64.encode(publicKey.getEncoded()));// 得到私钥字符串String privateKeyString = new String(base64.encode(privateKey.getEncoded()));// 将密钥对写⼊到⽂件FileWriter pubfw = new FileWriter(filePath + "\\publicKey.pem");FileWriter prifw = new FileWriter(filePath + "\\privateKey.pem");BufferedWriter pubbw = new BufferedWriter(pubfw);BufferedWriter pribw = new BufferedWriter(prifw);pubbw.write(publicKeyString);pribw.write(privateKeyString);pubbw.flush();pubbw.close();pubfw.close();pribw.flush();pribw.close();prifw.close();} catch (Exception e) {e.printStackTrace();}}/*** 2、从本地⽂件中读取公钥** @param path 公钥路径* @return公钥字符串* @throws Exception 异常信息*/public String loadPublicKeyByFile(String path) throws Exception {try {BufferedReader br = new BufferedReader(new FileReader(path));String readLine = null;StringBuilder sb = new StringBuilder();while ((readLine = br.readLine()) != null) {// 去除公钥头部底部if (!readLine.equals(PUBLIC_BEGIN) && !readLine.equals(PUBLIC_END)) { sb.append(readLine);}}br.close();return sb.toString();} catch (IOException e) {throw new Exception("公钥数据流读取错误");} catch (NullPointerException e) {throw new Exception("公钥输⼊流为空");}}/*** 3、字符串公钥转公钥对象** @param publicKeyStr 公钥字符串类型* @return公钥对象* @throws Exception 异常信息*/public RSAPublicKey loadPublicKeyByStr(String publicKeyStr)throws Exception {try {Base64 base64 = new Base64();byte[] buffer = base64.decode(publicKeyStr);KeyFactory keyFactory = KeyFactory.getInstance("RSA");X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);return (RSAPublicKey) keyFactory.generatePublic(keySpec);} catch (NoSuchAlgorithmException e) {throw new Exception("⽆此算法");} catch (InvalidKeySpecException e) {throw new Exception("公钥⾮法");} catch (NullPointerException e) {throw new Exception("公钥数据为空");}}/*** 4、从本地⽂件中读取私钥** @param path 私钥⽂件路径* @return私钥字符串* @throws Exception 异常信息*/public String loadPrivateKeyByFile(String path) throws Exception {try {BufferedReader br = new BufferedReader(new FileReader(path));String readLine = null;StringBuilder sb = new StringBuilder();while ((readLine = br.readLine()) != null) {//去除私钥头部底部if (!readLine.equals(PRIVATE_BEGIN) && !readLine.equals(PRIVATE_END)) { sb.append(readLine);} else {}}br.close();return sb.toString();} catch (IOException e) {throw new Exception("私钥数据读取错误");} catch (NullPointerException e) {throw new Exception("私钥输⼊流为空");}}/*** 5、字符串公钥转公钥对象** @param privateKeyStr 私钥字符串类型* @return私钥对象* @throws Exception 异常信息*/public RSAPrivateKey loadPrivateKeyByStr(String privateKeyStr)throws Exception {try {Base64 base64 = new Base64();byte[] buffer = base64.decode(privateKeyStr);PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer);KeyFactory keyFactory = KeyFactory.getInstance("RSA");return (RSAPrivateKey) keyFactory.generatePrivate(keySpec);} catch (NoSuchAlgorithmException e) {throw new Exception("⽆此算法");} catch (InvalidKeySpecException e) {throw new Exception("私钥⾮法");} catch (NullPointerException e) {throw new Exception("私钥数据为空");}}/*** 6、公钥加密过程** @param publicKey 公钥* @param plainTextData 明⽂数据* @return* @throws Exception 加密过程中的异常信息*/public byte[] encrypt(RSAPublicKey publicKey, byte[] plainTextData)throws Exception {if (publicKey == null) {throw new Exception("加密公钥为空, 请设置");}Cipher cipher = null;try {// 使⽤默认RSAcipher = Cipher.getInstance("RSA");// cipher= Cipher.getInstance("RSA", new BouncyCastleProvider());cipher.init(Cipher.ENCRYPT_MODE, publicKey);byte[] output = cipher.doFinal(plainTextData);return output;} catch (NoSuchAlgorithmException e) {throw new Exception("⽆此加密算法");} catch (NoSuchPaddingException e) {e.printStackTrace();return null;} catch (InvalidKeyException e) {throw new Exception("加密公钥⾮法,请检查");} catch (IllegalBlockSizeException e) {throw new Exception("明⽂长度⾮法");} catch (BadPaddingException e) {throw new Exception("明⽂数据已损坏");}}/*** 7、私钥加密过程** @param privateKey 私钥* @param plainTextData 明⽂数据* @return* @throws Exception 加密过程中的异常信息*/public byte[] encrypt(RSAPrivateKey privateKey, byte[] plainTextData) throws Exception {if (privateKey == null) {throw new Exception("加密私钥为空, 请设置");}Cipher cipher = null;try {// 使⽤默认RSAcipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, privateKey);byte[] output = cipher.doFinal(plainTextData);return output;} catch (NoSuchAlgorithmException e) {throw new Exception("⽆此加密算法");} catch (NoSuchPaddingException e) {e.printStackTrace();return null;} catch (InvalidKeyException e) {throw new Exception("加密私钥⾮法,请检查");} catch (IllegalBlockSizeException e) {throw new Exception("明⽂长度⾮法");} catch (BadPaddingException e) {throw new Exception("明⽂数据已损坏");}}/*** 8、私钥解密过程** @param privateKey 私钥* @param cipherData 密⽂数据* @return明⽂* @throws Exception 解密过程中的异常信息*/public byte[] decrypt(RSAPrivateKey privateKey, byte[] cipherData) throws Exception {if (privateKey == null) {throw new Exception("解密私钥为空, 请设置");}Cipher cipher = null;try {// 使⽤默认RSAcipher = Cipher.getInstance("RSA");// cipher= Cipher.getInstance("RSA", new BouncyCastleProvider()); cipher.init(Cipher.DECRYPT_MODE, privateKey);byte[] output = cipher.doFinal(cipherData);return output;} catch (NoSuchAlgorithmException e) {throw new Exception("⽆此解密算法");} catch (NoSuchPaddingException e) {e.printStackTrace();return null;} catch (InvalidKeyException e) {throw new Exception("解密私钥⾮法,请检查");} catch (IllegalBlockSizeException e) {throw new Exception("密⽂长度⾮法");} catch (BadPaddingException e) {throw new Exception("密⽂数据已损坏");}}/*** 9、公钥解密过程** @param publicKey 公钥* @param cipherData 密⽂数据* @return明⽂* @throws Exception 解密过程中的异常信息*/public byte[] decrypt(RSAPublicKey publicKey, byte[] cipherData)throws Exception {if (publicKey == null) {throw new Exception("解密公钥为空, 请设置");}Cipher cipher = null;try {// 使⽤默认RSAcipher = Cipher.getInstance("RSA");// cipher= Cipher.getInstance("RSA", new BouncyCastleProvider());cipher.init(Cipher.DECRYPT_MODE, publicKey);byte[] output = cipher.doFinal(cipherData);return output;} catch (NoSuchAlgorithmException e) {throw new Exception("⽆此解密算法");} catch (NoSuchPaddingException e) {e.printStackTrace();return null;} catch (InvalidKeyException e) {throw new Exception("解密公钥⾮法,请检查");} catch (IllegalBlockSizeException e) {throw new Exception("密⽂长度⾮法");} catch (BadPaddingException e) {throw new Exception("密⽂数据已损坏");}}/*** 10、字节数据转⼗六进制字符串** @param data 输⼊数据* @return⼗六进制内容*/public String byteArrayToString(byte[] data) {StringBuilder stringBuilder = new StringBuilder();for (int i = 0; i < data.length; i++) {// 取出字节的⾼四位作为索引得到相应的⼗六进制标识符注意⽆符号右移stringBuilder.append(HEX_CHAR[(data[i] & 0xf0) >>> 4]);// 取出字节的低四位作为索引得到相应的⼗六进制标识符stringBuilder.append(HEX_CHAR[(data[i] & 0x0f)]);if (i < data.length - 1) {stringBuilder.append(' ');}}return stringBuilder.toString();}}⼆、调⽤ /*** ⽣成加密后⽂件** @param oldFilePath 需要加密⽂件路径+名称* @param newFilePath 加密后⽂件路径+名称* @param privatePath 私钥⽂件路径+名称*/public void fileEncrypt(String oldFilePath, String newFilePath, String privatePath) {ByteUtil byteUtil = new ByteUtil();//⽂件格式:特征码+原始升级包长度+数字签名长度+原始包内容+数字签名byte[] code = byteUtil.intToByteArray(0x9F2308DC);RSAEncrypt rsaEncrypt = new RSAEncrypt();try {//1、特征码写⼊OutputStream out = new FileOutputStream(new File(newFilePath));out.write(code, 0, 4);//2、原始升级包长度写⼊byte[] fileByte = byteUtil.File2byte(oldFilePath);int L1 = fileByte.length;byte[] a = byteUtil.intToByteArray(L1);out.write(a, 0, 4);//⽂件摘要⽣成MsgDigestDemo msgDigestDemo = new MsgDigestDemo();MessageDigest md5Digest = MessageDigest.getInstance("MD5");md5Digest.update(msgDigestDemo.fileBytes(oldFilePath));byte[] md5Encoded = md5Digest.digest();("==========MD5摘要:{}==========", Base64.encodeBase64URLSafeString(md5Encoded)); String privateKey = rsaEncrypt.loadPrivateKeyByFile(privatePath);RSAPrivateKey privateKeyfile = rsaEncrypt.loadPrivateKeyByStr(privateKey);//⽣成签名(摘要加密过程)byte[] signature = rsaEncrypt.encrypt(privateKeyfile, md5Encoded);//3、签名长度int L2 = signature.length;byte[] c = byteUtil.intToByteArray(L2);out.write(c, 0, 4);//4、原始升级包内容写⼊out.write(fileByte, 0, L1);//5、数字签名写⼊out.write(signature, 0, L2);out.flush();out.close();} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}MD5摘要计算public class MsgDigestDemo {public byte[] fileBytes(String filePath) {try {File file = new File(filePath);ByteArrayOutputStream out = new ByteArrayOutputStream(1024); FileInputStream in = new FileInputStream(file);byte[] fileByte = new byte[1024];int n;while ((n = in.read(fileByte)) != -1) {out.write(fileByte, 0, n);}in.close();byte[] data = out.toByteArray();out.close();return data;} catch (IOException e) {e.printStackTrace();}return null;}}。

java接收文件加密解密方法

java接收文件加密解密方法

java接收文件加密解密方法
在Java中接收加密文件并进行解密可以通过多种方式实现。

下面我将从多个角度介绍几种常见的方法:
1. 使用对称加密算法:
可以使用Java的javax.crypto包中的类来实现对称加密算法,如AES。

首先,接收加密文件后,可以使用FileInputStream 读取文件内容,然后使用Cipher类进行解密操作,最后使用FileOutputStream将解密后的内容写入新文件。

2. 使用非对称加密算法:
如果发送方使用了公钥加密文件,接收方可以使用私钥进行解密。

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

首先,接收加密文件后,可以使用PrivateKey类进行解密操作,最后使用FileOutputStream将解密后的内容写入新文件。

3. 使用第三方库:
除了Java自带的加密算法外,也可以使用第三方库来简化加密解密操作,例如Bouncy Castle或者Apache Commons Crypto 等。

这些库提供了更多的加密选项和更简单的API,可以更容易地实现文件的加密和解密操作。

无论使用哪种方法,都需要注意文件的安全传输和存储,以及密钥的安全管理。

另外,要确保在解密文件时处理可能出现的异常情况,如文件损坏或者密码错误等。

希望这些信息能够帮助你实现在Java中接收文件并进行加密解密的操作。

基于DES算法的数据文件加密解密的java编程实现

基于DES算法的数据文件加密解密的java编程实现

基于DES算法的数据文件加密/解密的java编程实现1 课题背景和意义据记载,公元前400年,古希腊人发明了置换密码。

1881年世界上的第一个电话保密专利出现。

在第二次世界大战期间,德国军方启用“恩尼格玛”密码机,密码学在战争中起着非常重要的作用。

随着信息化和数字化社会的发展,人们对信息安全和保密的重要性认识不断提高,于是在1997年,美国国家标准局公布实施了“美国数据加密标准(DES)”,民间力量开始全面介入密码学的研究和应用中,采用的加密算法有DES、RSA、SHA等。

随着对加密强度需求的不断提高,近期又出现了AES、ECC等。

我国也相应提出了自己国家的ECC、SCB2、SCH 等加密算法。

使用密码学可以达到以下目的:1.保密性:防止用户的标识或数据被读取。

2.数据完整性:防止数据被更改。

3.身份验证:确保数据发自特定的一方。

随着计算机和通信网络的广泛应用,信息的安全性已经受到人们的普遍重视。

信息安全已不仅仅局限于政治,军事以及外交领域,而且现在也与人们的日常生活息息相关。

现在,密码学理论和技术已得到了迅速的发展,它是信息科学和技术中的一个重要研究领域。

在近代密码学上值得一提的大事有两件:一是1977年美国国家标准局正式公布实施了美国的数据加密标准(DES),公开它的加密算法,并批准用于非机密单位及商业上的保密通信。

密码学的神秘面纱从此被揭开。

二是Diffie和Hellman联合写的一篇文章“密码学的新方向”,提出了适应网络上保密通信的公钥密码思想,拉开了公钥密码研究的序幕。

DES(Data Encryption Standard)是IBM公司于上世纪1977年提出的一种数据加密算法。

在过去近三十年的应用中,还无法将这种加密算法完全、彻底地破解掉。

而且这种算法的加解密过程非常快,至今仍被广泛应用,被公认为安全的。

虽然近年来由于硬件技术的飞速发展,破解DES已经不是一件难事,但学者们似乎不甘心让这样一个优秀的加密算法从此废弃不用,于是在DES的基础上有开发了双重DES(DoubleDES,DDES)和三重DES(Triple DES,TDES)。

java密码加密方法

java密码加密方法

java密码加密方法在现今的网络世界中,安全性是非常重要的一个问题,其中密码的安全性就尤为重要。

许多网站和应用程序都需要用户进行登录,需要输入用户名和密码来验证身份。

但是,用户往往习惯使用简单的密码,如生日、常用英文单词等。

这使得密码的安全性降低了很多,给黑客攻击、身份盗窃等带来了很大的风险。

为了提高密码安全性,需要对密码进行加密。

Java是一种非常流行的编程语言之一,有许多加密方法可以用来加密密码。

本文将介绍Java密码加密的几种方法。

1.MD5加密算法MD5是最常见的一种密码加密算法之一。

它可以将一个明文字符串加密成一个128位的哈希值,通常用32位的十六进制数字表示。

MD5被广泛使用,因为它是一个不可逆的算法,使用同样的密码加密出来的哈希值是唯一的,且不可反向推导出原始字符串。

以下是MD5加密的Java代码示例:```import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;StringBuffer sb = new StringBuffer();for (int i = 0; i < b.length; i++) {int v = b[i] & 0xFF;if (v < 16) {sb.append("0");}sb.append(Integer.toHexString(v));}return sb.toString();}在以上代码中,toMD5方法接受一个明文字符串,返回一个MD5哈希串,可以在一个数据库中保存。

在登陆时,将用户输入的密码进行MD5加密,然后和数据库中的加密串比较,若相等则表示输入的密码是正确的。

需要注意的是,MD5算法虽然被广泛使用,但是安全性并不是十分高,因为它在被攻击时容易被破解。

因此,在一些敏感性较高的场合下,建议使用更加复杂的加密算法,如SHA-1、SHA-256等。

java rsa 加密解密流程

java rsa 加密解密流程

java rsa 加密解密流程RSA是一种非对称加密算法,用于数据的加密和解密。

它涉及到公钥和私钥的使用,其中公钥用于加密数据,私钥用于解密数据。

下面是Java中使用RSA 加密和解密的基本流程:1. 生成密钥对:首先需要生成一对RSA密钥,包括公钥和私钥。

可以使用Java提供的`KeyPairGenerator`类来生成密钥对。

```javaKeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");keyPairGenerator.initialize(2048); // 指定密钥长度KeyPair keyPair = keyPairGenerator.generateKeyPair();PublicKey publicKey = keyPair.getPublic();PrivateKey privateKey = keyPair.getPrivate();```2. 加密数据:使用公钥对需要加密的数据进行加密。

可以使用`Cipher`类来进行加密操作。

```javaString data = "Hello, World!";Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, publicKey);byte[] encryptedData = cipher.doFinal(data.getBytes());```3. 解密数据:使用私钥对加密后的数据进行解密,还原为原始数据。

```javacipher.init(Cipher.DECRYPT_MODE, privateKey);byte[] decryptedData = cipher.doFinal(encryptedData);String decryptedText = new String(decryptedData);```请注意,以上示例代码只是一个简单的RSA加密和解密流程的示例。

java-信息安全(十九)加密工具Jasypt

java-信息安全(十九)加密工具Jasypt

java-信息安全(⼗九)加密⼯具Jasypt⼀、概述 Jasypt 这个Java类包为开发⼈员提供⼀种简单的⽅式来为项⽬增加加密功能,包括:密码Digest认证,⽂本和对象加密,集成hibernate,Spring Security(Acegi)来增强密码管理。

Jasypt是⼀个Java库,可以使开发者不需太多操作来给Java项⽬添加基本加密功能,⽽且不需要知道加密原理。

根据Jasypt⽂档,该技术可⽤于加密任务与应⽤程序,例如加密密码、敏感信息和数据通信、创建完整检查数据的sums. 其他性能包括⾼安全性、基于标准的加密技术、可同时单向和双向加密的加密密码、⽂本、数字和⼆进制⽂件。

Jasypt也可以与Acegi Security整合也即Spring Security。

Jasypt亦拥有加密应⽤配置的集成功能,⽽且提供⼀个开放的API从⽽任何⼀个Java Cryptography Extension都可以使⽤Jasypt。

Jasypt还符合RSA标准的基于密码的加密,并提供了⽆配置加密⼯具以及新的、⾼可配置标准的加密⼯具。

1、该开源项⽬可⽤于加密任务与应⽤程序,例如加密密码、敏感信息和数据通信 2、还包括⾼安全性、基于标准的加密技术、可同时单向和双向加密的加密密码、⽂本、数字和⼆进制⽂件。

3、Jasypt还符合RSA标准的基于密码的加密,并提供了⽆配置加密⼯具以及新的、⾼可配置标准的加密⼯具。

4、加密属性⽂件(encryptable properties files)、Spring work集成、加密Hibernate数据源配置、新的命令⾏⼯具、URL加密的Apache wicket集成以及升级⽂档。

5、Jasypt也可以与Acegi Security整合也即Spring Security。

Jasypt亦拥有加密应⽤配置的集成功能,⽽且提供⼀个开放的API从⽽任何⼀个Java Cryptography Extension都可以使⽤Jasypt。

JAVA实现AES加密算法代码

JAVA实现AES加密算法代码

JAVA实现AES加密算法代码JA V A实现AES加密算法代码近些年DES使用越来越少,原因就在于其使用56位密钥,比较容易被破解,近些年来逐渐被AES替代,AES已经变成目前对称加密中最流行算法之一;AES可以使用128、192、和256位密钥,并且用128位分组加密和解密数据。

本文就简单介绍如何通过JA V A实现AES加密。

1. JA V A 实现闲话少许,掠过AES加密原理及算法,关于这些直接搜索专业网站吧,我们直接看JA V A的具体实现。

1.1 加密代码有详细解释,不多废话。

/*** 加密** @param content 需要加密的内容*@param password 加密密码* @return*/public static byte[] encrypt(String content, String password) {try {KeyGenerator kgen =KeyGenerator.getInstance("AES");kgen.init(128, new SecureRandom(password.getBytes()));SecretKey secretKey = kgen.generateKey();byte[] enCodeFormat = secretKey.getEncoded();SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");Cipher cipher = Cipher.getInstance("AES");// 创建密码器byte[] byteContent = content.getBytes("utf-8");cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化byte[] result = cipher.doFinal(byteContent);return result; // 加密} catch (NoSuchAlgorithmException e) { e.printStackTrace();} catch (NoSuchPaddingException e) { e.printStackTrace();} catch (InvalidKeyException e){ e.printStackTrace();} catch (UnsupportedEncodingException e){ e.printStackTrace();} catch (IllegalBlockSizeException e) { e.printStackTrace();} catch (BadPaddingException e){ e.printStackTrace();}return null;}/*** 加密** @param content 需要加密的内容* @param password 加密密码* @return*/ public static byte[] encrypt(String content, String password) {try {KeyGenerator kgen =KeyGenerator.getInstance("AES");kgen.init(128, new SecureRandom(password.getBytes()));SecretKey secretKey = kgen.generateKey();byte[] enCodeFormat = secretKey.getEncoded();SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");Cipher cipher = Cipher.getInstance("AES");// 创建密码器byte[] byteContent = content.getBytes("utf-8");SecretKeySpec(enCodeFormat, "AES");Cipher cipher = Cipher.getInstance("AES");// 创建密码器cipher.init(Cipher.DECRYPT_MODE, key);// 初始化byte[] result = cipher.doFinal(content);return result; //加密} catch (NoSuchAlgorithmException e){ e.printStackTrace();} catch (NoSuchPaddingException e) { e.printStackTrace();} catch (InvalidKeyException e){ e.printStackTrace();} catch (IllegalBlockSizeException e) { e.printStackTrace();} catch (BadPaddingException e){ e.printStackTrace();}return null;}/**解密* @param content 待解密内容* @param password 解密密钥* @return*/public static byte[] decrypt(byte[] content, String password) {try {KeyGenerator kgen =KeyGenerator.getInstance("AES");kgen.init(128, new SecureRandom(password.getBytes()));SecretKey secretKey = kgen.generateKey();byte[] enCodeFormat = secretKey.getEncoded();SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");Cipher cipher = Cipher.getInstance("AES");// 创建密码器cipher.init(Cipher.DECRYPT_MODE, key);// 初始化byte[] result = cipher.doFinal(content);return result; //加密} catch (NoSuchAlgorithmException e){ e.printStackTrace();} catch (NoSuchPaddingException e) { e.printStackTrace();} catch (InvalidKeyException e){ e.printStackTrace();} catch (IllegalBlockSizeException e) { e.printStackTrace();} catch (BadPaddingException e){ e.printStackTrace();}return null;}2.3 测试代码String content = "test";String password = "12345678";//加密System.out.println("加密前:" + content);byte[] encryptResult = encrypt(content, password);//解密byte[] decryptResult = decrypt(encryptResult,password); System.out.println("解密后:" + new String(decryptResult)); String content = "test";String password = "12345678"; //加密System.out.println("加密前:" + content);byte[] encryptResult = encrypt(content, password);//解密byte[] decryptResult =decrypt(encryptResult,password);System.out.println("解密后:" + new String(decryptResult));输出结果如下:加密前:test解密后:test 2.4 容易出错的地方但是如果我们将测试代码修改一下,如下:String content = "test";String password = "12345678";//加密System.out.println("加密前:" + content);byte[] encryptResult = encrypt(content, password);try {String encryptResultStr = newString(encryptResult,"utf-8");//解密byte[] decryptResult =decrypt(encryptResultStr.getBytes("utf-8"),password); System.out.println("解密后:" + newString(decryptResult));} catch (UnsupportedEncodingException e){ e.printStackTrace();}String content = "test"; String password = "12345678";//加密System.out.println("加密前:" + content);byte[] encryptResult = encrypt(content, password);try {String encryptResultStr = newString(encryptResult,"utf-8");//解密byte[] decryptResult =decrypt(encryptResultStr.getBytes("utf-8"),password); System.out.println("解密后:" + newString(decryptResult));} catch(UnsupportedEncodingException e){ e.printStackTrace();}则,系统会报出如下异常:javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher atcom.sun.crypto.provider.SunJCE_f.b(DashoA13*..)at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)at com.sun.crypto.provider.AESCipher.engineDoFinal(DashoA 13*..)at javax.crypto.Cipher.doFinal(DashoA13*..)这主要是因为加密后的byte数组是不能强制转换成字符串的,换言之:字符串和byte数组在这种情况下不是互逆的;要避免这种情况,我们需要做一些修订,可以考虑将二进制数据转换成十六进制表示,主要有如下两个方法: 2.4.1将二进制转换成16进制/**将二进制转换成16进制* @param buf* @return*/public static String parseByte2HexStr(byte buf[]) {StringBuffer sb = new StringBuffer();for (int i = 0; i String hex = Integer.toHexString(buf[i] & 0xFF);if (hex.length() == 1) {hex = '0' + hex;}sb.append(hex.toUpperCase());}returnsb.toString();}/**将二进制转换成16进制*@param buf* @return*/public static StringparseByte2HexStr(byte buf[]) {StringBuffer sb = new StringBuffer();for (int i = 0; i String hex = Integer.toHexString(buf[i] & 0xFF);if (hex.length() == 1) {hex = '0' + hex;}sb.append(hex.toUpperCase());}returnsb.toString();} 2.4.2 将16进制转换为二进制/**将16进制转换为二进制* @param hexStr*@return*/public static byte[]parseHexStr2Byte(String hexStr) {if (hexStr.length() return null;byte[] result = new byte[hexStr.length()/2]; for (int i = 0;i int high =Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);intlow = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16); result[i] = (byte) (high * 16 + low);}return result;}/**将16进制转换为二进制* @param hexStr*@return*/public static byte[]parseHexStr2Byte(String hexStr) {if (hexStr.length() return null;byte[] result = new byte[hexStr.length()/2]; for (int i = 0;i int high =Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);intlow = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);result[i] = (byte) (high * 16 + low);}return result;}然后,我们再修订以上测试代码,如下:String content = "test";String password = "12345678"; //加密System.out.println("加密前:" + content);byte[] encryptResult = encrypt(content, password);String encryptResultStr = parseByte2HexStr(encryptResult); System.out.println("加密后:" + encryptResultStr);//解密byte[] decryptFrom =parseHexStr2Byte(encryptResultStr);byte[] decryptResult = decrypt(decryptFrom,password); System.out.println("解密后:" + new String(decryptResult)); String content = "test";String password = "12345678"; //加密System.out.println("加密前:" + content);byte[] encryptResult = encrypt(content, password);String encryptResultStr = parseByte2HexStr(encryptResult); System.out.println("加密后:" + encryptResultStr);//解密byte[] decryptFrom =parseHexStr2Byte(encryptResultStr);byte[] decryptResult = decrypt(decryptFrom,password); System.out.println("解密后:" + new String(decryptResult));测试结果如下:加密前:test加密后:73C58BAFE578C59366D8C995CD0B9D6D解密后:test2.5 另外一种加密方式还有一种加密方式,大家可以参考如下:/*** 加密** @param content 需要加密的内容* @param password 加密密码*@return*/public static byte[] encrypt2(String content, String password) {try {SecretKeySpec key = new SecretKeySpec(password.getBytes(), "AES");Cipher cipher =Cipher.getInstance("AES/ECB/NoPadding");byte[] byteContent = content.getBytes("utf-8");cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化byte[] result = cipher.doFinal(byteContent);return result; // 加密} catch (NoSuchAlgorithmException e) { e.printStackTrace();} catch (NoSuchPaddingException e) { e.printStackTrace();} catch (InvalidKeyException e){ e.printStackTrace();} catch (UnsupportedEncodingException e){ e.printStackTrace();} catch (IllegalBlockSizeException e) { e.printStackTrace();} catch (BadPaddingException e){ e.printStackTrace();}return null;}/*** 加密** @param content 需要加密的内容* @param password 加密密码* @return*/ public static byte[] encrypt2(String content, String password) {try {SecretKeySpec key = newSecretKeySpec(password.getBytes(), "AES");Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");byte[] byteContent = content.getBytes("utf-8");cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化byte[] result = cipher.doFinal(byteContent);return result; // 加密} catch (NoSuchAlgorithmException e) { e.printStackTrace();} catch (NoSuchPaddingException e) { e.printStackTrace();} catch (InvalidKeyException e){ e.printStackTrace();} catch (UnsupportedEncodingException e){ e.printStackTrace();} catch (IllegalBlockSizeException e) { e.printStackTrace();} catch (BadPaddingException e){ e.printStackTrace();}return null;}这种加密方式有两种限制密钥必须是16位的待加密内容的长度必须是16的倍数,如果不是16的倍数,就会出如下异常:javax.crypto.IllegalBlockSizeException: Input length not multiple of 16 bytes atcom.sun.crypto.provider.SunJCE_f.a(DashoA13*..)at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)at com.sun.crypto.provider.AESCipher.engineDoFinal(DashoA 13*..)at javax.crypto.Cipher.doFinal(DashoA13*..)要解决如上异常,可以通过补全传入加密内容等方式进行避免。

  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 系统模块图
相关文档
最新文档