2016-08-21 8 views
2

Я пишу приложение для платформы Android, которая использует криптографию. Это безопасный чат, клиент-> сервер-> клиент с различными ключами hellman. Клиенты - телефоны Android, и сервер работает на моем ПК. Я пытаюсь отправить открытый ключ с помощью сокетов, но я получаю эту ошибку:Java/Android Bouncy castle ClassNotFoundException

Server Up and Running 
Bouncy Castle provider is available 
Aug 21, 2016 4:47:03 PM Connection run 
SEVERE: null 
java.lang.ClassNotFoundException: com.android.org.bouncycastle.jcajce.provider.asymmetric.dh.BCDHPublicKey 
at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Class.java:348) 
at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:626) 
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1613) 
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371) 
at Connection.run(Connection.java:124) 

Как вы можете видеть Надувной замок провайдера доступно. Вот мой код с проблемой:

Сервер:

if (Security.getProvider("BC") == null){ 
     System.out.println("Bouncy Castle provider is NOT available"); 
} 
else{ 
    System.out.println("Bouncy Castle provider is available"); 
    } 

try { 
    pubkey = (PublicKey) instream.readObject(); 
}catch (IOException ex) {} 

Android:

PublicKey pubkey; 
kp23 = genDHKeyPair(); 
pubkey= kp23.getPublic(); 
//System.out.println(pubkey); 
outstream.writeObject(pubkey); 
outstream.flush(); 
+0

Андроид VM - это * не * a Java VM. Вы не можете десериализовать объекты между ними, они несовместимы. –

ответ

0

Версия BouncyCastle доступна на Android OS является very limited и, видимо, does't включают com.android.org.bouncycastle.jcajce.provider.asymmetric.dh.BCDHPublicKey ,

Если вам нужна полная функциональность BouncyCastle, вам необходимо включить версию, которая была переупакована с Android в виду, которая является поставщиком криптографии SpongyCastle.

Для получения дополнительных пояснений следуйте this link.

+0

Я добавляю Spongy Castle, но у меня все еще была такая же проблема – DeviLFisH

0

ClassNotFoundException выбрано потому, что пакет com.android.org.bouncycastle.jcajce.provider.asymmetric.dh.BCDHPublicKey недоступен в java-версии BouncyCastle, который включает эквивалент org.bouncycastle.jcajce.provider.asymmetric.dh.BCDHPublicKey.

Предлагаю вам создать новый класс со следующими свойствами на и Сервер и клиентские приложения.

import java.io.Serializable; 

public class PublicKeyProperties implements Serializable { 
    private static final long serialVersionUID = 1L; 
    public byte[] Encoded; 
    public String Format; 
    public String Algorithm; 
} 

стороне клиента

Проходят соответствующие свойства PublicKey «s на новый экземпляр класса PublicKeyProperties, сериализовать и отправить его на сервер.

PublicKeyProperties prop = new PublicKeyProperties(); 
prop.Format = pubkey.getFormat(); 
prop.Algorithm = pubkey.getAlgorithm(); 
prop.Encoded = pubkey.getEncoded(); 
outstream.writeObject(prop); 


стороне сервера

Deserialize его и создать новый экземпляр PublicKey следующим образом.

PublicKeyProperties prop = (PublicKeyProperties) instream.readObject(); 

pubkey = new PublicKey() { 

       @Override 
       public String getAlgorithm() { 
        return prop.Algorithm; 
       } 

       @Override 
       public String getFormat() { 
        return prop.Format; 
       } 

       @Override 
       public byte[] getEncoded() { 
        return prop.Encoded; 
       } 
      }; 

Надеюсь, что это поможет.

Смежные вопросы