本文实例总结了Android编程加密算法。分享给大家供大家参考,具体如下:
android常用加密算法之Base64加密算法:
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
|
package com. long ; /** * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; /* * @author long * */ public class Base64 { private static final char [] legalChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" .toCharArray(); public static String encode( byte [] data) { int start = 0 ; int len = data.length; StringBuffer buf = new StringBuffer(data.length * 3 / 2 ); int end = len - 3 ; int i = start; int n = 0 ; while (i <= end) { int d = (((( int ) data[i]) & 0x0ff ) << 16 ) | (((( int ) data[i + 1 ]) & 0x0ff ) << 8 ) | ((( int ) data[i + 2 ]) & 0x0ff ); buf.append(legalChars[(d >> 18 ) & 63 ]); buf.append(legalChars[(d >> 12 ) & 63 ]); buf.append(legalChars[(d >> 6 ) & 63 ]); buf.append(legalChars[d & 63 ]); i += 3 ; if (n++ >= 14 ) { n = 0 ; buf.append( " " ); } } if (i == start + len - 2 ) { int d = (((( int ) data[i]) & 0x0ff ) << 16 ) | (((( int ) data[i + 1 ]) & 255 ) << 8 ); buf.append(legalChars[(d >> 18 ) & 63 ]); buf.append(legalChars[(d >> 12 ) & 63 ]); buf.append(legalChars[(d >> 6 ) & 63 ]); buf.append( "=" ); } else if (i == start + len - 1 ) { int d = ((( int ) data[i]) & 0x0ff ) << 16 ; buf.append(legalChars[(d >> 18 ) & 63 ]); buf.append(legalChars[(d >> 12 ) & 63 ]); buf.append( "==" ); } return buf.toString(); } private static int decode( char c) { if (c >= 'A' && c <= 'Z' ) return (( int ) c) - 65 ; else if (c >= 'a' && c <= 'z' ) return (( int ) c) - 97 + 26 ; else if (c >= '0' && c <= '9' ) return (( int ) c) - 48 + 26 + 26 ; else switch (c) { case '+' : return 62 ; case '/' : return 63 ; case '=' : return 0 ; default : throw new RuntimeException( "unexpected code: " + c); } } public static byte [] decode(String s) { ByteArrayOutputStream bos = new ByteArrayOutputStream(); try { decode(s, bos); } catch (IOException e) { throw new RuntimeException(); } byte [] decodedBytes = bos.toByteArray(); try { bos.close(); bos = null ; } catch (IOException ex) { System.err.println( "Error while decoding BASE64: " + ex.toString()); } return decodedBytes; } private static void decode(String s, OutputStream os) throws IOException { int i = 0 ; int len = s.length(); while ( true ) { while (i < len && s.charAt(i) <= ' ' ) i++; if (i == len) break ; int tri = (decode(s.charAt(i)) << 18 ) + (decode(s.charAt(i + 1 )) << 12 ) + (decode(s.charAt(i + 2 )) << 6 ) + (decode(s.charAt(i + 3 ))); os.write((tri >> 16 ) & 255 ); if (s.charAt(i + 2 ) == '=' ) break ; os.write((tri >> 8 ) & 255 ); if (s.charAt(i + 3 ) == '=' ) break ; os.write(tri & 255 ); i += 4 ; } } } |
android常用加密算法之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
|
package com. long ; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; /** * AES加密解密算法 * * @author long * */ public class Encryption { private final static String HEX = "0123456789ABCDEF" ; 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" ); 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 static void appendHex(StringBuffer sb, byte b) { sb.append(HEX.charAt((b >> 4 ) & 0x0f )).append(HEX.charAt(b & 0x0f )); } } |
Android常用加密算法之RAS加密算法:
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
|
import java.security.Key; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import javax.crypto.Cipher; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; public class RSAHelper { public static PublicKey getPublicKey(String key) throws Exception { byte [] keyBytes; keyBytes = ( new BASE64Decoder()).decodeBuffer(key); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance( "RSA" ); PublicKey publicKey = keyFactory.generatePublic(keySpec); return publicKey; } public static PrivateKey getPrivateKey(String key) throws Exception { byte [] keyBytes; keyBytes = ( new BASE64Decoder()).decodeBuffer(key); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance( "RSA" ); PrivateKey privateKey = keyFactory.generatePrivate(keySpec); return privateKey; } public static String getKeyString(Key key) throws Exception { byte [] keyBytes = key.getEncoded(); String s = ( new BASE64Encoder()).encode(keyBytes); return s; } public static void main(String[] args) throws Exception { KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance( "RSA" ); //密钥位数 keyPairGen.initialize( 1024 ); //密钥对 KeyPair keyPair = keyPairGen.generateKeyPair(); // 公钥 PublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); // 私钥 PrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); String publicKeyString = getKeyString(publicKey); System.out.println( "public:\n" + publicKeyString); String privateKeyString = getKeyString(privateKey); System.out.println( "private:\n" + privateKeyString); //加解密类 Cipher cipher = Cipher.getInstance( "RSA" ); //Cipher.getInstance("RSA/ECB/PKCS1Padding"); //明文 byte [] plainText = "我们都很好!邮件:@sina.com" .getBytes(); //加密 cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte [] enBytes = cipher.doFinal(plainText); //通过密钥字符串得到密钥 publicKey = getPublicKey(publicKeyString); privateKey = getPrivateKey(privateKeyString); //解密 cipher.init(Cipher.DECRYPT_MODE, privateKey); byte []deBytes = cipher.doFinal(enBytes); publicKeyString = getKeyString(publicKey); System.out.println( "public:\n" +publicKeyString); privateKeyString = getKeyString(privateKey); System.out.println( "private:\n" + privateKeyString); String s = new String(deBytes); System.out.println(s); } } |
希望本文所述对大家Android程序设计有所帮助。