[問題] RSA加密結果與Java不同

作者: cercloud (heavysupport)   2021-08-11 16:58:34
有一個案例是為了與客戶的API對接
對方有提供範例檔,不過是使用java寫的
在RSA加密的部分程式碼像這樣:
public byte[] rsaPrivateCipher(int opmode, byte[] PrivateKey, byte[] text,
String padding) {
byte[] bResult = null;
Cipher cipher = null;
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(PrivateKey);
KeyFactory keyFactory;
try {
keyFactory = KeyFactory.getInstance("RSA");
Key aKey = keyFactory.generatePrivate(keySpec);
cipher = Cipher.getInstance(padding);
cipher.init(opmode, aKey);
bResult = cipher.doFinal(text);
} catch (NoSuchAlgorithmException | InvalidKeySpecException |
NoSuchPaddingException | InvalidKeyException
| IllegalBlockSizeException | BadPaddingException e) {
e.printStackTrace();
}
return bResult;
}
同樣的內容,每次加密出來的密文都會一樣
但是使用C#的RSACryptoServiceProvider,呼叫Encrypt方法出來的密文卻是隨機的
金鑰是同一把,使用CspParameters從金鑰容器中取出再傳入RSACryptoServiceProvider
但若是使用SignData的話又可以算出同樣的RSA簽章
由於回傳隨機密文對方沒辦法驗證
只好裝IKVM的套件來還原對方的範例,讓密文是一致的
想請問為何同樣都是RSA加密,輸出的結果卻是兩種不一樣的結果?
有沒有辦法能讓C#的密文也是每次都一樣呢?
作者: ssccg (23)   2021-08-11 17:40:00
padding模式是什麼?每次會不一樣應該是用到OAEP padding
作者: kobe8112 (小B)   2021-08-12 16:03:00
有先在內部確定傳進來的明文byte[]都一致嗎?
作者: cercloud (heavysupport)   2021-08-14 18:32:00
有,每次都是同一份明文
作者: t64141 (榕樹)   2021-08-17 02:17:00
對方是要加密(encrypt)還是簽章 (sign) ?
作者: ssccg (23)   2021-08-17 11:37:00
Pkcs1也是隨機padding,如果對方期待的是密文都是一致的那他們應該用的是RSA/ECB/NoPadding另外你貼的這段是解密的程式碼,不是加密的
作者: Litfal (Litfal)   2021-08-18 11:04:00
樓上高手。我之前是用ECB,跨平台簡單方便但安全性堪慮
作者: ssccg (23)   2021-08-20 21:51:00
RSA只有ECB是因為從安全或效能來說都不建議直接用RSA對資料加密,而是用來加密對稱式加密演算法的金鑰,長度一定不會超過RSA的一個block資料簡單就用RSA直接加密其實就是太懶了
作者: Litfal (Litfal)   2021-08-23 09:15:00
那時是在刻自製加密通訊,rsa用在交握階段交換金鑰,通訊主體用的是aes。

Links booklink

Contact Us: admin [ a t ] ucptt.com