MainActivity.java
package com.example.rsatest;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.security.KeyPair;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
public class MainActivity extends Activity {
Button btnencode;
Button btndecode;
EditText txtinit;
EditText txtencoded;
EditText txtencoded2;
TextView lbldecoded;
//以下为c#端生成的私钥公钥,私钥仅测试android是否可解密c#端加密的内容,其实代码中,android不需要私钥
String strpublickey =
"<RSAKeyValue><Modulus>rhpLEGpzIBIq8cDcK0VNcd36MnLz1yt2mq3Jmm+7sMP7FBEiA5qk7XHb38PiyfeLgIuC" +
"+hcAdfVFyEZ4BrXqvxwyGXCB179y7KW4PjYBkWGTaWkD26Uyq/BfA+9EMNl1AaFSfNyCXOyYRj8MQVFnoTjW" +
"7hqZ8HhvCdB9fDbKNAk=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
String strprivatekey =
"<RSAKeyValue><Modulus>s6GS32JVPu5eyqmt1nI0LU/R+EPnLYtH50vu0vlCVRx/ykSMLY/kq6uwaeCSYeXTLh" +
"g8qK1XfD6UqpZRxkgHxigaFW3gJ7LKCuEJSk31nN9dLUVXYxhatl1k7b2Z3pxWcMvyxtg7cp6ERs/qdUg" +
"kfiyBpDr+sMe0e9a8+fPWJPk=</Modulus><Exponent>AQAB</Exponent><P>36z6CocPRncAe52v/WYe" +
"TIsYbUQhmCqno7TF9nWcFxqtkGWzyzmAaRdI7ib/1EK/gL60zi5LmN0OQoydR1duIQ==</P><Q>zZckLxbyv8" +
"drf0fiXgOBJioMR40s6PcUX/3j3VesgyxuLeAhK3Fz+pF9rBcbjd5CDqzRDDJhwVGZcrgZRXJr2Q==</Q><DP>" +
"Po5pK/KUAhgcKXZzlwItbSjlvwF0B9O+KNnRF9nSut96NU1MWIUPddTOT9TWbe3xEzfC53spJ2qDp3ceMaqxIQ" +
"==</DP><DQ>gn/t9/YZIKL1GVYH2qVe1VrbcI+scjRkOopumZGNb7ZEOdqLM4hQljzECPiiBOuQAsCv8Y4JfyzMu" +
"oUhhXOcAQ==</DQ><InverseQ>w8a8J3UHJe0/mBdGY+oJckgYzsB2wBQPHLbnarLqlwQN9ynLqoriZzxMNfjEus" +
"3eX6aks2Gs0hxlr0/AuAxWCA==</InverseQ><D>Cnz0GOPia066rSWUF1HKtxySe2bnkBKyS5B07M+N7m9ADNzMv" +
"HpK1TUskzoAAgRLvMTAge7BDWmP/5fQRX3+Khwr8weTlySIcGoqirp4Lv9RnlJl6bzcoE1taaa0gcuz/njScLsFV0" +
"FzgHxhyEv0Ryna2UI156hU6Ipdvb2+C4E=</D></RSAKeyValue>";
PublicKey publicKey = RsaHelper.decodePublicKeyFromXml(strpublickey);
PrivateKey privateKey = RsaHelper.decodePrivateKeyFromXml(strprivatekey);
private String mRs;
//Android端生成的公钥和私钥,给C#端使用
KeyPair mKeyPair = RsaHelper.generateRSAKeyPair(RsaHelper.DEFAULT_KEY_SIZE);
// 公钥
RSAPublicKey publicKey2 = (RSAPublicKey) mKeyPair.getPublic();
// 私钥
RSAPrivateKey privateKey2 = (RSAPrivateKey) mKeyPair.getPrivate();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnencode = (Button) findViewById(R.id.btnencode);
btndecode = (Button) findViewById(R.id.btndecode);
txtinit = (EditText) findViewById(R.id.txtinit);
txtencoded = (EditText) findViewById(R.id.txtencoded);
txtencoded2 = (EditText) findViewById(R.id.txtencoded2);
lbldecoded = (TextView) findViewById(R.id.lbldecoded);
Log.i("liangliang", "C#端的私钥---->" + RsaHelper.encodePrivateKeyToXml(privateKey2));
Log.i("liangliang", "C#端的私钥---->" + Base64Helper.encode(privateKey2.getEncoded()));
Log.i("liangliang", "C#端的公钥---->" + RsaHelper.encodePublicKeyToXml(publicKey2));
btnencode.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try {
String strinit = txtinit.getText().toString().trim();
mRs = RsaHelper.encryptDataFromStr(strinit, publicKey2);
txtencoded.setText(mRs);
Log.e("decoded", mRs);//将rs值拿到c#服务器可解密成功
} catch (Exception e) {
e.printStackTrace();
}
}
});
btndecode.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
//C#端传过来加密的内容 也可解密-----这里一定要注意需要c#端把字符串生成byte[]数组的时候要指定
//为utf-8,不然中文会乱码。
String strtxtencoded = mRs =
"GeEITK8q3yNV3LkiBAt7bnLDJ3b/yLv31q5RPLvqUkWuis+/zcl4dLL2ZR7M03koQk9pW/" +
"3tGnvIXpuhMRmn6pjQH1XxV878JlCwx+f5OiyRu+Px6WWLNMSjAkvA4m" +
"rLqrph6u8wq2qe22U8gcq0j+oGg4T7bsKPPgkgYuewyoQ=";
String rs = new String(RsaHelper.decryptByPrivateKeyForSpilt(Base64Helper.decode(strtxtencoded), privateKey.getEncoded()));
lbldecoded.setText(rs);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
RsaHelper.java
package com.example.rsatest;
import android.util.Log;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.interfaces.RSAPrivateCrtKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.RSAPrivateCrtKeySpec;
import java.security.spec.RSAPublicKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.ArrayList;
import java.util.List;
import javax.crypto.Cipher;
public class RsaHelper {
/**
* 随机生成RSA密钥对
*
* @param keyLength 密钥长度,范围:512~2048
* 一般1024
* @return
*/
public static KeyPair generateRSAKeyPair(int keyLength) {
try {
KeyPairGenerator kpg = KeyPairGenerator