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小时内删除。