[问题] 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