.NET的那种RSA加解密算法能与JAVA的RSA加解密的保持一致?

wmtest050 2012-05-19 01:51:27
.NET的RSA加密

using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Pkcs;
using Org.BouncyCastle.Security;

/// <summary>
/// RSA 私钥加密
/// </summary>
/// <param name="data">数据</param>
/// <param name="key">私钥</param>
/// <returns></returns>
public byte[] RSAEncryptByPrivate(byte[] data, byte[] key)
{
try
{
//java: PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);
//java: KeyFactory keyFactory = KeyFactory.getInstance("RSA");
//java: PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
AsymmetricKeyParameter Privatekey = PrivateKeyFactory.CreateKey(key);

//java: Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
IBufferedCipher c = CipherUtilities.GetCipher("RSA");

//java: cipher.init(Cipher.ENCRYPT_MODE, privateKey);
c.Init(true, Privatekey);

//java: return cipher.doFinal(data);
return c.DoFinal(data);
}
catch
{
return null;
}
}


JAVA的算法

public static byte[] encryptByPrivateKey(byte data[], byte key[])
throws Exception
{
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
java.security.PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(1, privateKey);
return cipher.doFinal(data);
}


这两个RSA加密的方法加密的结果就是不一样.晕死.
参数data的Bse64:
vFI598yiPhn7qhXpJI97aw==
参数key的Base64:
MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAKAAnRDlrJiwi34p
b3neOugwuDcruadpkvW84fJY1rS3U1DM69JoAM+v1UwcMIXSBvtGhUNjZHswFP3P
YXtB5I61fV2zOi7UZ09FS38JVaTt65Ju/uxGqu+oYleiRuR/ehn89mChxo8WUMi3
9NOvkxPdjLKWCMcEpffpR6RFTOqzAgMBAAECgYB2eB3T3gsOv2F5l5qHxKkfNLuh
dgmv0HbU5vbxZyAKjNbus9xEXWeEX6/x+8ldvGYY9V1EyTokEDTqvPtztRVR/Y6G
ptBzycEckuu6oCJoecNMfzvmIueDNf4uI8VYyvntPedQZ6oICXHkrCNeuJ+jZQGm
L8oFeDJmaPdVZUdu2QJBAMu5eEAPC2RVvvSvhAj48sOsRDAH6bMOjxkkT3YIqMBe
O8tcUnPTJlIX7Vr1gGH6Ubgw3gNnbKvGAkVF46UASUcCQQDJDxFR+p2CbwEEnLtk
02T58zgYln2Nd3J5ERfpCMW+qXLrgxgecCtAB+4YzI8KA5RKweb6Jcp+0V/ea4Qy
I8k1AkBpWs0ZM66MgNtz5qC9kyDYmGna/PyaoNjYA7MkM24xrYn2rRPm2jdjFQSm
mXd/M9i3DG6EDCRi4M+jy3Tii7dZAkB8J07FtaEPyyXwyCu7bgI7imIIZN1wvuK0
OcbvApjBTHeHULNTEGbUqlDvhVmKkH1A0I2lyDJLr1SozvGZ2JlFAkAW/BUT9c+E
4RNL5W3yY1oOVpI1bQs/QCiDlZ69xVLUl56D6IOSlr09cpQH6c/hIALTq3P3JFGz
7o5JACVSuryX

.NET加密的结果Base64:
jlSBfsHvjdQ84ufHPMdDUhK6u+jVuLYmLtK5smBk28r+cZ/UQR3elP/GyJidOr8+
PF+Dbg88aHhfX9EqlL2JrQvA3DwjgYZnabKz/wLnWSJfVu5jGsNe/+TLX+QIy3ZW
ubLs8Pm/1uGFjFRWXp7rEV4ikOXwWY4AX0uNdtUdLRk=
JAVA加密的结果Base64:
Gx2KtW8fB7ctK6n3f4Q3VgB+7pZRyY2alpJpIIQTanlvh1dnUXBa6KBNyuq/X1s5
NmfWaIesA/WasL28H1qUoSgrvJK9rVzjvU6O5ayjvUlXrZ7aS6oZhrgHSK4lEqsh
tvv5RVzJwkQQxbqXR4JVfaPUSmWhzfvfb6dkpsccBNc=

为啥就是不一样呢?有什么法子能搞成一致的?.NET使用微软自带的加密更不成,那玩意儿每次结果都不同.
...全文
402 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zheng8498 2014-07-11
  • 打赏
  • 举报
回复
.net加密,java解密 可以正常处理 但是反过来就不行了。 研究中……
crazyxf 2013-05-22
  • 打赏
  • 举报
回复
java也可以选填充方式的,设置这个PKCS#1就能保持和.net 一致了,虽然每次加密结果都不同,但可以互相识别。
crazyxf 2013-05-22
  • 打赏
  • 举报
回复
RSA有多个补齐标准,比如PKCS#1,这个可以与java兼容,OAEP不行。
gomoku 2013-05-22
  • 打赏
  • 举报
回复
引用 5 楼 godgirl 的回复:
.Net为了加强RSA加密算法的安全性,在每次加密的时候都会生成一定的随机数和原始数据一起被加密,这显然不是单纯标准的RSA加密;而Java中的RSA加密是完全标准化的,不添加随机数的
这是错误的结论。 RSA有多个补齐标准,比如PKCS#1和OAEP等,都支持随机扰动。 PKCS#1 v1.5有两种补齐不是随机(T=0和T=1),但不常用。 PKCS#1 v1.5见该帖8楼(http://bbs.csdn.net/topics/390447249)。 详细可阅读:http://en.wikipedia.org/wiki/RSA_(algorithm)
Mike老羊 2013-05-22
  • 打赏
  • 举报
回复
、.Net环境下面对同样一个字符串用相同的RSA公钥加密,居然每次的结果不一样!而Java环境下面则每次的结果是一样的;这点就是我们此次解决互通问题的关键!究其原因是这样的:.Net为了加强RSA加密算法的安全性,在每次加密的时候都会生成一定的随机数和原始数据一起被加密,这显然不是单纯标准的RSA加密;而Java中的RSA加密是完全标准化的,不添加随机数的
wmtest050 2012-05-21
  • 打赏
  • 举报
回复
史上最低价的云计算大会门票抢购火热进行中,每日限量5张,数量有限,先到先得噢!
wmtest050 2012-05-21
  • 打赏
  • 举报
回复
求解.
wmtest050 2012-05-19
  • 打赏
  • 举报
回复
加密的结果是要提交给第三方JAVA服务端

如果是让C#服务端解密,也就不会有此问题了.
tigion 2012-05-19
  • 打赏
  • 举报
回复
rsa每次加密结果都是不一样的 他们采用pkcs1填充方式 这没关系 只要加密后的密文能解密就可以了
具体可以看pkcs1的文档 rfc都有详细的说明

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧