2013-05-20 289 views
3

有誰知道如何使用RSA公鑰和私鑰加密和解密字符串對象?java使用密鑰對進行加密和解密?

我已經使用KeyPair生成器在下面創建了私鑰和公鑰,但是我現在想要使用公鑰來加密數據,並使用私鑰來解密它。

public class Keys { 

    private static KeyPairGenerator generator; 

    private static KeyPair keyPair; 

    private static PrivateKey mPrivateKey; 

    private static PublicKey mPublicKey; 

    private static SecureRandom secureRandom; 

    private static final String SHA1PRNG = "SHA1PRNG"; 

    public static final String RSA = "RSA"; 

    private Keys() throws NoSuchAlgorithmException { 
     generator = KeyPairGenerator.getInstance("RSA"); 
    } 

    /** 
    * Generate private and public key pairs 
    * 
    * @throws NoSuchAlgorithmException 
    */ 
    private static void generateKeyPair() throws NoSuchAlgorithmException { 
     // create SecureRandom object used to generate key pairs 

     secureRandom = SecureRandom.getInstance(SHA1PRNG); 

     // initialise generator 
     generator = KeyPairGenerator.getInstance(RSA); 
     generator.initialize(1024, secureRandom); 

     // generate keypair using generator 
     keyPair = generator.generateKeyPair(); 

     // asssign private and public keys 
     setPrivateKey(keyPair.getPrivate()); 
     setPublicKey(keyPair.getPublic()); 

    } 

    /** 
    * Get private key from key generated 
    * @return 
    * @throws NoSuchAlgorithmException 
    */ 
    public static PrivateKey getPrivateKey() throws NoSuchAlgorithmException { 

     if (mPrivateKey == null) { 
      generateKeyPair(); 
     } 
     return mPrivateKey; 
    } 

    private static void setPrivateKey(PrivateKey privateKey) { 
     mPrivateKey = privateKey; 
    } 

    /** 
    * Get public key from key pair generated 
    * 
    * @return 
    * @throws NoSuchAlgorithmException 
    */ 
    public PublicKey getPublicKey() throws NoSuchAlgorithmException { 
     if (mPublicKey == null) { 
      generateKeyPair(); 
     } 
     return mPublicKey; 
    } 

    private static void setPublicKey(PublicKey publicKey) { 
     mPublicKey = publicKey; 
    } 

這是可能的還是加密必須共享和使用相同的密鑰?

主要目的是這樣的。

我將有兩個客戶端可以發送和接收加密數據給彼此。

客戶端A收到的加密數據:

爲客戶A的公鑰客戶端B的請求。 客戶端B加密字符串並將其發送到客戶端A. 客戶端A接收到此加密的字符串,然後使用其自己的私鑰對其進行解密。

反之亦然,如果客戶B希望收到加密數據。

+1

密鑰生成代碼有什麼問題嗎?如果不是,那麼它可能會從問題中刪除。 –

回答

4

RSA加密只能用於加密小於密鑰模數的數據。即一個2048位的RSA公鑰只能加密256個字節的數據。填充字節需要這些數據中的一部分,因此通常只剩一個空間可供使用。

通常這是用混合加密方案解決的。也就是說,數據本身是使用臨時對稱會話密鑰加密的,然後使用接收者的公鑰對會話密鑰進行加密。加密的數據和加密的會話密鑰都被髮送給收件人。

你不妨考慮一下OpenPGP,它實現了這個行爲(以及更多)。 BouncyCastle是Java的OpenPGP實現。

+0

umm是爲什麼RSA通常只是用來加密像密碼字段這樣的小數據? – jonney

+0

@jonney是的。如果您的數據總是很小,那麼您可以直接使用RSA公鑰對其進行加密。否則,您需要採用不同的方案(如上所述)。 –

+0

不錯,謝謝。 – jonney

相關問題