![](/img/trans.png)
[英]Data not received in c server while using executor service from a java client
[英]Using a public key in received from a C server in a Java client
我在Java客戶端中使用公鑰時遇到一些奇怪的問題。 我從C服務器獲得了公用密鑰,並且我知道以下內容:B64Encoded,X.509 RSA密鑰,我應該使用PKCS1Padding。 到目前為止,我已完成以下操作以確保客戶端和服務器之間傳輸的數據正確:
1)服務器發送的數據內容和長度與java客戶端相同
2)經過B64解碼后,數據和長度相同
3)我還驗證了C客戶端和Java客戶端之間的數據相同,直到我開始根據解碼后的數據創建公鑰。
我遇到了一個問題,即Cipher加密密碼后,Java客戶端向服務器發送了太多數據。 我嘗試使用不同的方法來創建公鑰對象,但是似乎沒有任何效果。 我要么收到一個“ 錯誤的解析錯誤,而不是一個序列錯誤”,要么創建了密鑰,最終我發送了太多字節的數據(Java 139與C客戶端128)。 這是代碼(刪除了一些不相關的內容)。 一切都分解為單個嘗試/捕獲,因為我試圖指出問題所在:
byte[] pk = getKeyFromServer(); // 191 bytes
String keyString = new String(pk);
byte[] decoded = decode(keyString); // 139 bytes
try {
keySpec = new X509EncodedKeySpec(decoded);
} catch (Exception e) { e.printStackTrace();}
try {
keyFactory = KeyFactory.getInstance("RSA", "IBMJCE");
} catch (Exception e) { e.printStackTrace();}
try {
publicKey = (RSAPublicKey) keyFactory.generatePublic(keySpec);
} catch (Exception e) { e.printStackTrace();}
try {
cipher = Cipher.getInstance("RSA/SSL/PKCS1Padding", "IBMJCE");
} catch (Exception e) { e.printStackTrace(); }
try {
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
} catch (Exception e) { e.printStackTrace(); }
try { sendEncrypted(cipher.doFinal(pwd.getBytes()));
} catch (Exception e) { e.printStackTrace(); }
上面的代碼遇到了我之前提到的異常,如果刪除了KeySpec和KeyFactory部分,然后執行以下操作,則進入了加密部分,但是隨后發送的數據過多,服務器無法對其進行解密(我從挖掘中得到了指數)。
java.math.BigInteger modulus = new java.math.BigInteger(decoded);
java.math.BigInteger exponent = new java.math.BigInteger("22111");
publicKey = new RSAPublicKey(modulus, exponent);
所以我想問題是,我是在做完全錯誤的事情,還是我應該更了解C客戶端對BASE64解碼后的公鑰進行加密,然后嘗試對其進行復制之前的工作? 現在我無法訪問該部分:(
我嘗試使用不同的KeySpec,PublicKeys和padding,但結果始終相同(盡管當我偏離KeySpec基礎時可能會有所不同)。
否則,服務器與客戶端之間的通信將正常工作。 僅此部分使用了不起作用的公鑰。
編輯:只是想添加公共密鑰字符串,如果那告訴什么:
Public key from server:
MIGIAoGBAMZawVoP6mHl0xD3Epn1l4S/6Ke20ZTNLKaXyi425NwhiE7LoTysAcpx
y3i9LXLVNGpdPNtpGD3mvlNJc/HfGQQ7NQpNyKpe5EzsODb1YCbODtfmaRODDW9B
qsrE8DCxI0g8gzu3NJTrUh4NfRaSBn9HaOnBUwiyQyihq2I6MB6bAgJWXw==
您能否嘗試在中間沒有“ / SSL”的情況下嘗試“ RSA / ECB / PKCS1Padding”? 如果我沒有記錯的話,SSL使用特殊的結構。
另外:編碼與X509不兼容! 密鑰的編碼似乎是PKCS#1,而X509圍繞該編碼使用了一個小的包裝!
從PKCS#1:
RSAPublicKey ::= SEQUENCE {
modulus INTEGER, -- n
publicExponent INTEGER -- e
}
從X509EncodedKeySpec:
SubjectPublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier,
subjectPublicKey BIT STRING }
因此,您將必須在要接收的數據之前添加序列標簽,長度,算法標識符以及BIT STRING標簽和長度! 很奇怪您可以讓它做任何事情。
對於此特定的密鑰長度和(奇怪的)兩個字節的公共指數,標頭將由以下字節組成:
(byte) 0x30, (byte) 0x81, (byte) 0x9E, (byte) 0x30, (byte) 0x0D, (byte) 0x06, (byte) 0x09, (byte) 0x2A,
(byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xF7, (byte) 0x0D, (byte) 0x01, (byte) 0x01, (byte) 0x01,
(byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x81, (byte) 0x8C, (byte) 0x00,
另外,您也可以簡單地從結構中檢索兩個整數並從中創建一個RSAPublicKeySpec
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.