java - Android NoClassDefFoundError - RSA 加密

标签 java android encryption rsa noclassdeffounderror

我正在开发一个概念项目。

我有一个服务器和客户端,两者都是用 Kryonet TCP/UDP 库实现的。它在我的计算机上作为纯 Java 运行良好,但是当我尝试在 Android 上执行一些代码时,它给出以下内容

LogCat 输出:

07-18 15:35:40.718: E/AndroidRuntime(19229): FATAL EXCEPTION: main
07-18 15:35:40.718: E/AndroidRuntime(19229): Process: com.example.kryoandrochat, PID: 19229
07-18 15:35:40.718: E/AndroidRuntime(19229): java.lang.NoClassDefFoundError: sun.security.rsa.RSAPublicKeyImpl
07-18 15:35:40.718: E/AndroidRuntime(19229):    at com.example.kryoandrochat.MainActivity.onClick(MainActivity.java:133)
07-18 15:35:40.718: E/AndroidRuntime(19229):    at android.view.View.performClick(View.java:4626)
07-18 15:35:40.718: E/AndroidRuntime(19229):    at android.view.View$PerformClick.run(View.java:19300)
07-18 15:35:40.718: E/AndroidRuntime(19229):    at android.os.Handler.handleCallback(Handler.java:733)
07-18 15:35:40.718: E/AndroidRuntime(19229):    at android.os.Handler.dispatchMessage(Handler.java:95)
07-18 15:35:40.718: E/AndroidRuntime(19229):    at android.os.Looper.loop(Looper.java:157)
07-18 15:35:40.718: E/AndroidRuntime(19229):    at android.app.ActivityThread.main(ActivityThread.java:5293)
07-18 15:35:40.718: E/AndroidRuntime(19229):    at java.lang.reflect.Method.invokeNative(Native Method)
07-18 15:35:40.718: E/AndroidRuntime(19229):    at java.lang.reflect.Method.invoke(Method.java:515)
07-18 15:35:40.718: E/AndroidRuntime(19229):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
07-18 15:35:40.718: E/AndroidRuntime(19229):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
07-18 15:35:40.718: E/AndroidRuntime(19229):    at dalvik.system.NativeStart.main(Native Method)

我在我的项目中包含了 JRE 系统库,但没有任何改变。

这是客户端代码:

package com.example.kryoandrochat;

import java.io.IOException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;

import sun.security.rsa.RSAPublicKeyImpl;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import com.esotericsoftware.kryonet.Client;
import com.esotericsoftware.kryonet.Connection;
import com.esotericsoftware.kryonet.Listener;

public class MainActivity extends Activity implements OnClickListener{

    private Client client;
    private TextView tv;
    private EditText et;
    private Button send;
    private PublicKey publicKey, targetsPublicKey;
    private String targetUserName;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.chatTextView);
        et = (EditText) findViewById(R.id.chatField);
        send = (Button) findViewById(R.id.send);
        send.setOnClickListener(this);

        client = new Client();
        new NetworkTask().execute("");

        client.addListener(new Listener(){

            public void received (Connection connection, Object object) {

                if(object instanceof ClientConnectedPacket){
                    ClientConnectedPacket ccp = (ClientConnectedPacket) object;
                    tv.setText(ccp.userName + " is online now. \n");
                    PublicKeyPacket pkp = new PublicKeyPacket();
                    StringBuilder stringBuilder = new StringBuilder();
                    stringBuilder.append(((RSAPublicKeyImpl) publicKey).getModulus().toString());
                    stringBuilder.append("|");
                    stringBuilder.append(((RSAPublicKeyImpl) publicKey).getPublicExponent().toString());
                    String serPK = stringBuilder.toString();
                    pkp.publicKey = serPK;
                    pkp.targetUserName = targetUserName;
                    client.sendTCP(pkp);

                } 
            }
        });     

    }

    private class NetworkTask extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... params) {
            try {

                client.connect(10000, "myHostIP", 27960, 8008);

                new Thread(client).start();

            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("Baglanamadik.");
            }   

            new Thread(client).start();

            return "Connected";
        }

        @Override
        protected void onPostExecute(String result) {

            tv.setText("We are connected");
        }

        @Override
        protected void onPreExecute() {

            client.getKryo().register(ChatPacket.class);
            client.getKryo().register(ClientConnectedPacket.class);
            client.getKryo().register(UserConnectedPacket.class);
            client.getKryo().register(UserDisconnectedPacket.class);    
            client.getKryo().register(KeyPairGenerator.class);
            client.getKryo().register(KeyPair.class);
            client.getKryo().register(PublicKey.class);
            client.getKryo().register(PrivateKey.class);
            client.getKryo().register(PublicKeyPacket.class);
            //client.getKryo().register(sun.security.rsa.RSAPublicKeyImpl.class);
            //client.getKryo().register(sun.security.x509.AlgorithmId.class);
            //client.getKryo().register(sun.security.util.ObjectIdentifier.class);
            client.getKryo().register(byte[].class);
            client.getKryo().register(java.math.BigInteger.class);


        }

        @Override
        protected void onProgressUpdate(Void... values) {}
    }

    @Override
    public void onClick(View v) {

        if (v == send){

            String temp = "";
            temp = et.getText().toString();
            if (!temp.equals("")){

                ChatPacket c = new ChatPacket();
                c.userName = "user3";
                c.targetUserName = targetUserName;

                PublicKeyPacket pkp = new PublicKeyPacket();
                StringBuilder stringBuilder = new StringBuilder();
                stringBuilder.append(((RSAPublicKeyImpl) publicKey).getModulus().toString());
                stringBuilder.append("|");
                stringBuilder.append(((RSAPublicKeyImpl) publicKey).getPublicExponent().toString());
                String serPK = stringBuilder.toString();
                pkp.publicKey = serPK;
                pkp.userName = "user3";
                pkp.targetUserName = targetUserName;
                client.sendTCP(pkp);

                /*try {
                    c.message = encryptData(temp);
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }*/
                client.sendTCP(c);
            }

        }

    }
}

最佳答案

导入 sun.security.rsa.RSAPublicKeyImpl;

这显然是无稽之谈。 Android上没有这样的类;这意味着你不能使用它。 Oracle(以前是 Sun)Java 中可能有这样的类,但您的代码不应该显式引用它。

关于java - Android NoClassDefFoundError - RSA 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24825439/

相关文章:

java - 如何使用 Java 8 流平面映射多个元素?

java - Android java insert to sql-server datatype(从字符串转换为uniqueidentifier时转换失败)

sql - 在sql server中获取加密列名称及其加密 key 和证书

java - 如何在 PIG 中获取当前时间戳

java - 如何在 JavaFX 中使用 ObservableMap<KeyObject, ObservableList<CustomObject>> 填充 TableView

java - Android 标签组引用

android - 删除页面并将其添加到 FragmentPagerAdapter

android - addOnScrollListener 的 RecyclerView onScrolled 方法只调用一次

Java SSL 内存分配过多

encryption - 如何计算位串的近似熵?