Java Android NoClassDefFoundError-RSA加密
我正在做一个概念项目 我有一个服务器和客户端,它们都是用Kryonet TCP/UDP库实现的。它在我的计算机上与纯Java一样工作良好,但是当我尝试在Android上执行一些代码时,它给出了以下结果 LogCat输出:Java Android NoClassDefFoundError-RSA加密,java,android,encryption,rsa,noclassdeffounderror,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.kryoan
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)
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);
}
}
}
}
我在我的项目中包括了JRE系统库,但没有任何变化
以下是客户端代码:
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)
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);
}
}
}
}
package com.example.kryoandrochat;
导入java.io.IOException;
导入java.security.KeyPair;
导入java.security.KeyPairGenerator;
导入java.security.PrivateKey;
导入java.security.PublicKey;
导入sun.security.rsa.RSAPublicKeyImpl;
导入android.app.Activity;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.view.view;
导入android.view.view.OnClickListener;
导入android.widget.Button;
导入android.widget.EditText;
导入android.widget.TextView;
导入com.esotericsoftware.kryonet.Client;
导入com.esotericsoftware.kryonet.Connection;
导入com.esotericsoftware.kryonet.Listener;
公共类MainActivity扩展活动实现OnClickListener{
私人客户;
私家图文电视;
私人编辑;
私人按钮发送;
私钥公钥,targetsPublicKey;
私有字符串targetUserName;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv=(TextView)findViewById(R.id.chatTextView);
et=(EditText)findViewById(R.id.chatField);
send=(按钮)findviewbyd(R.id.send);
send.setOnClickListener(this);
client=新客户端();
新建NetworkTask()。执行(“”);
client.addListener(新侦听器(){
接收到公共void(连接、对象){
if(ClientConnectedPacket的对象实例){
ClientConnectedPacket ccp=(ClientConnectedPacket)对象;
tv.setText(ccp.userName+“现在联机。\n”);
PublicKeyPacket pkp=新的PublicKeyPacket();
StringBuilder StringBuilder=新的StringBuilder();
追加((RSAPublicKeyImpl)publicKey.getmodule().toString());
stringBuilder.append(“|”);
追加((RSAPublicKeyImpl)publicKey.getPublicExponent().toString());
字符串serPK=stringBuilder.toString();
pkp.publicKey=serPK;
pkp.targetUserName=targetUserName;
client.sendTCP(pkp);
}
}
});
}
私有类NetworkTask扩展了AsyncTask{
@凌驾
受保护的字符串doInBackground(字符串…参数){
试一试{
client.connect(10000,“myHostIP”,279608008);
新线程(client.start();
}捕获(IOE异常){
e、 printStackTrace();
System.out.println(“Baglanamadik”);
}
新线程(client.start();
返回“已连接”;
}
@凌驾
受保护的void onPostExecute(字符串结果){
tv.setText(“我们已连接”);
}
@凌驾
受保护的void onPreExecute(){
client.getKryo().register(chatpack.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(字节[].class);
client.getKryo().register(java.math.biginger.class);
}
@凌驾
受保护的void onProgressUpdate(void…值){}
}
@凌驾
公共void onClick(视图v){
如果(v==发送){
字符串temp=“”;
temp=et.getText().toString();
如果(!temp.equals(“”){
chatpack c=新chatpack();
c、 userName=“user3”;
c、 targetUserName=targetUserName;
PublicKeyPacket pkp=新的PublicKeyPacket();
StringBuilder StringBuilder=新的StringBuilder();
追加((RSAPublicKeyImpl)publicKey.getmodule().toString());
stringBuilder.append(“|”);
追加((RSAPublicKeyImpl)publicKey.getPublicExponent().toString());
字符串serPK=stringBuilder.toString();
pkp.publicKey=serPK;
pkp.userName=“user3”;
pkp.targetUserName=targetUserName;
client.sendTCP(pkp);
/*试一试{
c、 消息=加密数据(临时);
}捕获(IOE1异常){
//TODO自动生成的捕捉块
e1.printStackTrace();
}*/
client.sendTCP(c);
}
}
}
}
右键单击项目,选择生成路径>配置生成路径,选中库的选项。导入sun.security.rsa.RSAPublicKeyImpl代码>
这显然是荒谬的。Android上没有这样的类;这意味着你不能使用它。Oracle(以前的Sun)Jav中可能有这样一个类