2016-08-21 91 views
2

我正在爲使用加密技術的Android平臺編寫應用程序。這是一個安全的聊天,客戶端 - >服務器 - >客戶端與diffie hellman密鑰。 客戶端是Android手機,服務器正在我的電腦上運行。 我試圖發送通過套接字的公鑰,但我得到這個錯誤:Java/Android充氣城堡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) {} 

安卓

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

android虛擬機是*不*是Java虛擬機。你不能在兩者之間反序列化對象,它們不兼容。 –

回答

0

BouncyCastle的可用版本的Android操作系統是very limited,顯然它簡化版,包括com.android.org.bouncycastle.jcajce.provider.asymmetric.dh.BCDHPublicKey

如果您想要完整的BouncyCastle功能,則需要包含與Android重新包裝在一起的版本,即SpongyCastle加密提供程序。

更多解釋請參見this link

+0

我加了Spongy城堡,但我仍然有同樣的問題 – DeviLFisH

0

ClassNotFoundException由於包含org.bouncycastle.jcajce.provider.asymmetric.dh.BCDHPublicKey的BouncyCastle的java版本中不包含com.android.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的相應屬性PublicKeyProperties類的新實例,序列化,並將其發送到服務器。

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


服務器端

反序列化和如下創建一個新的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; 
       } 
      }; 

希望有幫助。