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 ...
随机推荐
- C#方法名前的方括号
1.序列化:[Serializable]public void 方法名(){...} 2.WebServices方法:[WebMethod]public void 方法名(){...} 3.Ajax( ...
- Redis进阶:Redis的主从复制机制
Redis进阶:Redis的主从复制机制 主从复制机制介绍 单机版的Redis存在性能瓶颈,Redis通过提高主从复制实现读写分离,提高了了Redis的可用性,另一方便也能实现数据在多个Redis直接 ...
- 首次全备及事务备份对数据库的影响,2014 SpexSql log评估版探索
参考:https://www.cnblogs.com/gered/p/9882367.html 关键词:解析事务日志 新建数据库test3,然后查看日志文件,382行记录 SELECT min([Be ...
- P1056排坐椅
这是2008普及组真题,是一个提高—的模拟. 仔细读完题便有了思路:累放在i行能隔开wi个,比较排序wi,输出即可.所以在这里遇到了结构体排序的问题与手写cmp的问题.对于两个语法知识掌握得都不好,所 ...
- Let's encrypt 通配域名DNS验证方式的证书自动更新
通配符域名不同于一般的单域名证书. 为了解决之前一篇短文中通配域名通过DNS方式验证的证书自动更新问题. 需要使用到第三方域名提供商的API, 用于自动添加域名的TXT记录, 实现自动验证并完成证书更 ...
- django中配置MySql
1.配置字段 在setting文件中配置数据库字段:数据库需要提前手动创建好:语句(create database testdb charset "utf8";) DATABASE ...
- oracle数据库中的存储函数
oracle中的存储函数,和系统内的函数类似,可以像调用系统函数一样调用存储函数.它与存储过程的唯一区别就是存储过程没有return返回值,存储函数可以与存储过程互换,存储函数可以在存储过程中调用. ...
- Servlet&Http&Request笔记
# 今日内容: 1. Servlet 2. HTTP协议 3. Request ## Servlet: 1. 概念 2. 步骤 3. 执行原理 ...
- python小实例
一.跳动的心 love = '\n'.join([''.join([('love'[(x-y) % len('Love')] if ((x*0.05)**2+(y*0.1)**2-1)**3-(x*0 ...
- Sql中使用With创建多张临时表
CREATE PROC [dbo].[sp_VisitCount] ( @count INT ) AS BEGIN DECLARE @current DATETIME SET @current=GET ...