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 ...
随机推荐
- Chapter02 第一节 开始学习C++
2.1 进入C++ 第一个示例程序: //myfirst.cpp #include <bits/stdc++.h> using namespace std; int main() { co ...
- 只需要2个工具,百度云盘大文件就能用迅雷和IDM下载
不会代码,不懂脚本,没关系 ,能找到一座通往它们的桥梁,照样能到达彼岸. 这里以360极速浏览器为例. 在浏览器地址框输入以下地址直接到达浏览器安装扩展插件的地方(偷个懒,复制网址吧),https:/ ...
- c++ k^1
如果k是偶数,则使k=k+1:若k是奇数,则使k=k-1.
- Clover的简单使用
官网: http://cn.ejie.me 操作说明相关: 方便的 Tab 页功能 要掌握功能强大,操作简单的标签页,只需记住Ctrl+T新开页面,Ctrl+W关闭页面,Ctrl+Tab切换页面,工作 ...
- JProfiler监控
原文: https://blog.csdn.net/jijilan/article/details/83022715
- Python 入门之 闭包
Python 入门之 闭包 1.闭包 (1)在嵌套函数内使用(非本层变量)和非全局变量就是闭包 (2)_ closure _ 判断是不是闭包 def func(): a = 1 def foo(): ...
- Self-Driving Database
最近一直在做 ML in Database 相关的工作.偶然发现CMU 19spring的15-721课程竟然专门安排了这个专题,不禁欣喜若狂,赶紧去学习了一下. Andy提出了self-drivin ...
- spring boot 枚举使用的坑
java 枚举的功能挺多,但是坑更多,使用的时候要注意.如下面这个枚举. @Getter @AllArgsConstructor public enum EnumExpenseType impleme ...
- oracle数据的导入导出(两种方法三种方式)
大概了解数据库中数据的导入导出.在oracle中,导入导出数据的方法有两种,一种是使用cmd命令行的形式导入导出数据,另一种是使用PL/SQL工具导入导出数据. 1,使用cmd命令行导入导出数据 1. ...
- gradle上sourceSets配置&同名文件合并问题
gradle的sourceSets可以对不同的buildType, productFlavor,buildVariant设置不同的文件路径,进行多样化处理. sourceSets{ main{ man ...