- 浏览: 107988 次
- 性别:
- 来自: 大连
-
最新评论
-
liubey:
frogEye 写道 写得挺好的,但是不得不说:错别字一大堆 ...
深入浅出Maven:创建普通及Web项目、使用Profile进行资源过滤 -
frogEye:
写得挺好的,但是不得不说:错别字一大堆
深入浅出Maven:创建普通及Web项目、使用Profile进行资源过滤 -
卖火柴的老特工:
3Q.也是刚刚解决掉
Maven编译时两则信息 (Workspace以及default classpath container) -
liubey:
shmily2038 写道现在的技术书籍,就是缺少对细节的深入 ...
2014读书总结 -
shmily2038:
现在的技术书籍,就是缺少对细节的深入描绘,都没啥实际看点。
2014读书总结
加密算法有很多种:这里只大约列举几例:
1:消息摘要:(数字指纹):既对一个任意长度的一个数据块进行计算,产生一个唯一指纹。MD5/SHA1
发送给其他人你的信息和摘要,其他人用相同的加密方法得到摘要,最后进行比较摘要是否相同。
2:单匙密码体制:DES:比较简便高效,密钥简短,加解密速度快,破译极其困难,但其安全性依赖于密匙的安全性。
DES(Data Encryption Standard)是发明最早的最广泛使用的分组对称加密算法。DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密
3:数字签名:就是信息发送者用其私钥对从所传报文中提取出的特征数据(或称数字指纹)进行RSA算法操作,以保证发信人无法抵赖曾发过该信息(即不可抵赖性),同时也确保信息报文在经签名后末被篡改(即完整性)。当信息接收者收到报文后,就可以用发送者的公钥对数字签名进行验证。
代表:DSA
4:非对称密匙密码体制(公匙体系):加密密匙不同于解密密匙,加密密匙公之于众,谁都可以使用,解密密匙只有解密人自己知道。代表: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.qiu
15. * @since http://blog.csdn.net/qiushyfm
16. */
17.public class CryptTest {
18. /**
19. * 进行MD5加密
20. *
21. * @param info
22. * 要加密的信息
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 info
45. * 要加密的信息
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 algorithm
69. * 加密算法,可用 DES,DESede,Blowfish
70. * @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 key
92. * 密匙
93. * @param info
94. * 要加密的信息
95. * @return String 加密后的信息
96. */
97. public String encryptToDES(SecretKey key, String info) {
98. // 定义 加密算法,可用 DES,DESede,Blowfish
99. 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 key
122. * 密匙
123. * @param sInfo
124. * 要解密的密文
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.getInstance("DSA");
156. // 加密随机数生成器 (RNG)
157. SecureRandom random = new SecureRandom();
158. // 重新设置此随机对象的种子
159. random.setSeed(1000);
160. // 使用给定的随机源(和默认的参数集合)初始化确定密钥大小的密钥对生成器
161. keygen.initialize(512, random);// keygen.initialize(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[] { prikey, pubkey });
170. } catch (NoSuchAlgorithmException e) {
171. e.printStackTrace();
172. }
173. }
174. /**
175. * 利用私匙对信息进行签名 把签名后的信息放入到指定的文件中
176. *
177. * @param info
178. * 要签名的信息
179. * @param signfile
180. * 存入的文件
181. */
182. public void signToInfo(String info, String signfile) {
183. // 从文件当中读取私匙
184. PrivateKey myprikey = (PrivateKey) getObjFromFile("mykeys.bat", 1);
185. // 从文件中读取公匙
186. PublicKey mypubkey = (PublicKey) getObjFromFile("mykeys.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, mypubkey, 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(signfile, 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 b
233. * 二进制字节数组
234. * @return String
235. */
236. public String byte2hex(byte[] b) {
237. String hs = "";
238. String stmp = "";
239. for (int n = 0; n < b.length; n++) {
240. stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
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 hex
253. * @return
254. */
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 src0
267. * byte
268. * @param src1
269. * byte
270. * @return byte
271. */
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 file
285. * 指定写入的文件
286. * @param objs
287. * 要写入的对象
288. */
289. public void doObjToFile(String file, Object[] objs) {
290. ObjectOutputStream oos = null;
291. try {
292. FileOutputStream fos = new FileOutputStream(file);
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 file
311. * 指定的文件
312. * @param i
313. * 从1开始
314. * @return
315. */
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 args
340. */
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. // 利用公匙对签名进行验证。
358. if (jiami.validateSign("mysign.bat")) {
359. System.out.println("Success!");
360. } else {
361. System.out.println("Fail!");
362. }
363. }
364.}
package test;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.*;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
/**
* 加密解密
*
* @author shy.qiu
* @since http://blog.csdn.net/qiushyfm
*/
public class CryptTest {
/**
* 进行MD5加密
*
* @param info
* 要加密的信息
* @return String 加密后的字符串
*/
public String encryptToMD5(String info) {
byte[] digesta = null;
try {
// 得到一个md5的消息摘要
MessageDigest alga = MessageDigest.getInstance("MD5");
// 添加要进行计算摘要的信息
alga.update(info.getBytes());
// 得到该摘要
digesta = alga.digest();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
// 将摘要转为字符串
String rs = byte2hex(digesta);
return rs;
}
/**
* 进行SHA加密
*
* @param info
* 要加密的信息
* @return String 加密后的字符串
*/
public String encryptToSHA(String info) {
byte[] digesta = null;
try {
// 得到一个SHA-1的消息摘要
MessageDigest alga = MessageDigest.getInstance("SHA-1");
// 添加要进行计算摘要的信息
alga.update(info.getBytes());
// 得到该摘要
digesta = alga.digest();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
// 将摘要转为字符串
String rs = byte2hex(digesta);
return rs;
}
// //////////////////////////////////////////////////////////////////////////
/**
* 创建密匙
*
* @param algorithm
* 加密算法,可用 DES,DESede,Blowfish
* @return SecretKey 秘密(对称)密钥
*/
public SecretKey createSecretKey(String algorithm) {
// 声明KeyGenerator对象
KeyGenerator keygen;
// 声明 密钥对象
SecretKey deskey = null;
try {
// 返回生成指定算法的秘密密钥的 KeyGenerator 对象
keygen = KeyGenerator.getInstance(algorithm);
// 生成一个密钥
deskey = keygen.generateKey();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
// 返回密匙
return deskey;
}
/**
* 根据密匙进行DES加密
*
* @param key
* 密匙
* @param info
* 要加密的信息
* @return String 加密后的信息
*/
public String encryptToDES(SecretKey key, String info) {
// 定义 加密算法,可用 DES,DESede,Blowfish
String Algorithm = "DES";
// 加密随机数生成器 (RNG),(可以不写)
SecureRandom sr = new SecureRandom();
// 定义要生成的密文
byte[] cipherByte = null;
try {
// 得到加密/解密器
Cipher c1 = Cipher.getInstance(Algorithm);
// 用指定的密钥和模式初始化Cipher对象
// 参数:(ENCRYPT_MODE, DECRYPT_MODE, WRAP_MODE,UNWRAP_MODE)
c1.init(Cipher.ENCRYPT_MODE, key, sr);
// 对要加密的内容进行编码处理,
cipherByte = c1.doFinal(info.getBytes());
} catch (Exception e) {
e.printStackTrace();
}
// 返回密文的十六进制形式
return byte2hex(cipherByte);
}
/**
* 根据密匙进行DES解密
*
* @param key
* 密匙
* @param sInfo
* 要解密的密文
* @return String 返回解密后信息
*/
public String decryptByDES(SecretKey key, String sInfo) {
// 定义 加密算法,
String Algorithm = "DES";
// 加密随机数生成器 (RNG)
SecureRandom sr = new SecureRandom();
byte[] cipherByte = null;
try {
// 得到加密/解密器
Cipher c1 = Cipher.getInstance(Algorithm);
// 用指定的密钥和模式初始化Cipher对象
c1.init(Cipher.DECRYPT_MODE, key, sr);
// 对要解密的内容进行编码处理
cipherByte = c1.doFinal(hex2byte(sInfo));
} catch (Exception e) {
e.printStackTrace();
}
// return byte2hex(cipherByte);
return new String(cipherByte);
}
// /////////////////////////////////////////////////////////////////////////////
/**
* 创建密匙组,并将公匙,私匙放入到指定文件中
*
* 默认放入mykeys.bat文件中
*/
public void createPairKey() {
try {
// 根据特定的算法一个密钥对生成器
KeyPairGenerator keygen = KeyPairGenerator.getInstance("DSA");
// 加密随机数生成器 (RNG)
SecureRandom random = new SecureRandom();
// 重新设置此随机对象的种子
random.setSeed(1000);
// 使用给定的随机源(和默认的参数集合)初始化确定密钥大小的密钥对生成器
keygen.initialize(512, random);// keygen.initialize(512);
// 生成密钥组
KeyPair keys = keygen.generateKeyPair();
// 得到公匙
PublicKey pubkey = keys.getPublic();
// 得到私匙
PrivateKey prikey = keys.getPrivate();
// 将公匙私匙写入到文件当中
doObjToFile("mykeys.bat", new Object[] { prikey, pubkey });
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
/**
* 利用私匙对信息进行签名 把签名后的信息放入到指定的文件中
*
* @param info
* 要签名的信息
* @param signfile
* 存入的文件
*/
public void signToInfo(String info, String signfile) {
// 从文件当中读取私匙
PrivateKey myprikey = (PrivateKey) getObjFromFile("mykeys.bat", 1);
// 从文件中读取公匙
PublicKey mypubkey = (PublicKey) getObjFromFile("mykeys.bat", 2);
try {
// Signature 对象可用来生成和验证数字签名
Signature signet = Signature.getInstance("DSA");
// 初始化签署签名的私钥
signet.initSign(myprikey);
// 更新要由字节签名或验证的数据
signet.update(info.getBytes());
// 签署或验证所有更新字节的签名,返回签名
byte[] signed = signet.sign();
// 将数字签名,公匙,信息放入文件中
doObjToFile(signfile, new Object[] { signed, mypubkey, info });
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 读取数字签名文件 根据公匙,签名,信息验证信息的合法性
*
* @return true 验证成功 false 验证失败
*/
public boolean validateSign(String signfile) {
// 读取公匙
PublicKey mypubkey = (PublicKey) getObjFromFile(signfile, 2);
// 读取签名
byte[] signed = (byte[]) getObjFromFile(signfile, 1);
// 读取信息
String info = (String) getObjFromFile(signfile, 3);
try {
// 初始一个Signature对象,并用公钥和签名进行验证
Signature signetcheck = Signature.getInstance("DSA");
// 初始化验证签名的公钥
signetcheck.initVerify(mypubkey);
// 使用指定的 byte 数组更新要签名或验证的数据
signetcheck.update(info.getBytes());
System.out.println(info);
// 验证传入的签名
return signetcheck.verify(signed);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 将二进制转化为16进制字符串
*
* @param b
* 二进制字节数组
* @return String
*/
public String byte2hex(byte[] b) {
String hs = "";
String stmp = "";
for (int n = 0; n < b.length; n++) {
stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
if (stmp.length() == 1) {
hs = hs + "0" + stmp;
} else {
hs = hs + stmp;
}
}
return hs.toUpperCase();
}
/**
* 十六进制字符串转化为2进制
*
* @param hex
* @return
*/
public byte[] hex2byte(String hex) {
byte[] ret = new byte[8];
byte[] tmp = hex.getBytes();
for (int i = 0; i < 8; i++) {
ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]);
}
return ret;
}
/**
* 将两个ASCII字符合成一个字节; 如:"EF"--> 0xEF
*
* @param src0
* byte
* @param src1
* byte
* @return byte
*/
public static byte uniteBytes(byte src0, byte src1) {
byte _b0 = Byte.decode("0x" + new String(new byte[] { src0 }))
.byteValue();
_b0 = (byte) (_b0 << 4);
byte _b1 = Byte.decode("0x" + new String(new byte[] { src1 }))
.byteValue();
byte ret = (byte) (_b0 ^ _b1);
return ret;
}
/**
* 将指定的对象写入指定的文件
*
* @param file
* 指定写入的文件
* @param objs
* 要写入的对象
*/
public void doObjToFile(String file, Object[] objs) {
ObjectOutputStream oos = null;
try {
FileOutputStream fos = new FileOutputStream(file);
oos = new ObjectOutputStream(fos);
for (int i = 0; i < objs.length; i++) {
oos.writeObject(objs[i]);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 返回在文件中指定位置的对象
*
* @param file
* 指定的文件
* @param i
* 从1开始
* @return
*/
public Object getObjFromFile(String file, int i) {
ObjectInputStream ois = null;
Object obj = null;
try {
FileInputStream fis = new FileInputStream(file);
ois = new ObjectInputStream(fis);
for (int j = 0; j < i; j++) {
obj = ois.readObject();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return obj;
}
/**
* 测试
*
* @param args
*/
public static void main(String[] args) {
CryptTest jiami = new CryptTest();
// 执行MD5加密"Hello world!"
System.out.println("Hello经过MD5:" + jiami.encryptToMD5("Hello"));
// 生成一个DES算法的密匙
SecretKey key = jiami.createSecretKey("DES");
// 用密匙加密信息"Hello world!"
String str1 = jiami.encryptToDES(key, "Hello");
System.out.println("使用des加密信息Hello为:" + str1);
// 使用这个密匙解密
String str2 = jiami.decryptByDES(key, str1);
System.out.println("解密后为:" + str2);
// 创建公匙和私匙
jiami.createPairKey();
// 对Hello world!使用私匙进行签名
jiami.signToInfo("Hello", "mysign.bat");
// 利用公匙对签名进行验证。
if (jiami.validateSign("mysign.bat")) {
System.out.println("Success!");
} else {
System.out.println("Fail!");
}
}
}
用到的重要的类
javax.crypto.KeyGenerator
public final SecretKey generateKey()生成一个密钥
public static final KeyGenerator getInstance(String algorithm) 返回生成指定算法的秘密密钥的KeyGenerator对象。
javax.crypto 接口 SecretKey
javax.crypto.Cipher 此类为加密和解密提供密码功能。它构成了 Java Cryptographic Extension (JCE) 框架的核心
public final void init(int opmode,Key key)
public final byte[] doFinal(byte[] input) 按单部分操作加密或解密数据,或者结束一个多部分操作
java.security.KeyPairGenerator
static KeyPairGenerator getInstance(String algorithm)
回生成指定算法的 public/private 密钥对的 KeyPairGenerator 对象。
java.security.Signature
使用 Signature 对象签名数据或验证签名包括以下三个阶段:
1:初始化,使用
初始化验证签名的公钥(请参见 initVerify),或使用
初始化签署签名的私钥(也可以选择“安全随机数生成器”)initSign(PrivateKey)和initSign(PrivateKey, SecureRandom))。
2:更新
根据初始化类型,这可更新要签名或验证的字节。请参见 update 方法。
3:签署或验证所有更新字节的签名。请参见 sign 方法和 verify 方法。
1:消息摘要:(数字指纹):既对一个任意长度的一个数据块进行计算,产生一个唯一指纹。MD5/SHA1
发送给其他人你的信息和摘要,其他人用相同的加密方法得到摘要,最后进行比较摘要是否相同。
2:单匙密码体制:DES:比较简便高效,密钥简短,加解密速度快,破译极其困难,但其安全性依赖于密匙的安全性。
DES(Data Encryption Standard)是发明最早的最广泛使用的分组对称加密算法。DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密
3:数字签名:就是信息发送者用其私钥对从所传报文中提取出的特征数据(或称数字指纹)进行RSA算法操作,以保证发信人无法抵赖曾发过该信息(即不可抵赖性),同时也确保信息报文在经签名后末被篡改(即完整性)。当信息接收者收到报文后,就可以用发送者的公钥对数字签名进行验证。
代表:DSA
4:非对称密匙密码体制(公匙体系):加密密匙不同于解密密匙,加密密匙公之于众,谁都可以使用,解密密匙只有解密人自己知道。代表: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.qiu
15. * @since http://blog.csdn.net/qiushyfm
16. */
17.public class CryptTest {
18. /**
19. * 进行MD5加密
20. *
21. * @param info
22. * 要加密的信息
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 info
45. * 要加密的信息
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 algorithm
69. * 加密算法,可用 DES,DESede,Blowfish
70. * @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 key
92. * 密匙
93. * @param info
94. * 要加密的信息
95. * @return String 加密后的信息
96. */
97. public String encryptToDES(SecretKey key, String info) {
98. // 定义 加密算法,可用 DES,DESede,Blowfish
99. 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 key
122. * 密匙
123. * @param sInfo
124. * 要解密的密文
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.getInstance("DSA");
156. // 加密随机数生成器 (RNG)
157. SecureRandom random = new SecureRandom();
158. // 重新设置此随机对象的种子
159. random.setSeed(1000);
160. // 使用给定的随机源(和默认的参数集合)初始化确定密钥大小的密钥对生成器
161. keygen.initialize(512, random);// keygen.initialize(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[] { prikey, pubkey });
170. } catch (NoSuchAlgorithmException e) {
171. e.printStackTrace();
172. }
173. }
174. /**
175. * 利用私匙对信息进行签名 把签名后的信息放入到指定的文件中
176. *
177. * @param info
178. * 要签名的信息
179. * @param signfile
180. * 存入的文件
181. */
182. public void signToInfo(String info, String signfile) {
183. // 从文件当中读取私匙
184. PrivateKey myprikey = (PrivateKey) getObjFromFile("mykeys.bat", 1);
185. // 从文件中读取公匙
186. PublicKey mypubkey = (PublicKey) getObjFromFile("mykeys.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, mypubkey, 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(signfile, 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 b
233. * 二进制字节数组
234. * @return String
235. */
236. public String byte2hex(byte[] b) {
237. String hs = "";
238. String stmp = "";
239. for (int n = 0; n < b.length; n++) {
240. stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
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 hex
253. * @return
254. */
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 src0
267. * byte
268. * @param src1
269. * byte
270. * @return byte
271. */
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 file
285. * 指定写入的文件
286. * @param objs
287. * 要写入的对象
288. */
289. public void doObjToFile(String file, Object[] objs) {
290. ObjectOutputStream oos = null;
291. try {
292. FileOutputStream fos = new FileOutputStream(file);
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 file
311. * 指定的文件
312. * @param i
313. * 从1开始
314. * @return
315. */
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 args
340. */
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. // 利用公匙对签名进行验证。
358. if (jiami.validateSign("mysign.bat")) {
359. System.out.println("Success!");
360. } else {
361. System.out.println("Fail!");
362. }
363. }
364.}
package test;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.*;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
/**
* 加密解密
*
* @author shy.qiu
* @since http://blog.csdn.net/qiushyfm
*/
public class CryptTest {
/**
* 进行MD5加密
*
* @param info
* 要加密的信息
* @return String 加密后的字符串
*/
public String encryptToMD5(String info) {
byte[] digesta = null;
try {
// 得到一个md5的消息摘要
MessageDigest alga = MessageDigest.getInstance("MD5");
// 添加要进行计算摘要的信息
alga.update(info.getBytes());
// 得到该摘要
digesta = alga.digest();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
// 将摘要转为字符串
String rs = byte2hex(digesta);
return rs;
}
/**
* 进行SHA加密
*
* @param info
* 要加密的信息
* @return String 加密后的字符串
*/
public String encryptToSHA(String info) {
byte[] digesta = null;
try {
// 得到一个SHA-1的消息摘要
MessageDigest alga = MessageDigest.getInstance("SHA-1");
// 添加要进行计算摘要的信息
alga.update(info.getBytes());
// 得到该摘要
digesta = alga.digest();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
// 将摘要转为字符串
String rs = byte2hex(digesta);
return rs;
}
// //////////////////////////////////////////////////////////////////////////
/**
* 创建密匙
*
* @param algorithm
* 加密算法,可用 DES,DESede,Blowfish
* @return SecretKey 秘密(对称)密钥
*/
public SecretKey createSecretKey(String algorithm) {
// 声明KeyGenerator对象
KeyGenerator keygen;
// 声明 密钥对象
SecretKey deskey = null;
try {
// 返回生成指定算法的秘密密钥的 KeyGenerator 对象
keygen = KeyGenerator.getInstance(algorithm);
// 生成一个密钥
deskey = keygen.generateKey();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
// 返回密匙
return deskey;
}
/**
* 根据密匙进行DES加密
*
* @param key
* 密匙
* @param info
* 要加密的信息
* @return String 加密后的信息
*/
public String encryptToDES(SecretKey key, String info) {
// 定义 加密算法,可用 DES,DESede,Blowfish
String Algorithm = "DES";
// 加密随机数生成器 (RNG),(可以不写)
SecureRandom sr = new SecureRandom();
// 定义要生成的密文
byte[] cipherByte = null;
try {
// 得到加密/解密器
Cipher c1 = Cipher.getInstance(Algorithm);
// 用指定的密钥和模式初始化Cipher对象
// 参数:(ENCRYPT_MODE, DECRYPT_MODE, WRAP_MODE,UNWRAP_MODE)
c1.init(Cipher.ENCRYPT_MODE, key, sr);
// 对要加密的内容进行编码处理,
cipherByte = c1.doFinal(info.getBytes());
} catch (Exception e) {
e.printStackTrace();
}
// 返回密文的十六进制形式
return byte2hex(cipherByte);
}
/**
* 根据密匙进行DES解密
*
* @param key
* 密匙
* @param sInfo
* 要解密的密文
* @return String 返回解密后信息
*/
public String decryptByDES(SecretKey key, String sInfo) {
// 定义 加密算法,
String Algorithm = "DES";
// 加密随机数生成器 (RNG)
SecureRandom sr = new SecureRandom();
byte[] cipherByte = null;
try {
// 得到加密/解密器
Cipher c1 = Cipher.getInstance(Algorithm);
// 用指定的密钥和模式初始化Cipher对象
c1.init(Cipher.DECRYPT_MODE, key, sr);
// 对要解密的内容进行编码处理
cipherByte = c1.doFinal(hex2byte(sInfo));
} catch (Exception e) {
e.printStackTrace();
}
// return byte2hex(cipherByte);
return new String(cipherByte);
}
// /////////////////////////////////////////////////////////////////////////////
/**
* 创建密匙组,并将公匙,私匙放入到指定文件中
*
* 默认放入mykeys.bat文件中
*/
public void createPairKey() {
try {
// 根据特定的算法一个密钥对生成器
KeyPairGenerator keygen = KeyPairGenerator.getInstance("DSA");
// 加密随机数生成器 (RNG)
SecureRandom random = new SecureRandom();
// 重新设置此随机对象的种子
random.setSeed(1000);
// 使用给定的随机源(和默认的参数集合)初始化确定密钥大小的密钥对生成器
keygen.initialize(512, random);// keygen.initialize(512);
// 生成密钥组
KeyPair keys = keygen.generateKeyPair();
// 得到公匙
PublicKey pubkey = keys.getPublic();
// 得到私匙
PrivateKey prikey = keys.getPrivate();
// 将公匙私匙写入到文件当中
doObjToFile("mykeys.bat", new Object[] { prikey, pubkey });
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
/**
* 利用私匙对信息进行签名 把签名后的信息放入到指定的文件中
*
* @param info
* 要签名的信息
* @param signfile
* 存入的文件
*/
public void signToInfo(String info, String signfile) {
// 从文件当中读取私匙
PrivateKey myprikey = (PrivateKey) getObjFromFile("mykeys.bat", 1);
// 从文件中读取公匙
PublicKey mypubkey = (PublicKey) getObjFromFile("mykeys.bat", 2);
try {
// Signature 对象可用来生成和验证数字签名
Signature signet = Signature.getInstance("DSA");
// 初始化签署签名的私钥
signet.initSign(myprikey);
// 更新要由字节签名或验证的数据
signet.update(info.getBytes());
// 签署或验证所有更新字节的签名,返回签名
byte[] signed = signet.sign();
// 将数字签名,公匙,信息放入文件中
doObjToFile(signfile, new Object[] { signed, mypubkey, info });
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 读取数字签名文件 根据公匙,签名,信息验证信息的合法性
*
* @return true 验证成功 false 验证失败
*/
public boolean validateSign(String signfile) {
// 读取公匙
PublicKey mypubkey = (PublicKey) getObjFromFile(signfile, 2);
// 读取签名
byte[] signed = (byte[]) getObjFromFile(signfile, 1);
// 读取信息
String info = (String) getObjFromFile(signfile, 3);
try {
// 初始一个Signature对象,并用公钥和签名进行验证
Signature signetcheck = Signature.getInstance("DSA");
// 初始化验证签名的公钥
signetcheck.initVerify(mypubkey);
// 使用指定的 byte 数组更新要签名或验证的数据
signetcheck.update(info.getBytes());
System.out.println(info);
// 验证传入的签名
return signetcheck.verify(signed);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 将二进制转化为16进制字符串
*
* @param b
* 二进制字节数组
* @return String
*/
public String byte2hex(byte[] b) {
String hs = "";
String stmp = "";
for (int n = 0; n < b.length; n++) {
stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
if (stmp.length() == 1) {
hs = hs + "0" + stmp;
} else {
hs = hs + stmp;
}
}
return hs.toUpperCase();
}
/**
* 十六进制字符串转化为2进制
*
* @param hex
* @return
*/
public byte[] hex2byte(String hex) {
byte[] ret = new byte[8];
byte[] tmp = hex.getBytes();
for (int i = 0; i < 8; i++) {
ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]);
}
return ret;
}
/**
* 将两个ASCII字符合成一个字节; 如:"EF"--> 0xEF
*
* @param src0
* byte
* @param src1
* byte
* @return byte
*/
public static byte uniteBytes(byte src0, byte src1) {
byte _b0 = Byte.decode("0x" + new String(new byte[] { src0 }))
.byteValue();
_b0 = (byte) (_b0 << 4);
byte _b1 = Byte.decode("0x" + new String(new byte[] { src1 }))
.byteValue();
byte ret = (byte) (_b0 ^ _b1);
return ret;
}
/**
* 将指定的对象写入指定的文件
*
* @param file
* 指定写入的文件
* @param objs
* 要写入的对象
*/
public void doObjToFile(String file, Object[] objs) {
ObjectOutputStream oos = null;
try {
FileOutputStream fos = new FileOutputStream(file);
oos = new ObjectOutputStream(fos);
for (int i = 0; i < objs.length; i++) {
oos.writeObject(objs[i]);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 返回在文件中指定位置的对象
*
* @param file
* 指定的文件
* @param i
* 从1开始
* @return
*/
public Object getObjFromFile(String file, int i) {
ObjectInputStream ois = null;
Object obj = null;
try {
FileInputStream fis = new FileInputStream(file);
ois = new ObjectInputStream(fis);
for (int j = 0; j < i; j++) {
obj = ois.readObject();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return obj;
}
/**
* 测试
*
* @param args
*/
public static void main(String[] args) {
CryptTest jiami = new CryptTest();
// 执行MD5加密"Hello world!"
System.out.println("Hello经过MD5:" + jiami.encryptToMD5("Hello"));
// 生成一个DES算法的密匙
SecretKey key = jiami.createSecretKey("DES");
// 用密匙加密信息"Hello world!"
String str1 = jiami.encryptToDES(key, "Hello");
System.out.println("使用des加密信息Hello为:" + str1);
// 使用这个密匙解密
String str2 = jiami.decryptByDES(key, str1);
System.out.println("解密后为:" + str2);
// 创建公匙和私匙
jiami.createPairKey();
// 对Hello world!使用私匙进行签名
jiami.signToInfo("Hello", "mysign.bat");
// 利用公匙对签名进行验证。
if (jiami.validateSign("mysign.bat")) {
System.out.println("Success!");
} else {
System.out.println("Fail!");
}
}
}
用到的重要的类
javax.crypto.KeyGenerator
public final SecretKey generateKey()生成一个密钥
public static final KeyGenerator getInstance(String algorithm) 返回生成指定算法的秘密密钥的KeyGenerator对象。
javax.crypto 接口 SecretKey
javax.crypto.Cipher 此类为加密和解密提供密码功能。它构成了 Java Cryptographic Extension (JCE) 框架的核心
public final void init(int opmode,Key key)
public final byte[] doFinal(byte[] input) 按单部分操作加密或解密数据,或者结束一个多部分操作
java.security.KeyPairGenerator
static KeyPairGenerator getInstance(String algorithm)
回生成指定算法的 public/private 密钥对的 KeyPairGenerator 对象。
java.security.Signature
使用 Signature 对象签名数据或验证签名包括以下三个阶段:
1:初始化,使用
初始化验证签名的公钥(请参见 initVerify),或使用
初始化签署签名的私钥(也可以选择“安全随机数生成器”)initSign(PrivateKey)和initSign(PrivateKey, SecureRandom))。
2:更新
根据初始化类型,这可更新要签名或验证的字节。请参见 update 方法。
3:签署或验证所有更新字节的签名。请参见 sign 方法和 verify 方法。
发表评论
-
2014读书总结
2015-01-11 16:10 1755原文刊于本人博客。 20 ... -
Maven编译时两则信息 (Workspace以及default classpath container)
2013-09-18 15:14 5508使用Maven一年有余,却总是被两则不起眼的编译信息困扰,终想 ... -
Java中未被初始化的字符串打印出“null”的问题的分析
2013-05-07 09:16 5860今天在研究Java面试题的时候发现了这道题,觉得挺有意思,记录 ... -
搬家鸟
2013-03-13 21:26 1080买了个域名,搭了个博客,http://www.liubey.o ... -
深入浅出Maven:创建普通及Web项目、使用Profile进行资源过滤
2012-10-09 23:36 72871:Maven的选择和配置 目前Maven主流版本包括Mav ... -
SUSE10.2 安装java_JDK1.6
2011-01-26 14:02 2416首先先去java.sun.com下载最新的jdk 我下载的是j ... -
利用HTTPCLIENT操作人人网:登陆,发布状态,随意访问任何人等
2010-12-12 09:38 122这几天研究了一下httpclient,使用它操作人人网做一些事 ... -
break和continue
2010-11-17 10:02 1168break是指强制退出,不执行循环中剩余部分代码,而conti ... -
继承时候的初始化顺序
2010-09-19 09:28 11461. 父类--静态变量 2. 父类--静态初始化块 3. 子类 ... -
一些数据结构的知识
2010-09-17 11:03 12491:ArrayList使用数组实现List接口,所以对于快速的 ... -
JavaScript操作cookie一例
2010-07-27 09:14 1005[code="html] <html> ... -
数据结构之栈 队列 优先级队列 简单小结
2010-07-19 15:00 22391。栈、队列和优先级队列是经常用于简化某些程序操作的数据结构。 ... -
利用数据结构中的栈实现单词的反转
2010-07-16 15:40 1622package com.javaeye.liubey.al ... -
“不变"和“只读"的区别
2010-07-12 10:03 953“不变”(Immutable)与“只读”(Read Only) ... -
一个帐号同一时间只能一个人登录
2010-07-12 09:14 970对于一个帐号在同一时间只能一个人登录,可以通过下面的方法实现: ... -
JpetStore中MVC机制实现的研究,BeanAction以及BaseBean工作机制(看完有种恍然大悟的感觉啊!)
2010-07-07 16:57 2183以前学习iBATIS时候只是粗略的看了一下代码,今天翻出来从新 ... -
jdk源代码中有关日期比较
2010-07-07 09:31 1089public int compareTo(Date anoth ... -
String.intern方法
2010-07-06 17:06 1067以前没有注意到这个方法,看effective Java时候发现 ... -
Java 专业人士必备的书籍和网站列表
2010-07-06 13:17 1088这些都是您书架上必备的书和应该经常使用的 Web 链接。时 ... -
2010 年 Java 平台圆桌会议---展望 Java 行业的未来
2010-07-06 08:37 1278简介: Java™ 平台以稳定著称,其社区却相当活跃,但这并不 ...
相关推荐
java加密和解密的方法,利用指定的密钥,可逆的。密钥必须16位。
2. Java加密库:JCA(Java Cryptography Architecture) - JCA提供了统一的接口来支持各种加密算法,如Cipher类用于加解密,KeyGenerator用于生成密钥,MessageDigest用于哈希计算。 - Java的Provider机制允许...
本实例将聚焦于JAVA数据加密解密的实践应用。 首先,让我们理解加密和解密的基本概念。加密是一种将明文(可读信息)转化为密文(不可读信息)的过程,以保护数据不被未经授权的用户访问。解密则是加密的逆过程,将...
Java加密解密工具包,通常用于保护敏感数据的安全,防止未经授权的访问或篡改。这个名为"JCT"的工具包提供了丰富的功能,使得开发者在Java应用中集成加密和解密操作变得更加简单。下面我们将详细探讨Java加密的相关...
本次使用JAVA语言,采用3DES加密算法进行对文本文件的加密,通过二进制和十六进制的转换来实现,产生加密文件,再对加密文件进行解密。 关键词:DES加密算法、加密、解密。摘要 随着现代网络技术的飞速发展,人们...
Java加密解密工具是开发过程中不可或缺的部分,尤其是在处理敏感数据时,确保数据的安全性至关重要。在Java中,我们可以使用各种库和内置API来实现加密和解密操作。本篇文章将深入探讨Java加密解密的核心概念、常用...
Java 作为一种广泛使用的编程语言,在处理敏感数据时提供了多种加密解密手段来确保信息安全。本文将深入探讨 Java 中实现加密解密的核心概念和技术细节。 #### 二、Java 加密解密基础知识 ##### 2.1 加密算法类型 ...
"java实现文件加密解密" Java 实现文件的加密与解密是指利用 Java 语言将资源文件(包括图片、动画等类型)进行简单的加密和解密。这种策略的原因和好处是将准备好的资源存储在云上,使用时通过网络进行读取即可,...
2. **Java加密API** - **Java Cryptography Extension (JCE)**:Java提供的一套用于加密、解密、数字签名等的库,包括Cipher、KeyGenerator、SecretKey、PublicKey、PrivateKey等类。 - **Java Cryptography ...
Java实现的RSA加密解密算法示例 本文主要介绍了Java实现的RSA加密解密算法,结合实例形式分析了Java RSA加密解密算法的相关实现技巧。 知识点1:RSA加密解密算法简介 RSA加密解密算法是一种非对称加密算法,由Ron...
总的来说,C#和Java之间的RSA加密解密通信涉及到多方面的知识,包括非对称加密原理、公钥私钥的生成和管理、不同编程语言间的互操作、数据安全传输以及可能的错误处理策略。掌握这些知识对于开发跨平台、高安全性的...
在Java编程环境中,处理文件的压缩与解压缩是常见的任务,而涉及到安全性,加密和解密就显得尤为重要。本文将详细讲解如何使用Java实现ZIP压缩包的加密与解密。 首先,我们需要理解加密的基本概念。加密是将明文...
Java文本加密解密是计算机编程领域中的一个重要主题,特别是在数据安全和信息安全方面。在这个课程设计中,我们将使用Java语言来实现一个简单的文本加解密系统,该系统具有图形用户界面(GUI),使得用户能够方便地...
JAVA也是通过包来实现加密和解密的,那么我的C++是通过OPENSSL的库来实现的。 重点来到了:RSA使用过程 1、C++随机生成一对公钥和私钥 2、JAVA用公钥给明文打包形成密文 3、C++用私钥解密密文
主要是利用Java自带的方法进行加密和解密
在给定的压缩包文件中,包含了几个常见的加密解密算法及其相关的源代码,包括SHA1、CRC32、IDEA和AES。接下来,我们将深入探讨这些算法的工作原理、应用以及它们在信息安全中的重要性。 首先,SHA1(安全哈希算法1...
排列码是一种在信息安全领域常用的编码方式,主要用于数据的加密与解密。它的基本思想是将原始数据通过特定的算法进行编码,使得数据在传输或存储过程中不易被破解,增加了数据的安全性。在Java中实现排列码,我们...
在Java编程语言中,公钥和私钥加密解密是一种重要的安全技术,广泛应用于网络通信、数据传输等领域。本文将详细解析如何使用Java实现公钥和私钥的加解密操作,以及相关的关键概念和代码示例。 首先,我们要了解公钥...
"加密和解密文件"的主题涉及到信息安全的核心技术,它确保了数据在未经授权的情况下无法被访问或理解。这里的描述提到这是一个带有图形用户界面(GUI)的工具,这使得用户能够更加直观和便捷地操作加密和解密过程,...
java 安卓 同步加密解密,使用私钥加密 解密。增加数据传输安全度