簡體   English   中英

使用從Java客戶端中的C服務器接收到的公鑰

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM