第九章对称加密算法--IDEA
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第九章对称加密算法--IDEA
注意:本节内容主要参考⾃《Java加密与解密的艺术(第2版)》第7章“初等加密算法--对称加密算法”
9.1、IDEA
特点:
先于AES出来取代DES
安全性极⾼
常⽤于电⼦邮件加密算法
9.2、实现⽅式
Bouncy Castle(BC,⼯作模式只有ECB,密钥长度为128位)
9.2.1、基于BC实现的IDEA算法
1package com.util.idea;
2
3import java.io.UnsupportedEncodingException;
4import java.security.InvalidAlgorithmParameterException;
5import java.security.InvalidKeyException;
6import java.security.Key;
7import java.security.NoSuchAlgorithmException;
8import java.security.NoSuchProviderException;
9import java.security.Security;
10import java.security.spec.InvalidKeySpecException;
11
12import javax.crypto.BadPaddingException;
13import javax.crypto.Cipher;
14import javax.crypto.IllegalBlockSizeException;
15import javax.crypto.KeyGenerator;
16import javax.crypto.NoSuchPaddingException;
17import javax.crypto.SecretKey;
18import javax.crypto.spec.SecretKeySpec;
19
20import mons.codec.binary.Base64;
21import org.bouncycastle.jce.provider.BouncyCastleProvider;
22
23/**
24 * 基于BC的IDEA算法,⼯作模式只有ECB
25*/
26public class IDEABC {
27private static final String ENCODING = "UTF-8";
28private static final String KEY_ALGORITHM = "IDEA";//产⽣密钥的算法
29private static final String CIPHER_ALGORITHM = "IDEA/ECB/PKCS5Padding";//加解密算法格式:算法/⼯作模式/填充模式 30/**
31 * 产⽣密钥
32*/
33public static byte[] getKey() throws NoSuchAlgorithmException{
34 Security.addProvider(new BouncyCastleProvider());//在BC中⽤,JDK下去除
35 KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_ALGORITHM);
36 keyGenerator.init(128);//初始化密钥长度,128
37 SecretKey key =keyGenerator.generateKey();//产⽣密钥
38return key.getEncoded();
39 }
40
41/**
42 * 还原密钥:⼆进制字节数组转换为Java对象
43*/
44public static Key toKey(byte[] keyByte){
45return new SecretKeySpec(keyByte, KEY_ALGORITHM);
46 }
47
48/**
49 * IDEA加密
50 * @param data 带加密数据
51 * @param keyByte 密钥
52*/
53public static byte[] encrypt(String data, byte[] keyByte) throws NoSuchAlgorithmException,
54 NoSuchProviderException,
55 NoSuchPaddingException,
56 InvalidKeyException,
57 IllegalBlockSizeException,
58 BadPaddingException,
59 UnsupportedEncodingException {
60 Key key = toKey(keyByte);//还原密钥
61 Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM,"BC");//BC下⽤
62 cipher.init(Cipher.ENCRYPT_MODE, key);//设置加密模式并且初始化key
63return cipher.doFinal(data.getBytes(ENCODING));
64 }
65
66/**
67 * IDEA加密,并转为16进制字符串或Base64编码字符串
68*/
69public static String encryptIDEAHex(String data, byte[] keyByte) throws NoSuchAlgorithmException,
70 NoSuchProviderException,
71 NoSuchPaddingException,
72 InvalidKeyException,
73 IllegalBlockSizeException,
74 BadPaddingException,
75 UnsupportedEncodingException {
76byte[] encodedByte = encrypt(data, keyByte);
77//return new String(Hex.encode(encodedByte));//借助BC
78//return new String(mons.codec.binary.Hex.encodeHexString(encodedByte));//借助CC
79return Base64.encodeBase64String(encodedByte);//借助CC的Base64编码
80 }
81
82/**
83 * IDEA解密
84 * @param data 待解密数据为字节数组
85 * @param keyByte 密钥
86*/
87public static byte[] decrypt(byte[] data, byte[] keyByte) throws NoSuchAlgorithmException,
88 NoSuchProviderException,
89 NoSuchPaddingException,
90 InvalidKeyException,
91 IllegalBlockSizeException,
92 BadPaddingException {
93 Key key = toKey(keyByte);//还原密钥
94 Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM,"BC");//BC下⽤
95 cipher.init(Cipher.DECRYPT_MODE, key);
96return cipher.doFinal(data);
97 }
98
99/**
100 * IDEA解密
101 * @param data 待解密数据为字符串
102 * @param keyByte 密钥
103*/
104public static byte[] decrypt(String data, byte[] keyByte) throws NoSuchAlgorithmException,
105 NoSuchProviderException,
106 NoSuchPaddingException,
107 InvalidKeyException,
108 IllegalBlockSizeException,
109 BadPaddingException {
110 Key key = toKey(keyByte);//还原密钥
111 Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM,"BC");//BC下⽤
112 cipher.init(Cipher.DECRYPT_MODE, key);
113return cipher.doFinal(Base64.decodeBase64(data));//注意data不可以直接采⽤data.getByte()⽅法转化为字节数组,否则会抛异常
114 }
115
116/**
117 * 测试
118*/
119public static void main(String[] args) throws NoSuchAlgorithmException,
120 InvalidKeyException,
121 InvalidKeySpecException,
122 NoSuchPaddingException,
123 IllegalBlockSizeException,
124 BadPaddingException,
125 UnsupportedEncodingException,
126 NoSuchProviderException,
127 InvalidAlgorithmParameterException {
128 String data = "找⼀个好姑娘做⽼婆是我的梦想!";
129/*************测试encrypt()、decrypt()**************/
130 System.out.println("原⽂-->"+data);
131byte[] keyByte = IDEABC.getKey();
132 System.out.println("密钥-->"+Base64.encodeBase64String(keyByte));//这⾥将⼆进制的密钥使⽤base64加密保存,这也是在实际中使⽤的⽅式133byte[] encodedByte = IDEABC.encrypt(data, keyByte);
134 System.out.println("加密后-->"+encodedByte);
135byte[] encodedByte2 = IDEABC.encrypt(data, keyByte);
136 System.out.println("加密后-->"+encodedByte2);
137byte[] decodedByte = IDEABC.decrypt(encodedByte, keyByte);
138 System.out.println("解密后-->"+decodedByte);
139for(int i=0;i<encodedByte.length;i++){
140 System.out.println(encodedByte[i]==encodedByte2[i]);
141 }
142/*************测试encryptIDEAHex()、decrypt()**************/
143 System.out.println("原⽂-->"+data);
144byte[] keyByte3 = IDEABC.getKey();
145 System.out.println("密钥-->"+Base64.encodeBase64String(keyByte3));//这⾥将⼆进制的密钥使⽤base64加密保存,这也是在实际中使⽤的⽅式
146 String encodedStr = IDEABC.encryptIDEAHex(data, keyByte3);
147 System.out.println("加密后-->"+encodedStr);
148 String encodedByte4 = IDEABC.encryptIDEAHex(data, keyByte3);
149 System.out.println("加密后-->"+encodedByte4);
150byte[] decodedByte3 = IDEABC.decrypt(Base64.decodeBase64(encodedStr), keyByte3); 151 System.out.println("解密Byte[]后-->"+decodedByte3);
152byte[] decodedByte4 = IDEABC.decrypt(encodedStr, keyByte3);
153 System.out.println("解密String后-->"+decodedByte4);
154 }
155 }
View Code
注意:
与基于BC实现的AES算法代码基本⼀样。