· 6 years ago · Sep 18, 2019, 12:18 AM
1# Encrypt
2```ruby
3require 'openssl'
4require 'json'
5require 'base64'
6
7def encrypt(string, pwd)
8 salt = OpenSSL::Random.random_bytes(16)
9
10 # prepare cipher for encryption
11 e = OpenSSL::Cipher.new('AES-128-CBC')
12 e.encrypt
13
14 # next, generate a PKCS5-based string for your key + initialization vector
15 key_iv = OpenSSL::PKCS5.pbkdf2_hmac_sha1(pwd, salt, 1024, e.key_len+e.iv_len)
16 key = key_iv[0, e.key_len]
17 iv = key_iv[e.key_len, e.iv_len]
18
19 # now set the key and iv for the encrypting cipher
20 e.key = key
21 e.iv = iv
22
23 # encrypt the data!
24 encrypted = '' << e.update(string) << e.final
25 [encrypted, iv, salt].map {|v| ::Base64.strict_encode64(v)}.join("--")
26 end
27```
28
29# Decrypt
30```java
31import android.util.Base64;
32
33import java.security.spec.KeySpec;
34
35import javax.crypto.Cipher;
36import javax.crypto.SecretKey;
37import javax.crypto.SecretKeyFactory;
38import javax.crypto.spec.IvParameterSpec;
39import javax.crypto.spec.PBEKeySpec;
40import javax.crypto.spec.SecretKeySpec;
41
42public class Utils {
43 public static String decrypt(String encrypted, String pwd) throws Exception {
44
45 String[] parts = encrypted.split("--");
46 if (parts.length != 3) return null;
47
48 byte[] encryptedData = Base64.decode(parts[0], Base64.DEFAULT);
49 byte[] iv = Base64.decode(parts[1], Base64.DEFAULT);
50 byte[] salt = Base64.decode(parts[2], Base64.DEFAULT);
51
52 SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
53 KeySpec spec = new PBEKeySpec(pwd.toCharArray(), salt, 1024, 128);
54 SecretKey tmp = factory.generateSecret(spec);
55 SecretKey aesKey = new SecretKeySpec(tmp.getEncoded(), "AES");
56
57 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
58 cipher.init(Cipher.DECRYPT_MODE, aesKey, new IvParameterSpec(iv));
59
60 byte[] result = cipher.doFinal(encryptedData);
61 return new String(result, "UTF-8");
62 }
63}
64```