2017-08-09 79 views
0

我已經在很多stackoverflows後,但仍無法弄清楚我的代碼最新錯誤。從公開密鑰加密rsa android.pem格式

public class KripAsim { 
String hasil; 

public String encrypt(String text) { 
    try { 

     String PUBLIC_KEY="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvCNqSslgCndo8vfNrkXFDLXmst024Oi8D7LEiJFjYBva4kBKKISe8rKp58kCLLHjv90RN+Dy2KWcf0eFkKaqc3zILBI99JhV1z8TFOzmt5dfgW6fD1ucBfsK6pWxK84DddyOqKldwHlReqjuDHT2jLue51vpXaCa12WV5bMnGsfy3vZKnp699YCguqRpTR1MijZ9pz8WqldrR0a/DCaq5YxZ7lvjwuWIodQy3S3XRHAaeaUrFHFFLumzXAGuP447oRYR0p+1qsy8+wOtrsGm8m8bMg+C1XGMblkODtOFHz3wtrRZ5OwzgEm7J7odmSX8mSYBZYLcnUVqIFRsQkZLiwIDAQAB"; 

     byte [] decoded = Base64.decode(PUBLIC_KEY,Base64.NO_WRAP); 
     KeyFactory keyFac = KeyFactory.getInstance("RSA"); 
     PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(decoded); 

     PublicKey pubkey = keyFac.generatePublic(keySpec); 

     Cipher rsa; 
     rsa = Cipher.getInstance("RSA"); 
     rsa.init(Cipher.ENCRYPT_MODE, pubkey); 
     hasil = Base64.encodeToString(rsa.doFinal(text.getBytes("UTF-8")),Base64.NO_WRAP); 
     return hasil; 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return hasil; 

} 
} 

它返回空值。請幫忙。在此先感謝

+0

我從.pem格式獲得了密鑰並刪除了BEGIN和END,就是這樣。 – rebellatrix

+0

它是否打印任何堆棧痕跡? – Ares

回答

0

PublicKey pubkey = keyFac.generatePublic(keySpec);將引發InvalidKeySpecException異常,因爲您應提供X509EncodedKeySpec時錯誤地提供了PKCS8EncodedKeySpec

您還應完全指定Cipher.getInstance()方法中的轉換字符串。以下代碼片段說明了這一點:

byte[] decoded = Base64.decode(PUBLIC_KEY, Base64.DEFAULT); 
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(decoded); 

PublicKey pubkey = KeyFactory.getInstance("RSA").generatePublic(keySpec); 
Cipher rsa = Cipher.getInstance("RSA/ECB/OAEPwithSHA-256andMGF1Padding"); 
rsa.init(Cipher.ENCRYPT_MODE, pubkey); 
String hasil = Base64.encodeToString(rsa.doFinal(text.getBytes("UTF-8")), 
            Base64.NO_WRAP); 
return hasil; 

最後,您應該避免直接使用RSA加密數據。正確的方法是使用hybrid encryption方案,其中數據使用分組密碼進行加密,例如GCM模式下的AES,使用隨機生成的AES密鑰進行加密,然後使用RSA對此密鑰進行加密。有很多這方面的例子供參考。

+0

即時使用php也是如此,所以加密密鑰將被髮送到服務器,然後在那裏解密。你有沒有對填充提出任何建議?我在php中使用open的ssl – rebellatrix

+0

@rebellatrix:這是另一個問題。 –