android平台上AES,DES加解密及问题
在使用java进行AES加密的时候,会用到如下方法: SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
但是在android4.2以上进行加密、解密时,会报类似badPadding的异常,但是把该代码替换成一下方法则一切都OK。 SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");
AES加密算法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; public class AESUtil { public static String encrypt(String seed, String cleartext) throws Exception { byte [] rawKey = getRawKey(seed.getBytes()); byte [] result = encrypt(rawKey, cleartext.getBytes()); return toHex(result); } public static String decrypt(String seed, String encrypted) throws Exception { byte [] rawKey = getRawKey(seed.getBytes()); byte [] enc = toByte(encrypted); byte [] result = decrypt(rawKey, enc); return new String(result); } private static byte [] getRawKey( byte [] seed) throws Exception { KeyGenerator kgen = KeyGenerator.getInstance( "AES" ); // SecureRandom sr = SecureRandom.getInstance("SHA1PRNG"); SecureRandom sr = SecureRandom.getInstance( "SHA1PRNG" , "Crypto" ); sr.setSeed(seed); kgen.init( 128 , sr); // 192 and 256 bits may not be available SecretKey skey = kgen.generateKey(); byte [] raw = skey.getEncoded(); return raw; } private static byte [] encrypt( byte [] raw, byte [] clear) throws Exception { SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES" ); Cipher cipher = Cipher.getInstance( "AES" ); cipher.init(Cipher.ENCRYPT_MODE, skeySpec); byte [] encrypted = cipher.doFinal(clear); return encrypted; } private static byte [] decrypt( byte [] raw, byte [] encrypted) throws Exception { SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES" ); Cipher cipher = Cipher.getInstance( "AES" ); cipher.init(Cipher.DECRYPT_MODE, skeySpec); byte [] decrypted = cipher.doFinal(encrypted); return decrypted; } public static String toHex(String txt) { return toHex(txt.getBytes()); } public static String fromHex(String hex) { return new String(toByte(hex)); } public static byte [] toByte(String hexString) { int len = hexString.length()/ 2 ; byte [] result = new byte [len]; for ( int i = 0 ; i < len; i++) result[i] = Integer.valueOf(hexString.substring( 2 *i, 2 *i+ 2 ), 16 ).byteValue(); return result; } public static String toHex( byte [] buf) { if (buf == null ) return "" ; StringBuffer result = new StringBuffer( 2 *buf.length); for ( int i = 0 ; i < buf.length; i++) { appendHex(result, buf[i]); } return result.toString(); } private final static String HEX = "0123456789ABCDEF" ; private static void appendHex(StringBuffer sb, byte b) { sb.append(HEX.charAt((b>> 4 )& 0x0f )).append(HEX.charAt(b& 0x0f )); } } |
DES加密算法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
|
import java.io.UnsupportedEncodingException; import java.security.Key; import java.util.Locale; import javax.crypto.Cipher; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESedeKeySpec; import javax.crypto.spec.IvParameterSpec; /** * DES加密 * * @author houjinyun * */ public class DesUtils { private static final String KEY = "********************" ; /** * 对字符串进行DES3加密 * * @param str * @return 加密后的字符串,若失败则返回null */ public static String encode(String str) { try { byte [] key = KEY.getBytes( "UTF-8" ); byte [] data = str.getBytes( "UTF-8" ); byte [] encodedData = des3EncodeECB(key, data); return byte2HexString(encodedData); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return null ; } public static String decode(String str) { try { byte [] key = KEY.getBytes( "UTF-8" ); byte [] data = hexString2Byte(str); byte [] decodedData = des3DecodeECB(key, data); return new String(decodedData, "UTF-8" ); } catch (Exception e) { e.printStackTrace(); } return null ; } /** * ECB加密,不要IV * * @param key * 密钥 * @param data * 明文 * @return Base64编码的密文 * @throws Exception */ public static byte [] des3EncodeECB( byte [] key, byte [] data) throws Exception { Key deskey = null ; DESedeKeySpec spec = new DESedeKeySpec(key); SecretKeyFactory keyfactory = SecretKeyFactory.getInstance( "desede" ); deskey = keyfactory.generateSecret(spec); Cipher cipher = Cipher.getInstance( "desede" + "/ECB/PKCS5Padding" ); cipher.init(Cipher.ENCRYPT_MODE, deskey); byte [] bOut = cipher.doFinal(data); return bOut; } /** * ECB解密,不要IV * * @param key * 密钥 * @param data * Base64编码的密文 * @return 明文 * @throws Exception */ public static byte [] ees3DecodeECB( byte [] key, byte [] data) throws Exception { Key deskey = null ; DESedeKeySpec spec = new DESedeKeySpec(key); SecretKeyFactory keyfactory = SecretKeyFactory.getInstance( "desede" ); deskey = keyfactory.generateSecret(spec); Cipher cipher = Cipher.getInstance( "desede" + "/ECB/PKCS5Padding" ); cipher.init(Cipher.DECRYPT_MODE, deskey); byte [] bOut = cipher.doFinal(data); return bOut; } /** * CBC加密 * * @param key * 密钥 * @param keyiv * IV * @param data * 明文 * @return Base64编码的密文 * @throws Exception */ public static byte [] des3EncodeCBC( byte [] key, byte [] keyiv, byte [] data) throws Exception { Key deskey = null ; DESedeKeySpec spec = new DESedeKeySpec(key); SecretKeyFactory keyfactory = SecretKeyFactory.getInstance( "desede" ); deskey = keyfactory.generateSecret(spec); Cipher cipher = Cipher.getInstance( "desede" + "/CBC/PKCS5Padding" ); IvParameterSpec ips = new IvParameterSpec(keyiv); cipher.init(Cipher.ENCRYPT_MODE, deskey, ips); byte [] bOut = cipher.doFinal(data); return bOut; } /** * CBC解密 * * @param key * 密钥 * @param keyiv * IV * @param data * Base64编码的密文 * @return 明文 * @throws Exception */ public static byte [] des3DecodeCBC( byte [] key, byte [] keyiv, byte [] data) throws Exception { Key deskey = null ; DESedeKeySpec spec = new DESedeKeySpec(key); SecretKeyFactory keyfactory = SecretKeyFactory.getInstance( "desede" ); deskey = keyfactory.generateSecret(spec); Cipher cipher = Cipher.getInstance( "desede" + "/CBC/PKCS5Padding" ); IvParameterSpec ips = new IvParameterSpec(keyiv); cipher.init(Cipher.DECRYPT_MODE, deskey, ips); byte [] bOut = cipher.doFinal(data); return bOut; } public static byte [] des3DecodeECB( byte [] key, byte [] data) throws Exception { Key deskey = null ; DESedeKeySpec spec = new DESedeKeySpec(key); SecretKeyFactory keyfactory = SecretKeyFactory.getInstance( "desede" ); deskey = keyfactory.generateSecret(spec); Cipher cipher = Cipher.getInstance( "desede" + "/ECB/PKCS5Padding" ); cipher.init(Cipher.DECRYPT_MODE, deskey); byte [] bOut = cipher.doFinal(data); return bOut; } private static String byte2HexString( byte [] b) { String a = "" ; for ( int i = 0 ; i < b.length; i++) { String hex = Integer.toHexString(b[i] & 0xFF ) .toUpperCase(Locale.US); if (hex.length() == 1 ) { hex = '0' + hex; } a = a + hex; } return a; } private static byte [] hexString2Byte(String str) { if (str == null ) return null ; str = str.trim(); int len = str.length(); if (len == 0 || len % 2 == 1 ) return null ; byte [] b = new byte [len / 2 ]; try { for ( int i = 0 ; i < str.length(); i += 2 ) { b[i / 2 ] = ( byte ) Integer.decode( "0x" + str.substring(i, i + 2 )).intValue(); } return b; } catch (Exception e) { return null ; } } } |
结伴旅游,一个免费的交友网站:www.jieberu.com
推推族,免费得门票,游景区:www.tuituizu.com
android平台上AES,DES加解密及问题的更多相关文章
- AES && DES加解密
MD5加密一般不可逆,只能暴力突破.所以这边记录一下一些关于字符串的加解密的两种方法,以便自己学习 AES public class AESHelper { public static string ...
- java MD5/AES/DES加解密汇总
package com.test.test1.util; import java.security.MessageDigest; import java.security.SecureRandom; ...
- .NET/android/java/iOS AES通用加密解密(修正安卓)
移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如.NET和android或者iOS的打交道.为了让数据交互更安全,我们需要对数据进行加密传输.今天研究了一下,把几种语言的加密都 ...
- .NET/android/java/iOS AES通用加密解密
移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如.NET和android或者iOS的打交道.为了让数据交互更安全,我们需要对数据进行加密传输.今天研究了一下,把几种语言的加密都 ...
- DES加解密算法Qt实现
算法解密qt加密table64bit [声明] (1) 本文源码 大部分源码来自:DES算法代码.在此基础上,利用Qt编程进行了改写,实现了DES加解密算法,并添加了文件加解密功能.在此对署名为b ...
- Java拓展教程:文件DES加解密
Java拓展教程:文件加解密 Java中的加密解密技术 加密技术根据一般可以分为对称加密技术和非对称加密技术.对称加密技术属于传统的加密技术,它的加密和解密的密钥是相同的,它的优点是:运算速度快,加密 ...
- Node.js的DES加解密和MD5加密
最基本的就是经常用的md5加密算法 代码如下 var MD5=function (data) { var _encrymd5 = require('crypto').createHas ...
- Golang之AES/DES加密解密
AES/DES加密/解密涉及4个概念:1. Block, 也叫分组, 相应加密/解密的算法. 2. BlockMode, 模式, 相应加密/解密的处理.3. InitalVectory, 初始向量4. ...
- 一个java的DES加解密类转换成C#
原文:一个java的DES加解密类转换成C# 一个java的des加密解密代码如下: //package com.visionsky.util; import java.security.*; //i ...
随机推荐
- TensorFlow2.0矩阵与向量的加减乘
1.矩阵加法使用 a = np.random.random((3,3))b = np.random.randint(0,9,(3,3)) ad = tf.add(a,b) 2.矩阵乘法注意 # ten ...
- 简单记事本的基本实现&十四周总结
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口 ...
- 2019 计蒜之道 初赛 第一场 商汤的AI伴游小精灵
https://nanti.jisuanke.com/t/39260 根据题意我们可以知道 这是一个树 我们只需要找到出度最大的两个点就好了 如果包含根节点的话要-- 两个点相邻的话也要-- 数据很 ...
- [19/06/06-星期四] CSS基础_盒子模型
一.盒子模型(框模型.盒模型) CSS处理网页时,它认为每个元素都在一个不可见的矩形盒子里. 为什么想象成盒子模型?因为把所有元素想象成盒子,那么我们对网页的布局就相当于摆放盒子.我们只需要把相应的盒 ...
- C++基础-类和对象
本文为 C++ 学习笔记,参考<Sams Teach Yourself C++ in One Hour a Day>第 8 版.<C++ Primer>第 5 版.<代码 ...
- Python 入门之Python简介
Python 入门之Python简介 1.Python简介: (1) Python的出生: python的创始人为吉多·范罗苏姆(Guido van Rossum)(中文名字:龟叔).1989年的 ...
- 搜索专题:HDU1241 Oil Deposits
Oil Deposits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tot ...
- 基于BufferedImage的图像滤镜演示
package chapter2; import javax.imageio.ImageIO;import javax.swing.*;import javax.swing.filechooser.F ...
- 该项目不知道如何运行配置文件 IIS Express。The project doesn’t know how to run the profile IIS Express
原文:该项目不知道如何运行配置文件 IIS Express. 方案1(推荐). 可能原因是:禁用掉Microsft ASP.NET和Web工具扩展和微软Azure的应用程序服务工具扩展,恢复启用即可. ...
- Resharper 2019.1.1 破解
本文链接:https://blog.csdn.net/qq_21361809/article/details/92423949 Resharper ...