· 8 years ago · Dec 10, 2017, 03:52 PM
1package mx.ine.apoyociudadano.utils;
2
3import java.security.spec.KeySpec;
4import java.security.spec.X509EncodedKeySpec;
5import org.spongycastle.util.encoders.Base64;
6import java.security.KeyFactory;
7import javax.crypto.spec.SecretKeySpec;
8import java.security.SecureRandom;
9import javax.crypto.SecretKey;
10import java.security.PublicKey;
11import java.security.Key;
12import javax.crypto.Cipher;
13import timber.log.Timber;
14import java.security.Provider;
15import java.security.Security;
16import org.spongycastle.jce.provider.BouncyCastleProvider;
17
18public class SecurityModule
19{
20 static {
21 Security.addProvider((Provider)new BouncyCastleProvider());
22 }
23
24 public static byte[] encryptWithPublicKey(final String s, final String s2) throws Exception {
25 Timber.i("DEBUG encryptWithPublicKey... ", new Object[0]);
26 final byte[] bytes = s.getBytes("UTF-8");
27 final PublicKey rsaPublicKeyFromString = getRSAPublicKeyFromString(s2);
28 final Cipher instance = Cipher.getInstance("RSA/NONE/OAEPWithSHA1AndMGF1Padding", "BC");
29 instance.init(1, rsaPublicKeyFromString);
30 Timber.i("DEBUG encryptWithPublicKey... ", new Object[0]);
31 return instance.doFinal(bytes);
32 }
33
34 public static SecretKey generateAESKey() {
35 Timber.i("DEBUG generatePrivateKey... ", new Object[0]);
36 final SecureRandom secureRandom = new SecureRandom();
37 final byte[] array = new byte[32];
38 secureRandom.nextBytes(array);
39 while (true) {
40 try {
41 final SecretKeySpec secretKeySpec = new SecretKeySpec(array, "AES256");
42 Timber.d("DEBUG secretKey: " + secretKeySpec, new Object[0]);
43 return secretKeySpec;
44 }
45 catch (Exception ex) {
46 ex.printStackTrace();
47 Timber.i("DEBUG.. bueeeeno", new Object[0]);
48 final SecretKeySpec secretKeySpec = new SecretKeySpec(array, "AES");
49 continue;
50 }
51 break;
52 }
53 }
54
55 private static PublicKey getRSAPublicKeyFromString(final String s) throws Exception {
56 Security.insertProviderAt((Provider)new BouncyCastleProvider(), 1);
57 final PublicKey generatePublic = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(Base64.decode(s)));
58 Timber.i("DEBUG publicKey: " + generatePublic, new Object[0]);
59 return generatePublic;
60 }
61
62 public static SecretKey recoverPrivateKey(final String p0) {
63 //
64 // This method could not be decompiled.
65 //
66 // Original Bytecode:
67 //
68 // 1: astore_1
69 // 2: new Ljava/lang/StringBuilder;
70 // 5: dup
71 // 6: invokespecial java/lang/StringBuilder.<init>:()V
72 // 9: ldc "DEBUG trying to recover privateKey from String... stringKey: "
73 // 11: invokevirtual java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
74 // 14: aload_0
75 // 15: invokevirtual java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
76 // 18: invokevirtual java/lang/StringBuilder.toString:()Ljava/lang/String;
77 // 21: iconst_0
78 // 22: anewarray Ljava/lang/Object;
79 // 25: invokestatic timber/log/Timber.i:(Ljava/lang/String;[Ljava/lang/Object;)V
80 // 28: aload_0
81 // 29: invokestatic org/spongycastle/util/encoders/Base64.decode:(Ljava/lang/String;)[B
82 // 32: astore_3
83 // 33: new Ljavax/crypto/spec/SecretKeySpec;
84 // 36: dup
85 // 37: aload_3
86 // 38: iconst_0
87 // 39: aload_3
88 // 40: arraylength
89 // 41: ldc "AES256"
90 // 43: invokespecial javax/crypto/spec/SecretKeySpec.<init>:([BIILjava/lang/String;)V
91 // 46: astore 4
92 // 48: new Ljava/lang/StringBuilder;
93 // 51: dup
94 // 52: invokespecial java/lang/StringBuilder.<init>:()V
95 // 55: ldc "DEBUG in the end: "
96 // 57: invokevirtual java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
97 // 60: aload 4
98 // 62: invokevirtual java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
99 // 65: invokevirtual java/lang/StringBuilder.toString:()Ljava/lang/String;
100 // 68: iconst_0
101 // 69: anewarray Ljava/lang/Object;
102 // 72: invokestatic timber/log/Timber.i:(Ljava/lang/String;[Ljava/lang/Object;)V
103 // 75: aload 4
104 // 77: ifnull 112
105 // 80: new Ljava/lang/StringBuilder;
106 // 83: dup
107 // 84: invokespecial java/lang/StringBuilder.<init>:()V
108 // 87: ldc "DEBUG originalKey: "
109 // 89: invokevirtual java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
110 // 92: aload 4
111 // 94: invokeinterface javax/crypto/SecretKey.getAlgorithm:()Ljava/lang/String;
112 // 99: invokevirtual java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
113 // 102: invokevirtual java/lang/StringBuilder.toString:()Ljava/lang/String;
114 // 105: iconst_0
115 // 106: anewarray Ljava/lang/Object;
116 // 109: invokestatic timber/log/Timber.i:(Ljava/lang/String;[Ljava/lang/Object;)V
117 // 112: aload 4
118 // 114: areturn
119 // 115: astore_2
120 // 116: aload_2
121 // 117: invokevirtual java/lang/Exception.printStackTrace:()V
122 // 120: aload_1
123 // 121: areturn
124 // 122: astore_2
125 // 123: aload 4
126 // 125: astore_1
127 // 126: goto 116
128 // Exceptions:
129 // Try Handler
130 // Start End Start End Type
131 // ----- ----- ----- ----- ---------------------
132 // 2 48 115 116 Ljava/lang/Exception;
133 // 48 75 122 129 Ljava/lang/Exception;
134 // 80 112 122 129 Ljava/lang/Exception;
135 //
136 // The error that occurred was:
137 //
138 // java.lang.IllegalStateException: Expression is linked from several locations: Label_0112:
139 // at com.strobel.decompiler.ast.Error.expressionLinkedFromMultipleLocations(Error.java:27)
140 // at com.strobel.decompiler.ast.AstOptimizer.mergeDisparateObjectInitializations(AstOptimizer.java:2596)
141 // at com.strobel.decompiler.ast.AstOptimizer.optimize(AstOptimizer.java:235)
142 // at com.strobel.decompiler.ast.AstOptimizer.optimize(AstOptimizer.java:42)
143 // at com.strobel.decompiler.languages.java.ast.AstMethodBodyBuilder.createMethodBody(AstMethodBodyBuilder.java:214)
144 // at com.strobel.decompiler.languages.java.ast.AstMethodBodyBuilder.createMethodBody(AstMethodBodyBuilder.java:99)
145 // at com.strobel.decompiler.languages.java.ast.AstBuilder.createMethodBody(AstBuilder.java:757)
146 // at com.strobel.decompiler.languages.java.ast.AstBuilder.createMethod(AstBuilder.java:655)
147 // at com.strobel.decompiler.languages.java.ast.AstBuilder.addTypeMembers(AstBuilder.java:532)
148 // at com.strobel.decompiler.languages.java.ast.AstBuilder.createTypeCore(AstBuilder.java:499)
149 // at com.strobel.decompiler.languages.java.ast.AstBuilder.createTypeNoCache(AstBuilder.java:141)
150 // at com.strobel.decompiler.languages.java.ast.AstBuilder.createType(AstBuilder.java:130)
151 // at com.strobel.decompiler.languages.java.ast.AstBuilder.addType(AstBuilder.java:105)
152 // at com.strobel.decompiler.languages.java.JavaLanguage.buildAst(JavaLanguage.java:71)
153 // at com.strobel.decompiler.languages.java.JavaLanguage.decompileType(JavaLanguage.java:59)
154 // at com.strobel.decompiler.DecompilerDriver.decompileType(DecompilerDriver.java:336)
155 // at com.strobel.decompiler.DecompilerDriver.decompileJar(DecompilerDriver.java:257)
156 // at com.strobel.decompiler.DecompilerDriver.main(DecompilerDriver.java:141)
157 //
158 throw new IllegalStateException("An error occurred while decompiling this method.");
159 }
160}