作者cercloud (heavysupport)
看板C_Sharp
标题[问题] RSA加密结果与Java不同
时间Wed Aug 11 16:58:34 2021
有一个案例是为了与客户的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#的密文也是每次都一样呢?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.163.180.56 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1628672318.A.553.html
※ 编辑: cercloud (118.163.180.56 台湾), 08/11/2021 17:00:43
1F:→ ssccg: padding模式是什麽? 08/11 17:40
2F:→ ssccg: 每次会不一样应该是用到OAEP padding 08/11 17:41
模式是RSA/ECB/PKCS1Padding
我用
Encrypt("", RSAEncryptionPadding.Pkcs1)
结果是随机密文
※ 编辑: cercloud (118.163.180.56 台湾), 08/12/2021 12:13:32
3F:→ kobe8112: 有先在内部确定传进来的明文byte[]都一致吗? 08/12 16:03
4F:→ cercloud: 有,每次都是同一份明文 08/14 18:32
5F:→ t64141: 对方是要加密(encrypt)还是签章 (sign) ? 08/17 02:17
6F:→ ssccg: Pkcs1也是随机padding,如果对方期待的是密文都是一致的 08/17 11:37
7F:→ ssccg: 那他们应该用的是RSA/ECB/NoPadding 08/17 11:38
8F:→ ssccg: 另外你贴的这段是解密的程式码,不是加密的 08/17 11:38
9F:→ ssccg: 说真的比较安全的方法是要对方换作法,至於C#的解法 08/17 11:42
10F:→ ssccg: RSACryptoServiceProvider不支援,要用第三方library 08/17 11:42
11F:推 Litfal: 楼上高手。我之前是用ECB,跨平台简单方便但安全性堪虑 08/18 11:04
12F:→ ssccg: RSA只有ECB是因为从安全或效能来说都不建议直接用RSA对资料 08/20 21:51
13F:→ ssccg: 加密,而是用来加密对称式加密演算法的金钥,长度一定不会 08/20 21:52
14F:→ ssccg: 超过RSA的一个block 08/20 21:53
15F:→ ssccg: 资料简单就用RSA直接加密其实就是太懒了 08/20 21:53
16F:推 Litfal: 那时是在刻自制加密通讯,rsa用在交握阶段交换金钥,通讯 08/23 09:15
17F:→ Litfal: 主体用的是aes。 08/23 09:15