android c# rsa互通

这篇博客探讨了如何在Android应用中与C#应用进行RSA加密数据互通。通过引用的相关博客资源,作者详细解释了在MainActivity.java中进行的Android端实现,并介绍了C#端的加密过程,为跨平台安全通信提供了方案。
摘要由CSDN通过智能技术生成

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值