2015-09-10 56 views
0

我想分發加密郵件,只有我可以加密,但每個人都可以解密。我正在使用以下代碼來執行任務。它的工作原理,但我想知道它是否有任何安全問題?使用RSA私鑰加密郵件是否安全

我知道正常的用法是使用RSA公鑰進行加密和私鑰解密(但我的用例是相反的)。另外我不想在這裏使用java.security.Signature。

用例: 我想通過電子郵件將配置文件從服務器發送到客戶端,而收件人無法以明文形式讀取配置。安裝過程中擁有服務器公鑰的應用程序將能夠在配置文件導入配置目錄後解密該配置文件。

public static final String ALGORITHM = "RSA/ECB/PKCS1Padding"; 

public Cipher createCipher(final int encryptionMode, final Key key) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException { 
    final Cipher cipher = Cipher.getInstance(ALGORITHM); 
    cipher.init(encryptionMode, key); 
    return cipher; 
} 

public byte[] encryptString(final String text, final PrivateKey privateKey) throws GeneralSecurityException, IOException { 
    return createCipher(Cipher.ENCRYPT_MODE, privateKey).doFinal(text.getBytes("UTF-8")); 
} 

public String decryptString(final byte[] msg, final PublicKey publicKey) throws GeneralSecurityException, IOException { 
    final byte[] decrypted = createCipher(Cipher.DECRYPT_MODE, publicKey).doFinal(msg); 
    return new String(decrypted, "UTF-8"); 
} 

// me 
final PrivateKey privateKey = ... read from file ... 
final byte[] msg = encryptString("my-secret-text-that-everybody-can-read-but-only-I-can-generate", privateKey); 

// other person 
final PublicKey publicKey = ... read from file ... 
final String text = decryptString(msg, publicKey)); 
+2

*「我也不想在這裏使用java.security.Signature」*爲什麼?這就是你應該在這裏使用,如果你想簽署的東西。這就是你在這裏做的不是嗎? –

+2

你想使用*數字簽名*,但你不想使用這個類,爲什麼? – meskobalazs

+0

因爲我從我的服務器發送配置文件到我的應用程序,我不希望普通用戶以明文形式閱讀它或能夠修改它。 – k1r0

回答

1

感謝@Maarten Bodewes對他的評論,回答我的問題。

我投票關閉這一問題作爲題外話,因爲雖然 問題包含代碼這真的是一個概念上的問題有關 加密,它已被問過 - 馬騰Bodewes

從他提供的link中,我的問題的答案是:「不,您通常不能交換公鑰和私鑰。」

它通過在公開指數中使用小質數來簡單地危害RSA的安全性。這裏是詳細的答案:

你的公鑰由一個公共指數和一個模數組成。對於進行加密的人員應該知道模數。指數 - 一般來說 - 是一個相對較小的素數,如3或65537 (費馬的第四個數字)。所以給定所有攻擊者的模數 做的就是猜測公鑰。這是非常容易的因素很小 指數(我已經編寫軟件生成公鑰給予 私鑰)。另一方面,私鑰的指數 由大約與模數一樣大的數字組成。它不能 易於分解; RSA的安全性依賴於這個事實。