2012-05-15 26 views
0

我使用字符串實現了客戶端和服務器之間的通信。我得到的問題是將所描述的字節數組轉換爲字符串,因爲我無法將其轉換回服務器端的原始內容。數據類型轉換時的Java加密問題

KeyPairGenerator keyGen; 
keyGen = KeyPairGenerator.getInstance("RSA"); 
keyGen.initialize(1024); 
KeyPair key = keyGen.generateKeyPair(); 

String publicKeyPath = new String("publicKeys.txt"); 
publickey = key.getPublic() 
byte[] pubEncoded = key.getPublic().getEncoded(); 
FileOutputStream fout = new FileOutputStream(publicKeyPath); 
fout.write(pubEncoded); 
fout.flush(); 
fout.close(); 

String privateKeyPath = new String("privateKeys.txt"); 
byte[] privEncoded = key.getPrivate().getEncoded(); 
fout = new FileOutputStream(privateKeyPath); 
fout.write(privEncoded); 
fout.flush(); 
fout.close(); 

cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 

而且在客戶端的每個方法:

cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
cipher.init(Cipher.ENCRYPT_MODE, publickey); 
byte[] cipherText = cipher.doFinal(str.getBytes()); 
port.callX(chiperText.toString()); 

在服務器端:

cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
cipher.init(Cipher.DECRYPT_MODE, privateKey); 
byte[] newPlainText = cipher.doFinal(arg.getBytes()); 

這給出了填充問題

「的數據必須以零開始」只有一個KeyPair生成,用於調試,我試圖對同一個函數進行加密和解碼,並且問題依賴於從byte []轉換爲String。

我真的不想改變參數傳遞給其他類型,因爲操作是自動生成的,所有代碼都是字符串。我已經嘗試了不同的「UTF-8」和「UTF-16Le」,但沒有任何作品:S

任何想法?

+0

你爲什麼在整個地方調用String(String)構造函數,出於興趣? –

+0

沒有特別的理由......你可以把它改成String path =「XX」這個問題與文件路徑無關。它存儲的密鑰很好 – d0pe

+0

當然 - 這只是奇怪的代碼,就是這樣。 –

回答

0

使用不對稱密鑰直接加密數據不是一個好主意,它不起作用。 RSA密鑰不能加密大於其密鑰長度的數據。所以,正確的做法是生成一個對稱密鑰並用對稱密鑰對數據進行加密,然後使用非對稱密鑰對對稱密鑰進行加密。所以,您需要將加密數據和加密密鑰都發送給對方。

如果試圖用非對稱密鑰直接對數據進行加密,那麼byte []可能不包含正確的數據,或者它可能根本不包含任何內容。如果您的數據大於密鑰長度,則會發生這種情況。對於密鑰長度較小的數據,它可以正常工作,但數據量較大。

+0

它需要使用不對稱密鑰,這是要求之一。 事情是,我設法將它們從字節轉換爲字符串並恢復正常,但現在使用「ISO-8859-1」,問題是我無法通過webservices傳遞它,因爲它包含非法字符:( – d0pe