Java中常⽤的加密⽅法(JDK)
Java代码
1. //KeyGenerator 提供对称密钥⽣成器的功能,⽀持各种算法
2. private KeyGenerator keygen;
3. //SecretKey 负责保存对称密钥
4. private SecretKey deskey;
5. //Cipher负责完成加密或解密⼯作
6. private Cipher c;
7. //该字节数组负责保存加密的结果
8. private byte[] cipherByte;
在构造函数中初始化
Java代码
1. Security.addProvider(new pto.provider.SunJCE());
2. //实例化⽀持DES算法的密钥⽣成器(算法名称命名需按规定,否则抛出异常)
3. keygen = Instance("DES");//
4. //⽣成密钥
5. deskey = ateKey();
6. //⽣成Cipher对象,指定其⽀持的DES算法
7. c = Instance("DES");
1. DES算法为密码体制中的对称密码体制,⼜被成为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。明⽂按64位进⾏分组, 密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1)分组后的明⽂组和56位的密钥按位替代或交换的⽅法形成密⽂组的加密⽅法。
Java代码
1. import java.security.InvalidKeyException;
2. import java.security.NoSuchAlgorithmException;
3. import java.security.Security;
4.
5. pto.BadPaddingException;
6. pto.Cipher;
7. pto.IllegalBlockSizeException;
8. pto.KeyGenerator;
9. pto.NoSuchPaddingException;
10. pto.SecretKey;
11.
12. public class EncrypDES {
13.
14. //KeyGenerator 提供对称密钥⽣成器的功能,⽀持各种算法
15. private KeyGenerator keygen;
16. //SecretKey 负责保存对称密钥
17. private SecretKey deskey;
18. //Cipher负责完成加密或解密⼯作
19. private Cipher c;
20. //该字节数组负责保存加密的结果
21. private byte[] cipherByte;
22.
23. public EncrypDES() throws NoSuchAlgorithmException, NoSuchPaddingException{
24. Security.addProvider(new pto.provider.SunJCE());
25. //实例化⽀持DES算法的密钥⽣成器(算法名称命名需按规定,否则抛出异常)
26. keygen = Instance("DES");
27. //⽣成密钥
28. deskey = ateKey();
29. //⽣成Cipher对象,指定其⽀持的DES算法
30. c = Instance("DES");
31. }
32.
33. /**
34. * 对字符串加密
35. *
36. * @param str
37. * @return
38. * @throws InvalidKeyException
39. * @throws IllegalBlockSizeException
40. * @throws BadPaddingException
41. */
42. public byte[] Encrytor(String str) throws InvalidKeyException,
43. IllegalBlockSizeException, BadPaddingException {
44. // 根据密钥,对Cipher对象进⾏初始化,ENCRYPT_MODE表⽰加密模式
45. c.init(Cipher.ENCRYPT_MODE, deskey);
46. byte[] src = Bytes();
47. // 加密,结果保存进cipherByte
48. cipherByte = c.doFinal(src);
49. return cipherByte;
50. }
51.
52. /**
53. * 对字符串解密
54. *
55. * @param buff
56. * @return
57. * @throws InvalidKeyException
58. * @throws IllegalBlockSizeException
59. * @throws BadPaddingException
60. */
61. public byte[] Decryptor(byte[] buff) throws InvalidKeyException,
66. return cipherByte;
67. }
68.
69. /**
70. * @param args
71. * @throws NoSuchPaddingException
72. * @throws NoSuchAlgorithmException
73. * @throws BadPaddingException
74. * @throws IllegalBlockSizeException
75. * @throws InvalidKeyException
76. */
77. public static void main(String[] args) throws Exception {
78. EncrypDES de1 = new EncrypDES();
79. String msg ="郭XX-搞笑相声全集";
80. byte[] encontent = de1.Encrytor(msg);
81. byte[] decontent = de1.Decryptor(encontent);
82. System.out.println("明⽂是:" + msg);
83. System.out.println("加密后:" + new String(encontent));
84. System.out.println("解密后:" + new String(decontent));
85. }
86.
87. }
2. 3DES⼜称Triple DES,是DES加密算法的⼀种模式,它使⽤3条56位的密钥对3DES
数据进⾏三次加密。数据加密标准(DES)是美国的⼀种由来已久的加密标准,它使⽤对称密钥加密法,并于1981年被ANSI组织规范为ANSI X.3.92。DES使⽤56位密钥和密码块的⽅法,⽽在密码块的⽅法中,⽂本被分成64位⼤⼩的⽂本块然后再进⾏加密。⽐起最初的DES,3DES更为安全。
3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标
准),是DES的⼀个更安全的变形。它以DES为基本模块,通过组合分组⽅法设计出分组加密算法,其具体实现如下:
设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使⽤的密钥,P代表明⽂,C代表密⽂,
这样,
3DES加密过程为:C=Ek3(Dk2(Ek1(P)))
3DES解密过程为:P=Dk1((EK2(Dk3(C)))
Java代码
1. import java.security.InvalidKeyException;
2. import java.security.NoSuchAlgorithmException;
3. import java.security.Security;
4.
5. pto.BadPaddingException;
6. pto.Cipher;
7. pto.IllegalBlockSizeException;
8. pto.KeyGenerator;
9. pto.NoSuchPaddingException;
10. pto.SecretKey;
11.
12. public class EncrypDES3 {
13.
14. // KeyGenerator 提供对称密钥⽣成器的功能,⽀持各种算法
15. private KeyGenerator keygen;
16. // SecretKey 负责保存对称密钥
17. private SecretKey deskey;
18. // Cipher负责完成加密或解密⼯作
19. private Cipher c;
20. // 该字节数组负责保存加密的结果
21. private byte[] cipherByte;
22.
23. public EncrypDES3() throws NoSuchAlgorithmException, NoSuchPaddingException {
24. Security.addProvider(new pto.provider.SunJCE());
25. // 实例化⽀持DES算法的密钥⽣成器(算法名称命名需按规定,否则抛出异常)
26. keygen = Instance("DESede");
27. // ⽣成密钥
28. deskey = ateKey();
29. // ⽣成Cipher对象,指定其⽀持的DES算法
30. c = Instance("DESede");
31. }
32.
33. /**
34. * 对字符串加密
35. *
36. * @param str
37. * @return
38. * @throws InvalidKeyException
39. * @throws IllegalBlockSizeException
40. * @throws BadPaddingException
41. */
42. public byte[] Encrytor(String str) throws InvalidKeyException,
43. IllegalBlockSizeException, BadPaddingException {
44. // 根据密钥,对Cipher对象进⾏初始化,ENCRYPT_MODE表⽰加密模式
45. c.init(Cipher.ENCRYPT_MODE, deskey);
46. byte[] src = Bytes();
47. // 加密,结果保存进cipherByte
48. cipherByte = c.doFinal(src);
49. return cipherByte;
50. }
51.
52. /**
53. * 对字符串解密
54. *
55. * @param buff
56. * @return
57. * @throws InvalidKeyException
58. * @throws IllegalBlockSizeException
59. * @throws BadPaddingException
68.
69. /**
70. * @param args
71. * @throws NoSuchPaddingException
72. * @throws NoSuchAlgorithmException
73. * @throws BadPaddingException
74. * @throws IllegalBlockSizeException
75. * @throws InvalidKeyException
76. */
77. public static void main(String[] args) throws Exception {
78. EncrypDES3 des = new EncrypDES3();
79. String msg ="郭XX-搞笑相声全集";
80. byte[] encontent = des.Encrytor(msg);
81. byte[] decontent = des.Decryptor(encontent);
82. System.out.println("明⽂是:" + msg);
83. System.out.println("加密后:" + new String(encontent));
84. System.out.println("解密后:" + new String(decontent));
85.
86. }
87.
88. }
3. AES密码学中的⾼级加密标准(Advanced Encryption Standard,AES),⼜称⾼级加密标准
Rijndael加密法,是美国联邦政府采⽤的⼀种区块加密标准。这个标准⽤来替代原先的DES,已经被多⽅分析且⼴为全世界所使⽤。经过五年的甄选流程,⾼级加密标准由美国国家标准与技术研究院(NIST)于2001年11⽉26⽇发布于FIPS PUB 197,并在2002年5⽉26⽇成为有效的标准。2006年,⾼级加密标准已然成为对称密钥加密中最流⾏的算法之⼀。 该算法为⽐利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijndael之命名之,投稿⾼级加密标准的甄选流程。(Rijdael的发⾳近于 "Rhinedoll"。)
Java代码
1. import java.security.InvalidKeyException;
2. import java.security.NoSuchAlgorithmException;
3. import java.security.Security;
4.
5. pto.BadPaddingException;
6. pto.Cipher;
7. pto.IllegalBlockSizeException;
8. pto.KeyGenerator;
9. pto.NoSuchPaddingException;
10. pto.SecretKey;
11.
12. public class EncrypAES {
13.
14. //KeyGenerator 提供对称密钥⽣成器的功能,⽀持各种算法
15. private KeyGenerator keygen;
16. //SecretKey 负责保存对称密钥
17. private SecretKey deskey;
18. //Cipher负责完成加密或解密⼯作
19. private Cipher c;
20. //该字节数组负责保存加密的结果
21. private byte[] cipherByte;
22.
23. public EncrypAES() throws NoSuchAlgorithmException, NoSuchPaddingException{
24. Security.addProvider(new pto.provider.SunJCE());
25. //实例化⽀持DES算法的密钥⽣成器(算法名称命名需按规定,否则抛出异常)
26. keygen = Instance("AES");
27. //⽣成密钥
28. deskey = ateKey();
29. //⽣成Cipher对象,指定其⽀持的DES算法
30. c = Instance("AES");
31. }
32.
33. /**
34. * 对字符串加密
35. *
36. * @param str
37. * @return
38. * @throws InvalidKeyException
39. * @throws IllegalBlockSizeException
40. * @throws BadPaddingException
41. */
42. public byte[] Encrytor(String str) throws InvalidKeyException,
43. IllegalBlockSizeException, BadPaddingException {
44. // 根据密钥,对Cipher对象进⾏初始化,ENCRYPT_MODE表⽰加密模式
45. c.init(Cipher.ENCRYPT_MODE, deskey);
46. byte[] src = Bytes();
47. // 加密,结果保存进cipherByte
48. cipherByte = c.doFinal(src);
49. return cipherByte;
50. }
51.
52. /**
53. * 对字符串解密
54. *
55. * @param buff
56. * @return
57. * @throws InvalidKeyException
58. * @throws IllegalBlockSizeException
59. * @throws BadPaddingException
68.
69. /**
70. * @param args
71. * @throws NoSuchPaddingException
72. * @throws NoSuchAlgorithmException
73. * @throws BadPaddingException
74. * @throws IllegalBlockSizeException
75. * @throws InvalidKeyException
76. */
77. public static void main(String[] args) throws Exception {
78. EncrypAES de1 = new EncrypAES();
79. String msg ="郭XX-搞笑相声全集";
80. byte[] encontent = de1.Encrytor(msg);
81. byte[] decontent = de1.Decryptor(encontent);
82. System.out.println("明⽂是:" + msg);
83. System.out.println("加密后:" + new String(encontent));
84. System.out.println("解密后:" + new String(decontent));
85. }
86.
87. }
(⼆)、⾮对称加密
1976年,美国学者Dime和Henman为解决信息公开传送和密钥管理问题,提出⼀种新的密钥交换协议,允许在不安全的媒体上的通讯双⽅交换信息,安全地达成⼀致的密钥,这
就是“公开密钥系统”。相对于“对称加密算法”这种⽅法也叫做“⾮对称加密算法”。与对称加密算法不同,⾮对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥
(privatekey)。公开密钥与私有密钥是⼀对,如果⽤公开密钥对数据进⾏加密,只有⽤对应的私有密钥才能解密;如果⽤私有密钥对数据进⾏加密,那么只有⽤对应的公开密
钥才能解密。因为加密和解密使⽤的是两个不同的密钥,所以这种算法叫作⾮对称加密算法。
1. RSA 公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国⿇省理⼯学院)开发的。RSA取名来⾃开发他们三者的名字。RSA是⽬前最有影响⼒的公钥
加密算法,它能够抵抗到⽬前为⽌已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于⼀个⼗分简单的数论事实:将两个⼤素数相乘⼗分容易,但那时想要
对其乘积进⾏因式分解却极其困难,因此可以将乘积公开作为加密密钥。
Java代码
1. import java.security.InvalidKeyException;
2. import java.security.KeyPair;
3. import java.security.KeyPairGenerator;
4. import java.security.NoSuchAlgorithmException;
5. import java.security.interfaces.RSAPrivateKey;
6. import java.security.interfaces.RSAPublicKey;
7.
8. pto.BadPaddingException;
9. pto.Cipher;
10. pto.IllegalBlockSizeException;
11. pto.NoSuchPaddingException;
12.
13. public class EncrypRSA {
14.
15. /**
16. * 加密
17. * @param publicKey
18. * @param srcBytes
19. * @return
20. * @throws NoSuchAlgorithmException
21. * @throws NoSuchPaddingException
22. * @throws InvalidKeyException
23. * @throws IllegalBlockSizeException
24. * @throws BadPaddingException
25. */
26. protected byte[] encrypt(RSAPublicKey publicKey,byte[] srcBytes) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingE
27. if(publicKey!=null){
28. //Cipher负责完成加密或解密⼯作,基于RSA
29. Cipher cipher = Instance("RSA");
30. //根据公钥,对Cipher对象进⾏初始化
31. cipher.init(Cipher.ENCRYPT_MODE, publicKey);
32. byte[] resultBytes = cipher.doFinal(srcBytes);
33. return resultBytes;
34. }
35. return null;
36. }
37.
38. /**
39. * 解密
40. * @param privateKey
41. * @param srcBytes
42. * @return
43. * @throws NoSuchAlgorithmException
44. * @throws NoSuchPaddingException
45. * @throws InvalidKeyException
java加密方式有哪些46. * @throws IllegalBlockSizeException
47. * @throws BadPaddingException
48. */
49. protected byte[] decrypt(RSAPrivateKey privateKey,byte[] srcBytes) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddin
50. if(privateKey!=null){
51. //Cipher负责完成加密或解密⼯作,基于RSA
52. Cipher cipher = Instance("RSA");
53. //根据公钥,对Cipher对象进⾏初始化
54. cipher.init(Cipher.DECRYPT_MODE, privateKey);
55. byte[] resultBytes = cipher.doFinal(srcBytes);
56. return resultBytes;
57. }
62. * @param args
63. * @throws NoSuchAlgorithmException
64. * @throws BadPaddingException
65. * @throws IllegalBlockSizeException
66. * @throws NoSuchPaddingException
67. * @throws InvalidKeyException
68. */
69. public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {
70. EncrypRSA rsa = new EncrypRSA();
71. String msg = "郭XX-精品相声";
72. //KeyPairGenerator类⽤于⽣成公钥和私钥对,基于RSA算法⽣成对象
73. KeyPairGenerator keyPairGen = Instance("RSA");
74. //初始化密钥对⽣成器,密钥⼤⼩为1024位
75. keyPairGen.initialize(1024);
76. //⽣成⼀个密钥对,保存在keyPair中
77. KeyPair keyPair = ateKeyPair();
78. //得到私钥
79. RSAPrivateKey privateKey = (Private();
80. //得到公钥
81. RSAPublicKey publicKey = (Public();
82.
83. //⽤公钥加密
84. byte[] srcBytes = Bytes();
85. byte[] resultBytes = pt(publicKey, srcBytes);
86.
87. //⽤私钥解密
88. byte[] decBytes = rsa.decrypt(privateKey, resultBytes);
89.
90. System.out.println("明⽂是:" + msg);
91. System.out.println("加密后是:" + new String(resultBytes));
92. System.out.println("解密后是:" + new String(decBytes));
93. }
94.
95. }
Mysql代码
1. mysql> INSERT INTO users (username,password) VALUES ('joe',ENCODE('guessme','abr'));
2.
3. Query OK, 1 row affected (0.14 sec)
其中,Joe的密码是guessme,它通过密钥abracadabra被加密。要注意的是,加密完的结果是⼀个⼆进制字符串,如下所⽰:
提⽰:虽然ENCODE()和DECODE()这两个函数能够满⾜⼤多数的要求,但是有的时候您希望使⽤强度更⾼的加密⼿段。在这种情况下,您可以使⽤AES_ENCRYPT()和
AES_DECRYPT()函数,它们的⼯作⽅式是相同的,但是加密强度更⾼。
单向加密与双向加密不同,⼀旦数据被加密就没有办法颠倒这⼀过程。因此密码的验证包括对⽤户输
⼊内容的重新加密,并将它与保存的密⽂进⾏⽐对,看是否匹配。⼀种简单
的单向加密⽅式是MD5校验码。MySQL的MD5()函数会为您的数据创建⼀个“指纹”并将它保存起来,供验证测试使⽤。下⾯就是如何使⽤它的⼀个简单例⼦:
Mysql代码
1. mysql> INSERT INTO users (username,password) VALUES ('joe',MD5('guessme'));
2.
3. Query OK, 1 row affected (0.00 sec)
或者,您考虑⼀下使⽤ENCRYPT()函数,它使⽤系统底层的crypt()系统调⽤来完成加密。这个函数有两个参数:⼀个是要被加密的字符串,另⼀个是双(或者多)字符
的“salt”。它然后会⽤salt加密字符串;这个salt然后可以被⽤来再次加密⽤户输⼊的内容,并将它与先前加密的字符串进⾏⽐对。下⾯⼀个例⼦说明了如何使⽤它:
Mysql代码
1. mysql> INSERT INTO users (username,password) VALUES('joe', ENCRYPT('guessme','ab'));
2.
3. Query OK, 1 row affected (0.00 sec)
提⽰:ENCRYPT()只能⽤在UNIX、LINIX系统上,因为它需要⽤到底层的crypt()库。
⼆、单向加密(信息摘要)
Java⼀般需要获取对象MessageDigest来实现单项加密(信息摘要)。
1. MD5 即Message-Digest Algorithm 5(信息-摘要算法 5),⽤于确保信息传输完整⼀致。是计算机⼴泛使⽤的杂凑算法之⼀(⼜译摘要算法、哈希算法),主流编程语⾔普遍
已有MD5实现。将数据(如汉字)运算为另⼀固定长度值,是杂凑算法的基础原理,MD5的前⾝有MD2、MD3和MD4。MD5的作⽤是让⼤容量信息在⽤数字签名软件签署私⼈
密钥前被"压缩"成⼀种保密的格式(就是把⼀个任意长度的字节串变换成⼀定长的⼗六进制数字串)。
除了MD5以外,其中⽐较有名的还有sha-1、RIPEMD以及Haval等
Java代码
1. import java.security.MessageDigest;
2. import java.security.NoSuchAlgorithmException;
3.
4. public class EncrypMD5 {
5.
6. public byte[] eccrypt(String info) throws NoSuchAlgorithmException{
7. //根据MD5算法⽣成MessageDigest对象
8. MessageDigest md5 = Instance("MD5");
9. byte[] srcBytes = Bytes();
10. //使⽤srcBytes更新摘要
11. md5.update(srcBytes);
12. //完成哈希计算,得到result
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论