1.程序主类
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.EditText;
import com.wyq.encrypt.method.Encrypt;
import com.wyq.encrypt.method.EncryptFactory;
import java.util.Random;
/**
* 实现方案/思路:
* Android端的加密需要4步:
* 1.随机生成AES密钥
* 2.根据AES秘钥对数据进行加密
* 3.使用RSA公钥加密刚刚生成的AES密钥
* 4.将AES加密过的数据 和 被RSA加密过的AES秘钥 传给服务端
* <p>
* 服务端的解密只需3步:
* 1.获取到客户端传过来的数据
* 2.使用RSA私钥解密从客户端拿到的“被RSA加密过的AES秘钥”
* 3.再使用解密出来的AES秘钥来解密被AES加密过的数据
* <p>
* 这里需要理解的地方:
* 1.RSA是公开秘钥系统的代表,可以通过OpenSSL生成RSA证书,拿到公钥和私钥。
* 2.RSA的公钥用来加密,私钥用来解密。可以这样理解:客户端锁了门,钥匙在服务端那里。
* 3.RSA加/解密速度慢,不适合大量的数据进行加/解密,它是不对称加密方式。
* 4.AES加密速度很快,它是对称密码方式,即加密和解密使用同一个密钥的加密方式。
* <p>
* 理解了以上之后,我们就很容易想到使用RSA+AES相结合的方式,发挥它们共同的优点来实现一种新的数据加密方案
*/
public class MainActivity extends AppCompatActivity {
// 使用OpenSSL生成的RSA私钥 (存放于服务端)
private final static String private_key = "MIICXQIBAAKBgQDj6Bo3w/9rTeTzefIPj6/aooiVzzhgplwQxMabLIBLIWMoGBd0" +
"6VZKI08h0cqRx93KmuKZ8UJuubLAjDyGEi0BPP/Mx9m9nFqFPK8zxeO9dGQRMCy6" +
"udnbTRTBIJGvh4MOfY/LuDFUf6APh6lj+TzLElrnlis3xz5vB6mvuwicmQIDAQAB" +
"AoGAfVZGJOkLbS3XffdQojI5WhoM16awsKaM90PgnbIplCf2ajRlogw5QmiMumKv" +
"7uBmH2hyuoquKErD/ZSiLHGOgZgZV012MernqRV/ysg9B3rXm82RusSeR7WeCxnn" +
"R4FJzE+J9iw5Qgb5FZF8EFifpAZRSo+oD/TxbGrmmRlIUQECQQD2W2sl66Ll1Abq" +
"REdBBcyWuNesphoa72MnZWyj11deVsBPoitAVpchorJHotx6NElV6WVqpID0TSXR" +
"P86JTvvJAkEA7NPN2HDUQmWtsIYcjE/i6rdSw1dKs9j61wQIgGeLOeJEtX2lT50o" +
"DMhGHof8j2JPbyfCvf8J636JjDG9K2hiUQJARc8z9qPmHjBN4VaFxnQpPFCWtRLA" +
"dP9+3mwMNAVSeaYliqtOjEW9P8fFsy0AQxTL7y9bELQa4p915uyozxn1mQJBAIlm" +
"zUvhElU/dsku1gtWIfo5yEvLLm0v20C6d1BAQteffmup7SpGrMDVxVDbZt2tlRaR" +
"g/wFpzS5IoZzKSSxGDECQQDWGRPPBbFArXARsonA5p9qsFl/e2fjPIrYedH+7JJJ" +
"VGNHRmQvMh9TjmOjtThmX56jg2l/rrn6l9K6razSSGBl";
// 使用OpenSSL生成的RSA公钥 (存放于客户端)
private final static String rsa_public_key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDj6Bo3w/9rTeTzefIPj6/aooiV" +
"zzhgplwQxMabLIBLIWMoGBd06VZKI08h0cqRx93KmuKZ8UJuubLAjDyGEi0BPP/M" +
"x9m9nFqFPK8zxeO9dGQRMCy6udnbTRTBIJGvh4MOfY/LuDFUf6APh6lj+TzLElrn" +
"lis3xz5vB6mvuwicmQIDAQAB";
/**
* 获取一个随机key
*
* @return
*/
private String getRandomKey() {
String key = new String();
for (int i = 0; i < 32; i++) {
key = key + new Random().nextInt(10);
}
return key;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
* 账号密码的输入框
*/
EditText etId = findViewById(R.id.etId);
EditText etPassword = findViewById(R.id.etPassword);
etId.setText("admin");
etPassword.setText("test123456");
// 客户端加密
clientEncryption(etId.getText().toString(), etPassword.getText().toString());
}
/**
* 客户端加密账号和密码,并传值给服务端
* id:账号
* password:密码
*/
private void clientEncryption(String id, String password) {
// 客户端随机生成一个AES秘钥
String aesKey = getRandomKey();
Log.i("TAG", "随机生成的AES秘钥:" + aesKey);
// 经过客户端加密过后的:账号和密码字符串
Encrypt encrypt = EncryptFactory.create(Encrypt.EncryptType.AES);
String encryptId = encrypt.encryptString(aesKey, id);
String encryptPassword = encrypt.encryptString(aesKey, password);
Log.i("TAG", "加密库最终用到的秘钥:" + encrypt.getKey());
// 根据RSA的公钥,先对随机产生的AES秘钥进行加密
String encryptAesKey = EncryptFactory.create(Encrypt.EncryptType.RSA).encryptString(rsa_public_key, aesKey);
Log.i("TAG", "被加密过的AES秘钥:" + encryptAesKey);
Log.i("TAG", "客户端传值给服务端:\n账密:" + encryptId + "\n密码:" + encryptPassword);
Log.i("TAG", ">>>>>>>>>>>>>>>>>>>>>>>>>>");
Log.i("TAG", ">>>>>>>>>>>>>>>>>>>>>>>>>>");
Log.i("TAG", ">>>>>>>>>>>>>>>>>>>>>>>>>>");
// 传值给服务端,并且服务端进行解密
serverDecryption(encryptId, encryptPassword, encryptAesKey);
}
/**
* 服务端解密来自客户端的账号和密码
* encryptId:加密过的账号
* encryptPassword:加密过的密码
* encryptAesKey:加密过的AES密钥
*/
private void serverDecryption(String encryptId, String encryptPassword, String encryptAesKey) {
/**
* 根据RSA的私钥进行解密,拿到AES的秘钥
*/
String decryptAesKey = EncryptFactory.create(Encrypt.EncryptType.RSA).decryptString(private_key, encryptAesKey);
Log.i("TAG", "被解密过的AES秘钥:" + decryptAesKey);
/**
* 根据AES秘钥对账号和密码进行AES解密,拿到原文
*/
Encrypt encrypt = EncryptFactory.create(Encrypt.EncryptType.AES);
String decryptId = encrypt.decryptString(decryptAesKey, encryptId);
String decryptPassword = encrypt.decryptString(decryptAesKey, encryptPassword);
Log.i("TAG", "服务端解密出来的数据,账号:" + decryptId + " 密码:" + decryptPassword);
}
}